gecode-4.2.1/0000755000175000010010000000000012236131711012056 5ustar schulteNonegecode-4.2.1/changelog.in0000644000175000010010000051562612236130623014355 0ustar schulteNone# # Main authors: # Christian Schulte # # Copyright: # Christian Schulte, 2005 # # Last modified: # $Date: 2013-11-05 09:51:31 +0100 (Tue, 05 Nov 2013) $ by $Author: schulte $ # $Revision: 14055 $ # # This file is part of Gecode, the generic constraint # development environment: # http://www.gecode.org # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # # This file contains entries for changelogs # # There are two kinds of entries: one marking releases and the others # being actual entries. # # All the lines for describing entries must start at the beginning. # # A release is described as follows: # [RELEASE] # Version: # Date: # [DESCRIPTION] # ... All the text up to the next [ENTRY] is included # as description # # An entry is described as follows: # [ENTRY] # Module: # kernel|search|int|set|cpltset|example|minimodel|iter|support| # scheduling|driver|test|gist|flatzinc|other # What: bug|documentation|performance|new|removed|change # Rank: minor|major # Bug: # Thanks: # [DESCRIPTION] # ... All the text up to the next [ENTRY] or [RELEASE] is included # as description # [MORE] # ... If a more section is included, then it will be displayed as an # optional section in the html page. # [RELEASE] Version: 4.2.1 Date: 2013-11-05 [DESCRIPTION] This release fixes several major bugs and adds some minor improvements. [ENTRY] Module: other What: change Rank: minor [DESCRIPTION] Compiles with MSVC 2013. [ENTRY] Module: search What: bug Rank: major Thanks: Roberto Castañeda Lozano [DESCRIPTION] Fix for restart-based search when the master does not have a branching. [ENTRY] Module: search What: bug Rank: major Thanks: Roberto Castañeda Lozano [DESCRIPTION] Restart-based search did not work when the cutoff limit did not strictly increase. [ENTRY] Module: search What: new Rank: minor Thanks: Roberto Castañeda Lozano [DESCRIPTION] Added support for a repeat cutoff generator. [ENTRY] Module: int What: performance Rank: minor Thanks: Anne Meyer [DESCRIPTION] Fix performance of domain consistent element for the case that the result variable is assigned. [ENTRY] Module: int What: bug Rank: major Thanks: Bauke Conijn [DESCRIPTION] Fixed incorrect propagation in sortedness with permutation variables. [ENTRY] Module: int What: bug Rank: major Thanks: Duane Leslie [DESCRIPTION] Fixed cumulative constraint for 0-usage tasks. [ENTRY] Module: int What: bug Rank: major Thanks: Duane Leslie [DESCRIPTION] Fixed special case check for cumulative that would wrongly classify some instances as disjunctive. [ENTRY] Module: int What: bug Rank: major Thanks: Kish Shen [DESCRIPTION] The nroot constraint now propagates correctly for negative numbers when the exponent is odd. [ENTRY] Module: other What: bug Rank: minor [DESCRIPTION] Fix CMake to also build FlatZinc and Driver correctly. [ENTRY] Module: flatzinc What: bug Rank: minor [DESCRIPTION] Fixed bug in auxiliary variable branching. [ENTRY] Module: minimodel What: new Rank: minor Thanks: Philippe Kezirian [DESCRIPTION] The sum of IntArgs can now be computed similarly to the sum of IntVarArgs. [ENTRY] Module: kernel What: new Rank: minor Thanks: Kish Shen [DESCRIPTION] Activity information can now be initialized with a branch merit function. [ENTRY] Module: int What: new Rank: minor Thanks: Kish Shen [DESCRIPTION] Activity information can now be initialized with a branch merit function. [ENTRY] Module: set What: new Rank: minor Thanks: Kish Shen [DESCRIPTION] Activity information can now be initialized with a branch merit function. [ENTRY] Module: float What: new Rank: minor Thanks: Kish Shen [DESCRIPTION] Activity information can now be initialized with a branch merit function. [RELEASE] Version: 4.2.0 Date: 2013-07-19 [DESCRIPTION] This release adds no-goods from restarts, removes memory statistics (but Gecode can be configured for more accurate statistics), and fixes a number of bugs. [ENTRY] Module: iter What: bug Rank: minor Thanks: Farshid Hassani Bijarbooneh, Joseph Scott [DESCRIPTION] Fixed segfault in NaryUnion iterator. [ENTRY] Module: kernel What: new Rank: minor [DESCRIPTION] Added configure switch --enable-peakheap that adds support for memory statistics to the kernel. This comes with a runtime overhead, but provides more accurate information than the previous search engine based statistics. [ENTRY] Module: search What: removed Rank: major [DESCRIPTION] Removed memory statistics from the search engines. The reason is that the figures were too inaccurate (memory for shared data structure, caches, etc were not counted) and computing the figures was complicated. This feature is replaced by a configure switch that enables peak memory tracking based on operating system information. [ENTRY] Module: kernel What: change Rank: minor Thanks: Kish Shen [DESCRIPTION] Low-level support for AFC is now public. [ENTRY] Module: search What: new Rank: minor [DESCRIPTION] Search options have an additional field nogoods_limit that defines too which depth a search tree is inspected for no-goods. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] The master() member function used during restart-based search now takes an additional no-goods argument. The default master() function posts no-goods (only effective when enabled in Search::Options). See MPG for details. [ENTRY] Module: driver What: new Rank: minor [DESCRIPTION] When using restart-based search, the use of no-goods from restarts can be switched on/off with the -nogoods command line option and the depth limit for extraction of no-goods with the -nogoods-limit command line option. [ENTRY] Module: search What: new Rank: major [DESCRIPTION] Added support for no-goods from restarts, see Modeling and Programming with Gecode for details. Note that also entails that the statistics will report different a different peak depth than in previous releases of Gecode when using no-goods. [ENTRY] Module: flatzinc What: new Rank: minor [DESCRIPTION] Added support for value_precede_int and value_precede_set constraints. [ENTRY] Module: flatzinc What: bug Rank: major Thanks: Chris Mears [DESCRIPTION] Fixed a memory leak in FlatZincSpace and a few more in the FlatZinc parser. [ENTRY] Module: flatzinc What: bug Rank: minor Thanks: Chris Mears [DESCRIPTION] Fixed a bug in implicit search heuristic that could lead to a segmentation fault when minimizing an array element. [ENTRY] Module: other What: bug Rank: minor Thanks: Victor Zverovich [DESCRIPTION] Fixes link error for CMake with MSVC. [RELEASE] Version: 4.1.0 Date: 2013-07-01 [DESCRIPTION] This release adds a really useful feature and the required infrastructure to Gist (it now can show information on the alternatives in a search tree), has some new features, and fixes quite a number of bugs (some of which are quite serious, in particular for: LDSB, restart-based search, and FlatZinc). [ENTRY] Module: driver What: bug Rank: minor Thanks: Vincent Barichard [DESCRIPTION] Fixed a race condition when using parallel search. [ENTRY] Module: set What: bug Rank: minor [DESCRIPTION] Fixed SET_VAR_ACTIVITY_SIZE_MIN/MAX, which used to compute size/activity instead of activity/size. [ENTRY] Module: kernel What: performance Rank: minor [DESCRIPTION] Implement the AFC search heuristic using FastMutex, which greatly improves parallel search performance on Mac OS X when using AFC. [ENTRY] Module: support What: new Rank: minor [DESCRIPTION] Added FastMutex class that is implemented using spin locks on some platforms. [ENTRY] Module: int What: bug Rank: minor Thanks: Victor Zverovich [DESCRIPTION] Fixed INT_VALUES_MAX() branching (INT_VALUES_MIN() was used instead). [ENTRY] Module: float What: bug Rank: minor [DESCRIPTION] Fixed FLOAT_VAR_ACTIVITY_SIZE_MIN/MAX, which used to compute size/activity instead of activity/size. [ENTRY] Module: example What: new Rank: minor Thanks: Stefano Gualandi [DESCRIPTION] Added LDSB-based symmetry breaking to graph coloring example. [ENTRY] Module: flatzinc What: bug Rank: minor Thanks: Peter Nightingale [DESCRIPTION] Fixed printing of float variables to be compatible with MiniZinc output. [ENTRY] Module: flatzinc What: bug Rank: minor Thanks: Peter Nightingale [DESCRIPTION] Fixed a segmentation fault when using FlatZinc with float variables that have initializers. [ENTRY] Module: set What: bug Rank: major Thanks: Stefano Gualandi [DESCRIPTION] Fixed crash due to combination of LDSB and Activity. [ENTRY] Module: int What: bug Rank: major Thanks: Stefano Gualandi [DESCRIPTION] Fixed crash due to combination of LDSB and Activity. [ENTRY] Module: int What: bug Rank: major [DESCRIPTION] The internal representation of integer variable domains could leak memory to the space. [ENTRY] Module: flatzinc What: new Rank: major [DESCRIPTION] The FlatZinc interpreter now supports float variables as objective functions. [ENTRY] Module: gist What: new Rank: major [DESCRIPTION] Gist now can show information on the alternatives in a search tree, using the new menu options "Label branches" and "Label path". [ENTRY] Module: float What: bug Rank: minor [DESCRIPTION] Random value selection for float branchings was not declared with the right types. [ENTRY] Module: set What: new Rank: major [DESCRIPTION] Set branchings now take an optional argument for a user-defined print function. See MPG for details. [ENTRY] Module: float What: new Rank: major [DESCRIPTION] Float branchings now take an optional argument for a user-defined print function. See MPG for details. [ENTRY] Module: int What: new Rank: major [DESCRIPTION] Integer and Boolean branchings now take an optional argument for a user-defined print function. See MPG for details. [ENTRY] Module: kernel What: new Rank: major [DESCRIPTION] Branchers now support a print() member function. [ENTRY] Module: flatzinc What: new Rank: minor [DESCRIPTION] Added {int,bool,set,float}_default_search annotations. These can be used on solve items to declare the default search strategy for the respective variable types. [ENTRY] Module: minimodel What: bug Rank: minor Thanks: Roberto Castañeda Lozano [DESCRIPTION] Boolean expressions could lead to a segfault when initialized with default constructor. [ENTRY] Module: kernel What: new Rank: minor [DESCRIPTION] Both AFC and Activity can be changed by a set() function. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added if-then-else constraint (called ite) for integer variables. [ENTRY] Module: driver What: new Rank: minor Thanks: Pascal Francq [DESCRIPTION] Added classes FloatMinimizeScript and FloatMaximizeScript for cost-based optimization with a float cost variable. [ENTRY] Module: driver What: change Rank: minor [DESCRIPTION] Added classes IntMinimizeScript and IntMaximizeScript for cost-based optimization with an integer cost variable. While the classes MinimizeScript and MaximizeSpcript are still available, there use is deprecated and a later release might remove them. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] Added classes IntMinimizeSpace and IntMaximizeSpace for cost-based optimization with an integer cost variable. While the classes MinimizeSpace and MaximizeSpace are still available, there use is deprecated and a later release might remove them. [ENTRY] Module: float What: new Rank: minor Thanks: Pascal Francq [DESCRIPTION] Added classes FloatMinimizeSpace and FloatMaximizeSpace for cost-based optimization with a float cost variable. [ENTRY] Module: flatzinc What: bug Rank: minor [DESCRIPTION] Fixed the random search strategies to all use the same random number generator instead of different generators all initialised with the same seed (and therefore all producing the same sequences). [ENTRY] Module: flatzinc What: new Rank: minor Thanks: Tias Guns [DESCRIPTION] Added int2float constraint which was missing in the FlatZinc interpreter. [ENTRY] Module: int What: bug Rank: minor Thanks: David Rijsman [DESCRIPTION] Fixed binpacking crash when the b and s arrays are empty. [ENTRY] Module: other What: change Rank: minor Thanks: Cliff Yapp [DESCRIPTION] CMake build system tweaked for out-of-source-dir building. [ENTRY] Module: float What: bug Rank: minor Thanks: Duong Khanh Chuong [DESCRIPTION] Fixed missing propagation in reified rel-constraints. [ENTRY] Module: search What: bug Rank: major Thanks: Chris Mears, Roberto Castañeda Lozano [DESCRIPTION] Fixed a bug in restart-based search, which would crash if the problem is failed at the root or only had a single solution during best-solution search. [RELEASE] Version: 4.0.0 Date: 2013-03-14 [DESCRIPTION] This release adds a multitude of new features, fixes many bugs, and offers a number of performance improvements. There are too many major improvements to even summarize them here all, so here are just some highlights: LDSB as automatic symmetry breaking during search; restart-based search; complete redesign and reimplementation of branching enhancing the expressiveness massively (AFC with decay, activity, user-defined variable and value selection, tie-break control, better randomization, ...); half-reification; addition of floating point constraints. It is recommended to read the new Chapter in MPG on branching as the changes are substantial and require you to change your programs, see also the full list of changes below. As the interfaces has changed, please consult \ref PageHowToChange_4 "How to Change to Gecode 4.0.0". [ENTRY] Module: flatzinc What: change Rank: minor [DESCRIPTION] Renamed the FlatZinc executable to fzn-gecode, to better distinguish it when installed alongside other FlatZinc implementations. [ENTRY] Module: int What: new Rank: major Author: Christopher Mears [DESCRIPTION] Gecode now supports Lightweight Dynamic Symmetry Breaking (LDSB), see MPG for details. [ENTRY] Module: set What: new Rank: major Author: Christopher Mears [DESCRIPTION] Gecode now supports Lightweight Dynamic Symmetry Breaking (LDSB), see MPG for details. [ENTRY] Module: int What: new Rank: major Thanks: Manuel Loth [DESCRIPTION] Added value selection strategies for branching INT_VAL_NEAR_MIN(), INT_VAL_NEAR_MAX(), INT_VAL_NEAR_INC(), and INT_VAL_NEAR_DEC(). They can take a previous assignment to the variables to branch on and try to choose values which are near (see MPG for details). [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added domain constraint that constrains a variable (or an array) according to the domain of another variable. [ENTRY] Module: set What: new Rank: minor [DESCRIPTION] Added domain constraint that constrains a variable (or an array) according to the domain of another variable. [ENTRY] Module: set What: new Rank: minor [DESCRIPTION] Added domain constraints for arrays of set variables. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] The default constrain() function for best-solution search now does by default nothing (it used to throw an exception). [ENTRY] Module: driver What: new Rank: major [DESCRIPTION] Added commandline options to control restart-based search, see MPG for details. [ENTRY] Module: search What: new Rank: major [DESCRIPTION] Added support for restart-based search, see MPG for details. [ENTRY] Module: flatzinc What: new Rank: minor [DESCRIPTION] Added support for more search annotations (defined in gecode.mzn), and for the restart and decay command line options. [ENTRY] Module: other What: new Rank: minor Thanks: Victor Zverovich [DESCRIPTION] Added CMake build script for Gecode (CMakeLists.txt). [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added variants of dom that copy the domain from one variable to another. [ENTRY] Module: driver What: new Rank: minor [DESCRIPTION] Decay values can now be passed on the command line using the switch -decay. [ENTRY] Module: search What: change Rank: major [DESCRIPTION] Variable selection for branching used the quotient of size divided by degree, accumulated failure count, or activity. They now use the inverse. That is, for example, it is not any longer INT_VAR_SIZE_DEGREE_MIN() but INT_VAR_DEGREE_SIZE_MAX() (that is, largest degree divided by size). [MORE] That looks like an annoying change but is in fact essential: the strategies using accumulated failure count and activity now could have run into division by zero issues. And just changing the implementation is not good enough because the values of these measures can now be exposed during tie-breaking. [ENTRY] Module: other What: new Rank: major [DESCRIPTION] Variable selection using AFC now supports decay. Read more in MPG. [ENTRY] Module: int What: performance Rank: major [DESCRIPTION] Arithmetic, linear, and cumulative constraints now resort to internal operations using "long long int" rather than "double". This improves performance but also extends the range over integer coefficients that can be handled by linear constraints. [ENTRY] Module: flatzinc What: bug Rank: minor [DESCRIPTION] The mzn-gecode shell script now passes arguments correctly to the FlatZinc interpreter. [ENTRY] Module: other What: change Rank: minor [DESCRIPTION] Compiles with MSVC 2012. [ENTRY] Module: gist What: change Rank: minor [DESCRIPTION] Updated to compile with Qt version 5.0 (still works with Qt >= 4.3 as well). [ENTRY] Module: int What: bug Rank: minor Thanks: Roberto Castañeda Lozano [DESCRIPTION] Fixed precede constraint with less than two values. [ENTRY] Module: set What: bug Rank: minor Thanks: Roberto Castañeda Lozano [DESCRIPTION] Fixed precede constraint with less than two values. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] The nooverlap constraint now allows sharing of unassigned variables in its argument arrays. [ENTRY] Module: set What: new Rank: major [DESCRIPTION] Added half-reification for reified constraints (see Modeling and Programming with Gecode for details). [ENTRY] Module: int What: new Rank: major [DESCRIPTION] Added half-reification for reified constraints (see Modeling and Programming with Gecode for details). [ENTRY] Module: flatzinc What: bug Rank: minor Thanks: Simon Ekvy [DESCRIPTION] Removed spurious debug output for among constraint. [ENTRY] Module: int What: bug Rank: major Thanks: Lin Yong [DESCRIPTION] Fixed a bug where bounds consistent distinct reported subsumption instead of failure in certain cases. [ENTRY] Module: support What: bug Rank: minor [DESCRIPTION] Fixed a concurrency problem that caused an exception to be thrown at the end of a multi-threaded search on some platforms. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] The coefficients for linear constraints are now divided by their greatest common divisor. That means that some equations can be handled now that previously threw an OutOfLimits exception, and some equations can be handled with the more efficient integer precision propagators that previously required double precision. [ENTRY] Module: kernel What: change Rank: major [DESCRIPTION] The entire infrastructure for variable-value branchers has been reimplemented from scratch. The new design makes a much better compromise between code size, efficiency, and expressiveness: the efficiency is about the same (for examples with no propagation and just branching one can note a slowdown of 2-4%) while code size shrinks drastically (the overall code size for integer variables shrinks by 20%) and the architecture is much more expressive (in particular, it supports tie-break limits, see MPG). [ENTRY] Module: int What: change Rank: minor Thanks: Roberto Castañeda Lozano [DESCRIPTION] Generalized definition of no-overlap propagators for better reuse. [ENTRY] Module: iter What: documentation Rank: minor [DESCRIPTION] Clarified for several iterators that when using the assignment operator both iterators must be allocated from the very same region. [ENTRY] Module: int What: change Rank: major [DESCRIPTION] The interface for branching on integer and Boolean variables has changed considerably (supporting user-defined variable and value selection, tie-break limit functions, handlers to created branchers, and more). In order to change, you have to add () to all variants of INT_VAR, INT_VAL, and INT_ASSIGN. For example, INT_VAR_SIZE_MIN becomes the function call INT_VAR_SIZE_MIN() and INT_VAL_MIN_MIN becomes the function call INT_VAL_MIN_MIN(). Some of these functions expect additional arguments and can take also optional arguments (this replaces the VarBranchOptions and ValBranchOptions). Please read the new "Branching" chapter in MPG. [ENTRY] Module: set What: change Rank: major [DESCRIPTION] The interface for branching on integer and Boolean variables has changed considerably (supporting user-defined variable and value selection, tie-break limit functions, handlers to created branchers, and more). In order to change, you have to add () to all variants of SET_VAR, SET_VAL, and SET_ASSIGN. For example, SET_VAR_SIZE_MIN becomes the function call SET_VAR_SIZE_MIN() and SET_VAL_MIN_INC becomes the function call SET_VAL_MIN_INC(). Some of these functions expect additional arguments and can take also optional arguments (this replaces the VarBranchOptions and ValBranchOptions). Please read the new "Branching" chapter in MPG. [ENTRY] Module: kernel What: new Rank: minor [DESCRIPTION] The random seeds for variable and value branching options can now be initialized from a hardware random number generator (see MPG for details). [ENTRY] Module: search What: change Rank: major [DESCRIPTION] The restart best solution search engine has been removed (it is subsumed by the new restart-based meta search engine RBS). [ENTRY] Module: minimodel What: new Rank: minor [DESCRIPTION] Added pow and nroot expressions for integer variables. [ENTRY] Module: int What: new Rank: major [DESCRIPTION] Added pow and nroot constraints. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed potential rounding issues in sqr and sqrt constraints. [ENTRY] Module: search What: performance Rank: minor [DESCRIPTION] The search engines now do not allocate memory on the search stack for the rightmost branch of each node. This means that the search tree depth is now computed differently. It now represents the actual peak depth required at any one time, taking into account that rightmost branches reuse the stack entry of their parents. [ENTRY] Module: int What: bug Rank: major Thanks: Manuel Baclet [DESCRIPTION] Fixed copying of tuple sets in extensional constraints and IntSets in sequence constraints (could lead to crashes when using parallel search). [ENTRY] Module: support What: bug Rank: minor Thanks: Max Ostrowski [DESCRIPTION] Fixed a bug in the allocation of very large bitsets. [ENTRY] Module: kernel What: performance Rank: major Thanks: Zandra Norman [DESCRIPTION] Fixed a bug in the main memory allocation routine: now heap block sizes are decreased dynamically as they should be. Also changed the memory configuration parameters as explained in: Zandra Norman, Memory Management for Gecode. KTH Royal Institute of Technology, Sweden, Bachelor thesis, TRITA-ICT-EX-2012:143, 2012. [ENTRY] Module: driver What: new Rank: minor Thanks: Andrea Pretto [DESCRIPTION] Added options -file-sol and -file-stat for writing solutions and statistics to arbitrary files and streams. [ENTRY] Module: flatzinc What: bug Rank: minor Thanks: Jean-Noël Monette [DESCRIPTION] Exported registry and helper functions so that users can add constraint handlers to the FlatZinc interpreter. [ENTRY] Module: gist What: new Rank: minor [DESCRIPTION] Added option to invoke move cursors during the automatic search. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] Respect IntConLevel argument for reified linear constraints with a single integer variable. [ENTRY] Module: int What: bug Rank: minor Thanks: Jean-Noël Monette [DESCRIPTION] Added missing propagation for nary min/max constraint. [ENTRY] Module: flatzinc What: new Rank: minor [DESCRIPTION] Added native support for lex_less_bool and lex_lesseq_bool. [ENTRY] Module: int What: bug Rank: minor Thanks: Peter Nightingale [DESCRIPTION] Make extensional constraints work with empty tuple sets. [ENTRY] Module: int What: bug Rank: minor Thanks: Peter Nightingale [DESCRIPTION] Fix count (global cardinality constraint) for multiple occurrences of the same value in the cover array. [ENTRY] Module: flatzinc What: new Rank: major [DESCRIPTION] Gecode/FlatZinc now supports float constraints and variables. [ENTRY] Module: kernel What: new Rank: minor [DESCRIPTION] All ArgArrays now accept STL vectors and input iterators for construction. [ENTRY] Module: flatzinc What: new Rank: major Thanks: Gabriel Hjort Blindell [DESCRIPTION] The FlatZinc interpreter now supports comparing of nodes in Gist. [ENTRY] Module: flatzinc What: change Rank: major [DESCRIPTION] The FlatZinc interpreter no longer performs a complete search on variables annotated as var_is_introduced, but tries to extend a solution on the model variables to a solution that includes the introduced variables. Each solution on the model variables is therefore only reported once. [ENTRY] Module: float What: new Rank: major Author: Vincent Barichard [DESCRIPTION] Added support for float variables. [ENTRY] Module: int What: new Rank: minor Thanks: Kathrin Dannmann, Roberto Castañeda Lozano [DESCRIPTION] The binpacking constraint now also accepts items of size zero. [ENTRY] Module: int What: new Rank: major [DESCRIPTION] Added activity-based branching strategies for integer and Boolean variables: INT_VAR_ACTIVITY_MIN, INT_VAR_ACTIVITY_MAX, INT_VAR_ACTIVITY_SIZE__MIN, INT_VAR_ACTIVITY_SIZE_MAX. For details, see "Modeling and Programming with Gecode". [ENTRY] Module: set What: new Rank: major [DESCRIPTION] Added activity-based branching strategies for set variables: SET_VAR_ACTIVITY_MIN, SET_VAR_ACTIVITY_MAX, SET_VAR_ACTIVITY_SIZE_MIN, SET_VAR_ACTIVITY_SIZE_MAX. For details, see "Modeling and Programming with Gecode". [ENTRY] Module: kernel What: new Rank: major [DESCRIPTION] The kernel now can record the activity of variables. The activity of a variable is defined as how often the domain of a variable has been pruned during search. For details, see "Modeling and Programming with Gecode". [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] New example: Colored matrix without monochromatic rectangles. [ENTRY] Module: driver What: new Rank: minor Thanks: Josef Eisl [DESCRIPTION] The command line -print-last configures whether only the last solution found is printed. [ENTRY] Module: driver What: change Rank: minor [DESCRIPTION] Boolean options (BoolOption) can now be given a false or true argument and hence are in-line with all other option types. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] Throw exception when the user-defined copy constructor of a class that inherits from Space does not call the Space copy constructor. [ENTRY] Module: set What: new Rank: major Author: Denys Duchier [DESCRIPTION] Added channeling constraint between arrays of set variables. [ENTRY] Module: flatzinc What: new Rank: minor [DESCRIPTION] Added native support for the inverse_set constraint. [ENTRY] Module: minimodel What: change Rank: minor [DESCRIPTION] Made implementations of MiniModel expressions private, so that the MiniModel headers do not have to include propagator headers like gecode/int/linear.hh any longer. [RELEASE] Version: 3.7.3 Date: 2012-03-23 [DESCRIPTION] This release fixes some small bugs in the FlatZinc interpreter and library. [ENTRY] Module: flatzinc What: bug Rank: minor Thanks: Marco Correia [DESCRIPTION] Fixed "largest" variable selection strategy for set variables. [ENTRY] Module: flatzinc What: change Rank: minor [DESCRIPTION] Removed the print command line option. Instead, for optimization problems, using -a will print all solutions, while not using -a will only print the last one. This is consistent with the G12 FlatZinc command line interface. [ENTRY] Module: flatzinc What: bug Rank: minor Thanks: Thibaut Feydy [DESCRIPTION] Fixed the parser for set literals. [ENTRY] Module: flatzinc What: new Rank: minor [DESCRIPTION] Added mzn-gecode scripts for conveniently solving MiniZinc models using the Gecode FlatZinc interpreter. [ENTRY] Module: flatzinc What: bug Rank: minor [DESCRIPTION] Integer variables with empty domains result in unsatisfiable models instead of an error message. [ENTRY] Module: flatzinc What: bug Rank: minor [DESCRIPTION] Support 0-length array declarations. [RELEASE] Version: 3.7.2 Date: 2012-02-27 [DESCRIPTION] This release fixes several small bugs. [ENTRY] Module: flatzinc What: bug Rank: minor [DESCRIPTION] Export RTTI symbols for the FlatZinc AST so that it can be used by client code. [ENTRY] Module: other What: new Rank: minor Thanks: Adam Russell [DESCRIPTION] Gecode now compiles on NetBSD. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] Throw exception of type OutOfLimits instead of Exception when numerical arguments to sequence constraint are out of range. [ENTRY] Module: int What: bug Rank: minor Thanks: Joseph Scott [DESCRIPTION] Added missing pruning to cumulative edge finding propagator. [ENTRY] Module: driver What: bug Rank: minor Thanks: Serge Le Huitouze [DESCRIPTION] Fixed rounding for printing the runtime (for example, 1:60:56.157 could be printed...). [ENTRY] Module: set What: bug Rank: major Thanks: Denys Duchier [DESCRIPTION] The element constraint with SOT_UNION and IntSetArgs reported subsumption too early, resulting in incorrect propagation. [ENTRY] Module: minimodel What: bug Rank: minor [DESCRIPTION] The BoolExpr default constructor did not properly initialize its members, causing crashes. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Posting a reified dom constraint on IntVars with an assigned control variable does not create propagators any more, but updates the domain immediately. [ENTRY] Module: flatzinc What: bug Rank: minor Thanks: Nicholas Tung [DESCRIPTION] Do not crash when encountering undefined identifier as constraint argument. [ENTRY] Module: int What: bug Rank: minor Thanks: Kish Shen [DESCRIPTION] Fixed sorted constraint to accept zero-length arrays. [ENTRY] Module: int What: bug Rank: minor Thanks: Kish Shen [DESCRIPTION] Added some missing propagation when posting a channel constraint between an array of Boolean variables and an integer variable. [ENTRY] Module: other What: new Rank: minor Thanks: Denys Duchier [DESCRIPTION] Added a macro GECODE_VERSION_NUMBER that is defined as x*1000000+y*100+z for Gecode version x.y.z. [ENTRY] Module: driver What: bug Rank: minor Thanks: Jan Kelbel [DESCRIPTION] Fixed time output for times with zero minutes but nonzero hours. [ENTRY] Module: kernel What: new Rank: minor [DESCRIPTION] Added Archive operators for floats and doubles. [RELEASE] Version: 3.7.1 Date: 2011-10-10 [DESCRIPTION] This release fixes several bugs, upgrades to MiniZinc version 1.4, and features some minor improvements. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] The semantics of n-ary Boolean implication has been changed (to the more convential reading): rel(home, BOT_IMP, x, y) where x is an array of Boolean variable now assumes implication to be right associative. See MPG for explanation. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added efficient propagators for n-ary Boolean xor and equivalence (as they are now primitive in MiniZinc). [ENTRY] Module: flatzinc What: change Rank: minor [DESCRIPTION] The FlatZinc interpreter is now compatible with the G12 MiniZinc distribution 1.4. This adds support for var and par identifiers that begin with underscores, the array_bool_xor primitive, as well as the command line option -r for specifying a random seed. [ENTRY] Module: int What: new Rank: minor Thanks: Kish Shen [DESCRIPTION] Domain consistency for simple counting constraints can be switched off. [ENTRY] Module: flatzinc What: bug Rank: major Thanks: Håkan Kjellerstrand [DESCRIPTION] Fixed linear inequations over integer variables that are channeled from Boolean variables. [ENTRY] Module: support What: bug Rank: minor [DESCRIPTION] Compile again if threads are disabled. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Domain consistent distinct runs 10-20% faster. [ENTRY] Module: set What: bug Rank: major [DESCRIPTION] Do not use SharedArray in the set element constraints, because it does not properly udpate the IntSet during copying. This could cause memory corruption. [ENTRY] Module: int What: bug Rank: major [DESCRIPTION] Fixed bugs in the computation of the required precision (int or double) for linear propagation, and in division operations of scale views. These could cause an incorrect treatment of overflow in linear constraints. [ENTRY] Module: search What: bug Rank: minor [DESCRIPTION] Fixed a bug that crashed the single-thread branch-and-bound search engine when initialized with a failed space. [ENTRY] Module: gist What: bug Rank: minor [DESCRIPTION] Fixed a crash that occurred when double-clicking an unexplored node while move inspectors were active. [RELEASE] Version: 3.7.0 Date: 2011-08-31 [DESCRIPTION] This release adds and improves quite a number of constraints (total lexicographic order for set variables, membership constraints for integer variables, counting constraints for integer variables using integer sets, range, roots, set element constraints for integer variables, number of values for integer variables). All of these constraints (and some more) are now also available in FlatZinc. Additionally, some fixes and improvements. This release is an important milestone as %Gecode now provides native implementations for all important constraints available in MiniZinc/FlatZinc. The documentation of constraints in "Modeling and Programming with Gecode" now refers to the Global Constraint Catalog (for those constraints that are listed in the catalog). [ENTRY] Module: gist What: bug Rank: minor [DESCRIPTION] Call solution inspectors also when exploring manually. [ENTRY] Module: gist What: bug Rank: minor [DESCRIPTION] Flush output to Gist console, so that output that is not ended by a newline is not lost. [ENTRY] Module: flatzinc What: bug Rank: major [DESCRIPTION] Added missing primitives set_le, set_lt, set_ge, and set_gt. [ENTRY] Module: set What: new Rank: major [DESCRIPTION] Added set relations SRT_LQ, SRT_LE, SRT_GQ, SRT_GR for total (lexicographic) order. [ENTRY] Module: other What: bug Rank: minor Thanks: Gustavo Gutierrez [DESCRIPTION] Install generated variable implementation headers instead of the shipped versions (fixes a problem when building Gecode in a separate directory). [ENTRY] Module: int What: new Rank: major [DESCRIPTION] Added normal and reified membership constraints for integer and Boolean variables. [ENTRY] Module: minimodel What: new Rank: minor [DESCRIPTION] Added a convenience function values that restricts the set of values taken by an array of integer variables to a fixed set, using the nvalues constraint. The channel constraints between IntVarArgs and a SetVar now also use nvalues to increase propagation. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Added some additional propagation for the count constraints (now, for example, count(home, x, y, IRT_GQ, 1) also constrains y to only take values supported by x). [ENTRY] Module: int What: new Rank: major [DESCRIPTION] The count constraints now also support comparison to integer sets in addition to integers and integer variables (which then implements among from the GCCAT). [ENTRY] Module: minimodel What: new Rank: minor [DESCRIPTION] Added range and roots, which decompose into set element constraints. [ENTRY] Module: flatzinc What: new Rank: major [DESCRIPTION] Added native support for among, nvalues, int_set_channel, member_bool, member_int, sum_pred, and the range and roots constraints. [ENTRY] Module: set What: new Rank: minor [DESCRIPTION] Added set element constraints with singleton integer variables as arguments. [ENTRY] Module: set What: bug Rank: minor Thanks: Johannes Inführ [DESCRIPTION] Fixed a memory leak in the set weights constraint, and use IntSharedArray instead of IntArgs as parameters for weights. [ENTRY] Module: kernel What: bug Rank: minor Thanks: Max Ostrowski [DESCRIPTION] Array slices can now be created from empty arrays. [ENTRY] Module: int What: new Rank: major [DESCRIPTION] Added nvalues constraint. [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] Added Dominating %Queens puzzle. [ENTRY] Module: kernel What: new Rank: minor [DESCRIPTION] View arrays can now also use region-allocated memory. [ENTRY] Module: int What: bug Rank: major [DESCRIPTION] The estimation of bounds on linear terms did not handle overflow correctly. [ENTRY] Module: iter What: change Rank: minor [DESCRIPTION] Cached iterators such as n-ary union and intersection, minus, and cache (of course) are not any longer template classes but take template constructors and member functions. N-ary union and intersection iterators can now also be initialized incrementaly with iterators of different types. [ENTRY] Module: flatzinc What: change Rank: minor [DESCRIPTION] The set_in and set_in_reif constraints now work for constant sets even when %Gecode is compiled without support for set variables. [RELEASE] Version: 3.6.0 Date: 2011-07-15 [DESCRIPTION] This release adds new constraints (value precedence constraints for integer and set variables, no-overlap constraints for rectangles, constraints for Hamiltonian paths), improves and cleans up a number of existing constraints (scheduling, channeling, relation, bin-packing, lexicographic relations), and adds new functionality (support for externalization of choices for distributed search, support for incremental propagation). Some models might have to be changed as the graph and scheduling modules have been incorporated into the integer module (removing the respective include directives is sufficient). On top, there are many small fixes, in particular for FlatZinc. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] The cumulatives constraint now does not post the s+p=e constraints, harmonizing its semantics with the cumulative and unary constraints. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] The cumulative constraints now support an IntVar as the capacity argument. [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] Added Schur's Lemma puzzle. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Optimized channeling propagator between an array of Boolean variables and an integer variables. [ENTRY] Module: int What: change Rank: major [DESCRIPTION] Changed semantics of rel(home, x, IRT_NQ), enforces that not all variables in x are equal. See "Modeling and Programming with Gecode" for details. [ENTRY] Module: flatzinc What: new Rank: major [DESCRIPTION] Added native support for the precedence constraint. [ENTRY] Module: set What: new Rank: major Author: Christopher Mears [DESCRIPTION] Added value precedence constraint. [ENTRY] Module: int What: new Rank: major Author: Christopher Mears [DESCRIPTION] Added value precedence constraint. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] The disequality constraint between variable arrays has an efficient propagator now. [ENTRY] Module: int What: performance Rank: major [DESCRIPTION] The ordering constraints rel(home, x, IRT_LE) (also for IRT_LQ, IRT_GR, IRT_GQ) now have an optimal implementation (single incremental propagator). [ENTRY] Module: driver What: bug Rank: minor Thanks: Jan Kelbel [DESCRIPTION] Fixed a small memory leak in the driver (stop objects were not deleted). [ENTRY] Module: int What: performance Rank: major [DESCRIPTION] Increased performance of bin-packing propagator by 40 to 300 percent by using staging. [ENTRY] Module: flatzinc What: new Rank: major [DESCRIPTION] Added native support for the no-overlap constraint (called diffn in MiniZinc/FlatZinc). [ENTRY] Module: int What: new Rank: major [DESCRIPTION] Added no-overlap constraint that enforces that rectangles do not overlap (also known as diffn). See "Modeling and Programming with Gecode" for details. [ENTRY] Module: int What: new Rank: major [DESCRIPTION] Added constraints for Hamiltonian paths (called path). See "Modeling and Programming with Gecode" for details. [ENTRY] Module: flatzinc What: new Rank: minor Thanks: Håkan Kjellerstrand [DESCRIPTION] Support indomain_middle and indomain_interval search annotation by replacing them with indomain_median and indomain_split, respectively. [ENTRY] Module: gist What: change Rank: minor [DESCRIPTION] Zoom-to-fit can now be selected during search. [ENTRY] Module: graph What: change Rank: major [DESCRIPTION] The graph module has been removed and its constraints have been added to the integer module. [ENTRY] Module: scheduling What: change Rank: major [DESCRIPTION] The scheduling module has been removed and its constraints have been added to the integer module. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed element and sequence propagators, which were only correct by accident (incorrect use of GECODE_ME_CHECK instead of GECODE_ES_CHECK). [ENTRY] Module: set What: bug Rank: minor [DESCRIPTION] Fixed sequence, partition, and union propagators, which were only correct by accident (incorrect use of GECODE_ME_CHECK instead of GECODE_ES_CHECK). [ENTRY] Module: scheduling What: bug Rank: minor [DESCRIPTION] Fixed scheduling code for mandatory flexible tasks, which was only correct by accident (incorrect use of GECODE_ME_CHECK instead of GECODE_ES_CHECK). [ENTRY] Module: flatzinc What: new Rank: minor [DESCRIPTION] Added native support for link_set_to_booleans, global_cardinality_low_up_closed, and decreasing_bool. [ENTRY] Module: int What: new Rank: minor Thanks: Kish Shen [DESCRIPTION] Generalized lexicographic constraint to arrays of different sizes. [ENTRY] Module: search What: bug Rank: minor [DESCRIPTION] Fixed memory leak when passing a failed space to a search engine with cloning option set to false. [ENTRY] Module: kernel What: new Rank: minor [DESCRIPTION] Moved RangeList class, which is a list of ranges implemented as a FreeList, from the set module into the kernel. Also added corresponding Iter::Ranges::RangeList iterator. [ENTRY] Module: int What: new Rank: major [DESCRIPTION] Added a CachedView that can cache the domain between propagator invocations and provides an efficient test whether a view has changed since the previous invocation as well as an iterator over the removed domain values. This makes it easier to implement incremental propagation algorithms that need exact delta information. [ENTRY] Module: set What: new Rank: major [DESCRIPTION] Added a CachedView that can cache the domain between propagator invocations and provides an efficient test whether a view has changed since the previous invocation as well as an iterator over the removed domain values. This makes it easier to implement incremental propagation algorithms that need exact delta information. [ENTRY] Module: set What: performance Rank: minor [DESCRIPTION] Use new cached views for a more efficient implementation of the channel constraint between IntVarArgs and SetVarArgs. [ENTRY] Module: gist What: bug Rank: minor [DESCRIPTION] Changed keyboard shortcuts in Gist so that they work on all platforms: "Inspect" is now Ctrl+number of inspector, for "Inspect before fixpoint" press Alt in addition (on Mac OS, use the Command key instead of Ctrl). [ENTRY] Module: other What: bug Rank: minor Thanks: Martin Mann [DESCRIPTION] Fixed Makefile, now installation works when FlatZinc library is disabled. [ENTRY] Module: other What: new Rank: minor Thanks: Ruben Zilibowitz [DESCRIPTION] Added configure option --enable-small-codesize that results in slightly less efficient but more compact code being generated for non-debug builds. [ENTRY] Module: set What: bug Rank: minor [DESCRIPTION] The constructors for set variable arrays and argument arrays threw incorrect VariableEmptyDomain exceptions. [ENTRY] Module: graph What: new Rank: minor [DESCRIPTION] Added circuit constraints with offsets. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] The channel constraints between two integer arrays are now more memory efficient when offsets are used. [ENTRY] Module: kernel What: change Rank: major [DESCRIPTION] Choices can now be written into an externalized form (called an Archive), and reconstructed from it. This is necessary for serializing paths in a distributed search engine. [ENTRY] Module: flatzinc What: change Rank: minor [DESCRIPTION] Adapted the MiniZinc declarations and the command line options for Gecode/FlatZinc to MiniZinc 1.3. The fz binary now works with the minizinc driver script. [ENTRY] Module: flatzinc What: bug Rank: minor Thanks: Håkan Kjellerstrand [DESCRIPTION] Re-enabled the global cardinality constraint in the FlatZinc interpreter. [ENTRY] Module: flatzinc What: bug Rank: minor Thanks: Håkan Kjellerstrand [DESCRIPTION] Fixed the MiniZinc definition for the circuit constraints to work with arbitrarily indexed arrays. [ENTRY] Module: gist What: change Rank: minor Thanks: Alin Gherman [DESCRIPTION] Compiles under MSVC 2005 SP1 again. [ENTRY] Module: set What: new Rank: minor Thanks: Marco Correia [DESCRIPTION] Added channel aliases for set union of an array of integer variables, and renamed channel to channelSorted. [ENTRY] Module: set What: documentation Rank: minor Thanks: Marco Correia [DESCRIPTION] Fixed documentation for set channeling constraint. [RELEASE] Version: 3.5.0 Date: 2011-02-01 [DESCRIPTION] This release fixes serious bugs in parallel search, FlatZinc, fixes some DLL issues on Windows, adds support for FreeBSD, and adds STL-style iterators for arrays. [ENTRY] Module: search What: bug Rank: major Thanks: Denys Duchier, Chris Mears [DESCRIPTION] Fixed a serious bug in parallel search (took over a year to isolate the bug). [ENTRY] Module: other What: new Rank: minor Thanks: Peter Penchev [DESCRIPTION] Gecode now compiles on FreeBSD. [ENTRY] Module: kernel What: new Rank: major Author: Gregory Crosswhite [DESCRIPTION] Added STL compatible iteration support for arrays (variable arrays, argument arrays, view arrays, and shared arrays). [ENTRY] Module: minimodel What: bug Rank: minor Thanks: Alexander Kleff [DESCRIPTION] Do not inline construction of linear, Boolean, and set expressions to avoid cross-DLL allocation/deallocation issues on Windows. [ENTRY] Module: other What: new Rank: major [DESCRIPTION] Embed resource information into Gecode DLLs and EXEs on Windows. [ENTRY] Module: flatzinc What: bug Rank: major Thanks: Roberto Castañeda Lozano [DESCRIPTION] Fixed incorrect posting of linear constraints with variable arrays of size one. [ENTRY] Module: other What: change Rank: minor [DESCRIPTION] Embed manifest into Gecode DLLs on Windows. [ENTRY] Module: flatzinc What: change Rank: major [DESCRIPTION] Fixed the definitions of global_cardinality to work with MiniZinc 1.2 and newer, and added corresponding definitions of global_cardinality_closed and global_cardinality_low_up_closed. [RELEASE] Version: 3.4.2 Date: 2010-10-09 [DESCRIPTION] This release removes LDS from Gecode as it is patented in the US. [ENTRY] Module: search What: removed Rank: minor [DESCRIPTION] Removed limited discrepancy search (LDS) as it is patented in the US. [ENTRY] Module: flatzinc What: new Rank: minor [DESCRIPTION] Added support for binpacking constraint. [RELEASE] Version: 3.4.1 Date: 2010-10-08 [DESCRIPTION] This release adds a new global constraint for binpacking (with extended example) and filter functions for branchers. The reference documentation has been cleaned up. In particular, information on how to obtain, install, and link Gecode has been expanded and moved to "Modeling and Programming with Gecode" (Section 2.6). Additionally, the release fixes some bugs and contains some performance improvements. [ENTRY] Module: example What: new Rank: major [DESCRIPTION] Added a binpacking model using the binpacking constraint and CDBF (complete decreasing best fit) search. [ENTRY] Module: int What: new Rank: major [DESCRIPTION] Added a binpacking constraint and propagator. [ENTRY] Module: driver What: new Rank: minor [DESCRIPTION] Added a class InstanceOptions that takes one additional string argument. [ENTRY] Module: flatzinc What: new Rank: minor [DESCRIPTION] Added support for global_cardinality_low_up. [ENTRY] Module: other What: documentation Rank: minor [DESCRIPTION] Removed obsolete Glossary in reference documentation. [ENTRY] Module: int What: bug Rank: minor Thanks: Gustavo A. Gómez Farhat [DESCRIPTION] Do not inline functions with variable arguments. [ENTRY] Module: gist What: change Rank: minor [DESCRIPTION] Only center node on double-click if it was undetermined (otherwise inspecting several nodes becomes slightly annoying). [ENTRY] Module: minimodel What: change Rank: minor [DESCRIPTION] Added element expression for BoolVarArgs. [ENTRY] Module: minimodel What: bug Rank: minor [DESCRIPTION] Fixed memory allocation for non-linear expressions and made the LinExpr constructor explicit for non-linear expressions (previously the automatic cast from integers to LinExpr was sometimes ambiguous). [ENTRY] Module: scheduling What: bug Rank: major Thanks: Roberto Castañeda Lozano [DESCRIPTION] Fixed initialization for unary and cumulative edge-finding (just worked accidentally). [ENTRY] Module: kernel What: change Rank: major Thanks: Felix Brandt [DESCRIPTION] Branching now honors filter functions, where variables are considered for branching only if the filter functions returns true (see "Modeling and Programming with Gecode" for details). [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] Variable implementation views are now parametric with respect to variables but not variable implementations (see "Modeling and Programming with Gecode" for details). [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] Renamed the template class for variables defined by a variable implementation from Var to VarImpVar and re-added a class Var as base class for any variable type. [ENTRY] Module: int What: bug Rank: minor Thanks: Kish Shen [DESCRIPTION] The reified dom constraint failed instead of setting the BoolVar to 0 when the minimum argument given was greater than the maximum. [ENTRY] Module: int What: performance Rank: minor Thanks: Kish Shen [DESCRIPTION] Fixed sortedness constraint by replacing an algorithm that is linear in the width of the union of all domains with an algorithm that is quadratic in the number of variables. The previous algorithm crashed for domains with large values due to excessive memory use. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Using ICL_DOM for binary linear equations with unit coefficients (such as x = y+3) is now implemented using the much more efficient binary equality propagator instead of the linear equation propagator (which has worst case exponential runtime). [ENTRY] Module: gist What: performance Rank: minor [DESCRIPTION] Saved some memory for each node in Gist (one pointer per node, two integers per inner node, and some additional memory on 64 bit platforms due to optimizing alignment), and speeded up deallocation of the tree (e.g. when resetting or closing Gist). [ENTRY] Module: iter What: performance Rank: minor [DESCRIPTION] Reimplemented n-ary union, minus, and cache iterators for much better efficiency. [ENTRY] Module: flatzinc What: performance Rank: minor [DESCRIPTION] The FlatZinc parser now uses hash maps instead of STL maps, which significantly increases parsing performance for larger files. Furthermore, a single symbol table is used, also increasing performance and allowing to report duplicate symbol errors, which were previously ignored. [RELEASE] Version: 3.4.0 Date: 2010-07-26 [DESCRIPTION] This release includes: considerably improved support for posting expressions and relations (also including set and full arithmetic expressions); other improvements for modeling (array initialization and element addition to arrays); state-of-the-art unary and cumulative scheduling propagators (including optional and flexible tasks); major cleanups of the variable and view infrastructure (now also documented in MPG); cleanups of the examples; several other fixes and performance improvements. This release is the first to be accompanied by a complete version of "Modeling and Programming in Gecode" which has been extended by many new case studies and parts on programming search engines and variables. [ENTRY] Module: flatzinc What: bug Rank: minor [DESCRIPTION] Boolean relations were incorrect on assigned arguments. [ENTRY] Module: kernel What: bug Rank: minor [DESCRIPTION] Posting a propagator in a failed space could make the space non-failed again. [ENTRY] Module: kernel What: new Rank: minor [DESCRIPTION] Added LocalObject and LocalHandle classes that can be used for space-allocated objects that are shared within a space, for example among several propagators or propagators and branchers. [ENTRY] Module: other What: change Rank: major [DESCRIPTION] Completely cleaned up variables and views, drastically saving code. [ENTRY] Module: other What: removed Rank: minor [DESCRIPTION] Variables do not have init functions any longer as they are not needed, see MPG for discussion. [ENTRY] Module: scheduling What: new Rank: major [DESCRIPTION] Added scheduling constraints for tasks with flexible duration (for both unary and cumulative resources), and made all scheduling propagators deal correctly with zero length tasks. [ENTRY] Module: scheduling What: new Rank: major [DESCRIPTION] Added propagators for cumulative scheduling. [ENTRY] Module: minimodel What: bug Rank: minor Thanks: Håkan Kjellerstrand [DESCRIPTION] Fixed a bug in minimodel, which could crash when using zero coefficients. [ENTRY] Module: driver What: change Rank: minor [DESCRIPTION] The driver now catches SIGINT (i.e., pressing Ctrl-C) and stops the search properly, printing statistics up to the point where it stopped. [ENTRY] Module: gist What: change Rank: minor [DESCRIPTION] If an inspector throws an exception, an error message is printed indicating which inspector caused the problem. Previously, Gist would crash with a Qt error that was difficult to trace. [ENTRY] Module: flatzinc What: bug Rank: minor [DESCRIPTION] Fixed garbage collection of variables that are not printed. The bug lead to variables being mixed up in the output. [ENTRY] Module: example What: removed Rank: minor [DESCRIPTION] Removed stress tests, the real examples are much more stressful, actually! [ENTRY] Module: minimodel What: change Rank: minor [DESCRIPTION] The Matrix class now supports const operations and has an output operator. [ENTRY] Module: minimodel What: change Rank: major [DESCRIPTION] Linear expressions can now contain non-linear parts, such as multiplications or divisions, or set expressions such as cardinality. [ENTRY] Module: minimodel What: change Rank: major [DESCRIPTION] The minimodel post functions have been split into two functions, rel and expr. While rel posts a constraint, expr returns a new variable constrained to the given expression. This change makes it possible to get rid of the reification operator (~) as well as the tt and ff functions, which were previously needed to distinguish between relations and expressions. Boolean equivalence and implication can now be expressed using operators (==,<<,>>). [ENTRY] Module: minimodel What: new Rank: major [DESCRIPTION] The minimodel library now provides convenient post functions for set constraints. [ENTRY] Module: set What: bug Rank: minor [DESCRIPTION] Fixed the include and exclude tell operations of set variables so that they work with empty ranges. [ENTRY] Module: example What: change Rank: minor [DESCRIPTION] The Nonogram example now uses AFC as the default branching and includes some more instances. [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] New custom branching for the BACP example using a custom value selection. [ENTRY] Module: other What: change Rank: minor [DESCRIPTION] The configure script now checks for qmake-qt4 and moc-qt4, which are used on some Linux systems to distinguish between Qt3 and Qt4. [ENTRY] Module: driver What: change Rank: minor [DESCRIPTION] Running a script in time mode stops all iterations and samples immediately if a single run reaches a limit (eases benchmarks with timeouts). [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Optimized element propagator, expect a speed up of around 35-50% in most cases. [ENTRY] Module: minimodel What: performance Rank: minor [DESCRIPTION] Posting linear expressions performs more aggressive optimizations for assigned variables. [ENTRY] Module: minimodel What: performance Rank: minor [DESCRIPTION] Arithmetic modeling functions now try to avoid creating new variables and posting propagators for common cases. [ENTRY] Module: set What: change Rank: minor [DESCRIPTION] The argument arrays now have constructors that create new variables. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] The argument arrays now have constructors that create new variables. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] IntArgs with simple sequences of values can now be created using the IntArgs::create static member function. [ENTRY] Module: other What: change Rank: minor [DESCRIPTION] The build system now supports Visual C++ 2010. [ENTRY] Module: minimodel What: change Rank: minor [DESCRIPTION] Array slices can now be empty. [ENTRY] Module: kernel What: change Rank: major [DESCRIPTION] The support for dynamically resizing variable arrays has been removed (it was buggy and inefficient). Instead, all argument arrays now support adding elements using operator<<. In addition, all arrays now support concatenation using operator+ and slicing, and variable arrays, view arrays, and variable argument arrays include a test whether all variables are assigned. [ENTRY] Module: example What: change Rank: minor [DESCRIPTION] Take advantage of the better modeling support for the BIBD, Golomb ruler, Kakuro, Black Hole, and Warehouse examples (nothing but dusting off examples that have been around for ages). [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] You can now construct IntArgs from an STL vector, an IntSharedArray, or using simple comprehensions. [ENTRY] Module: gist What: bug Rank: minor [DESCRIPTION] Fixed bug in Gist where signals were sent across threads, which makes Qt crash in certain situations on some platforms. [ENTRY] Module: gist What: bug Rank: minor Thanks: David Zaremby [DESCRIPTION] Fixed bug in interactive search where every move in the tree required recomputation. [RELEASE] Version: 3.3.1 Date: 2010-04-09 [DESCRIPTION] This release adds many new features to Gist, fixes two major bugs in extensional constraints, and has some more cleanups to comply with the first release of the "Modeling and Programming with Gecode" document. And, as always some small fixes and cleanups. [ENTRY] Module: other What: documentation Rank: minor [DESCRIPTION] Removed many small documentation quirks. [ENTRY] Module: flatzinc What: performance Rank: minor [DESCRIPTION] Variables that do not have output annotations are now garbage collected during copying. [ENTRY] Module: flatzinc What: performance Rank: minor [DESCRIPTION] When using sums of Boolean variables using bool2int in MiniZinc, the FlatZinc interpreter now posts the more efficient propagators that work directly on the Boolean variables. [ENTRY] Module: scheduling What: bug Rank: minor [DESCRIPTION] The unary scheduling propagator with optional tasks missed some propagation sometimes. [ENTRY] Module: int What: bug Rank: major [DESCRIPTION] Fixed extensional constraint with finite automata for very unlikely (but apparantely possible) border case. [ENTRY] Module: gist What: new Rank: major [DESCRIPTION] In addition to inspectors, you can now also register comparators, which can be used to compare two nodes in the tree. In combination with the option to compare before computing a fixpoint of the second node, this lets you see what exactly was modified by a branching. [ENTRY] Module: set What: bug Rank: minor [DESCRIPTION] Fixed channeling between set and integer variables which did not propagate enough. [ENTRY] Module: int What: bug Rank: major [DESCRIPTION] The extensional constraints with tuple sets could cause crashes when used with parallel search. [ENTRY] Module: gist What: bug Rank: minor [DESCRIPTION] Missing export declarations prevented embedding Gist as a widget. There is now example code for embedding Gist in the directory gecode/gist/standalone-example. [ENTRY] Module: gist What: new Rank: major [DESCRIPTION] Gist can now stop exploration after all alternatives of a certain branching are exhausted. This feature can be turned on by posting a special branching using the Gist::stopBranch post function. Gist will then stop whenever that special branching becomes active. [ENTRY] Module: kernel What: bug Rank: minor [DESCRIPTION] Fixed bug in VarArray::resize function that occurred when shrinking variable arrays. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] The (unused and unusable) CopiedHandle have been removed. [ENTRY] Module: scheduling What: change Rank: minor [DESCRIPTION] Tasks in unary scheduling constraints may now have processing times of 0. [ENTRY] Module: gist What: new Rank: minor [DESCRIPTION] Added inspection of nodes before fixpoint computation. [ENTRY] Module: set What: removed Rank: minor [DESCRIPTION] Removed Set::IntSetPropagator and Set::IntSetRePropagator because they are subsumed by the MixBinaryPropagator patterns. [ENTRY] Module: gist What: bug Rank: minor [DESCRIPTION] Fixed a bug where sometimes clicking on a node would select a different node. [ENTRY] Module: gist What: performance Rank: major [DESCRIPTION] Scrolling and zooming have been reimplemented. The new implementation is more efficient and works around problems that occurred with large trees on some platforms. Zooming is now more intuitive, keeping the current center centered. You can now also zoom by pressing shift while using the mouse wheel. [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] Added Gist inspectors for the Knights and Queens examples. [ENTRY] Module: driver What: new Rank: minor [DESCRIPTION] You can now register Gist inspectors in the driver options. [ENTRY] Module: gist What: new Rank: minor [DESCRIPTION] Nodes can now be bookmarked. [ENTRY] Module: gist What: new Rank: minor [DESCRIPTION] Added inspectors that react whenever a node is selected. [ENTRY] Module: flatzinc What: change Rank: minor [DESCRIPTION] Comply with MiniZinc 1.1. String literals are not allowed any longer except in annotations, the solver outputs UNKNOWN and UNSATISFIABLE instead of just ==========, and the global constraints all_equal, decreasing_int, and decreasing_bool are supported. [RELEASE] Version: 3.3.0 Date: 2010-03-15 [DESCRIPTION] This release provides some fixes, some performance improvements for domain propagators, and quite some clean ups how propagators and advisors report their status to the kernel. Many of these clean ups are essential to make it easier to program propagators and branchers with Gecode. [ENTRY] Module: other What: bug Rank: minor [DESCRIPTION] Configure now prepend options to the CXXFLAGS and CFLAGS variables instead of appending them. That way, defining the variables when invoking configure overrides the choices configure makes (e.g. overriding the default -O3 with -O2). [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] Patterns for reified propagators have been moved to the Gecode::Int namespace. [ENTRY] Module: set What: change Rank: minor [DESCRIPTION] Patterns for set propagators have been moved to the Gecode::Set namespace. [ENTRY] Module: kernel What: bug Rank: minor [DESCRIPTION] ViewValBrancher with random value selection did not produce a random sequence of values. [ENTRY] Module: kernel What: new Rank: minor [DESCRIPTION] Advisors now can force its propagator to be rescheduled, including recomputation of its cost used for scheduling (normally, a propagator is only rescheduled if its modification event delta changes). An advisor can signal forceful rescheduling by returning ES_NOFIX_FORCE or returning the return value of ES_NOFIX_FORCE_DISPOSE. Read the forthcoming "Modeling and Programming with Gecode" for details. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] The failure macros for posting GECODE_ES_FAIL and GECODE_ME_FAIL now only accept a single argument and assume that "home" actually refers to the home space. Read the forthcoming "Modeling and Programming with Gecode" for details. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] The functions ES_FIX_PARTIAL, ES_NOFIX_PARTIAL, ES_FIX_DISPOSE, and ES_NOFIX_DISPOSE are now member of Space. Read the forthcoming "Modeling and Programming with Gecode" for details. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] The function ES_SUBSUMED now is a member of Space and accepts a propagator as its single argument. The variant with a size as the second argument is available as ES_SUBSUMED_DISPOSED but use is highly discouraged. Read the forthcoming "Modeling and Programming with Gecode" for details. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] The functions ES_SUBSUMED_FIX and ES_SUBSUMED_NOFIX for advisors have been renamed to ES_FIX_DISPOSE and ES_NOFIX_DISPOSE. Read the forthcoming "Modeling and Programming with Gecode" for details. [ENTRY] Module: flatzinc What: change Rank: minor [DESCRIPTION] The FlatZinc interpreter can now be extended by plugins that implement custom search strategies. The plugins are implemented as dynamically loaded libraries using the Qt plugin mechanism. An example can be found in the directory gecode/flatzinc/exampleplugin. [ENTRY] Module: flatzinc What: change Rank: minor [DESCRIPTION] The index of the variable used for optimization is now available in the FlatZincSpace class. [ENTRY] Module: flatzinc What: change Rank: minor [DESCRIPTION] Added command line option -print, which controls whether all solutions are printed or only the last one that is found, and -search, to choose between branch-and-bound and restart optimization. [ENTRY] Module: flatzinc What: change Rank: minor [DESCRIPTION] The FlatZinc library can now parse a FlatZinc model into any subclass of FlatZincSpace, so that custom extensions can be built. Annotations on the solve item can now be accessed from the returned FlatZincSpace, so that additional search strategies can be implemented. [ENTRY] Module: flatzinc What: bug Rank: minor [DESCRIPTION] The FlatZinc interpreter ignored the -c-d and -a-d command line switches when used with Gist. [ENTRY] Module: minimodel What: removed Rank: minor [DESCRIPTION] Removed special cases for posting linear and Boolean expressions consisting of a single variable only (was highly ambigious). [ENTRY] Module: minimodel What: new Rank: minor [DESCRIPTION] Linear expressions can freely mix integer and Boolean variables and support construction from variable arrays via a sum function. [ENTRY] Module: support What: performance Rank: major [DESCRIPTION] Changed to single, really efficient bitset implementation used allover the system. [ENTRY] Module: int What: performance Rank: major [DESCRIPTION] Considerably improved performance and memory consumption of the DFA-based extensional constraint (regular). [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Integer sets (IntSet) now have a in member function for testing whether an integer is included. [ENTRY] Module: gist What: bug Rank: minor [DESCRIPTION] Avoid inter-thread call to QWidget::update, which apparently causes a slight memory leak (and warning messages on stderr) on Mac OS. [RELEASE] Version: 3.2.2 Date: 2009-11-30 [DESCRIPTION] This release adds the sequence constraint (contributed by David Rijsman, Quintiq) and has as always some small additions and fixes. [ENTRY] Module: int What: bug Rank: minor Thanks: Alberto Delgado [DESCRIPTION] The global cardinality (count) constraint now accepts unsorted arrays of values. It previously propagated incorrectly if the array was not sorted. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed bug in the ICL_VAL propagator for global cardinality. [ENTRY] Module: flatzinc What: bug Rank: minor Thanks: Håkan Kjellerstrand [DESCRIPTION] Support search annotations with constants in the variable arrays. [ENTRY] Module: search What: bug Rank: minor [DESCRIPTION] The memory reported could be sometimes too low (the previous fix for 3.2.0 did not fix it for branch and bound search). [ENTRY] Module: kernel What: bug Rank: minor Thanks: Gustavo Gutierrez [DESCRIPTION] Added missing assignment operator for space-based allocators for STL data structures. [ENTRY] Module: iter What: change Rank: minor [DESCRIPTION] Renamed test for subset or disjointness of range iterators to "compare". [ENTRY] Module: flatzinc What: bug Rank: minor [DESCRIPTION] The set_in and set_in_reif constraints were buggy when used with Boolean variables (which are usually not generated by mzn2fzn so that the issue probably does not occur in practice). [ENTRY] Module: set What: bug Rank: minor [DESCRIPTION] Subscription to constant views did not honor the flag to avoid processing (did not occur in practice). [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Subscription to constant views did not honor the flag to avoid processing. [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] Added car sequencing example (problem 1 in CSPLib). Uses the new sequence-constraint. [ENTRY] Module: int What: new Rank: major Author: David Rijsman [DESCRIPTION] Added sequence constraint. [ENTRY] Module: driver What: new Rank: minor [DESCRIPTION] Report if search engine has been stopped. [ENTRY] Module: flatzinc What: bug Rank: minor [DESCRIPTION] The global_cardinality constraint was not completely compatible with the MiniZinc semantics. It would constrain values not mentioned in the array to have zero occurrences, while in MiniZinc they are unrestricted. [ENTRY] Module: flatzinc What: bug Rank: major Thanks: Håkan Kjellerstrand [DESCRIPTION] Element constraints in reified positions produced an error in the mzn2fzn translation. [RELEASE] Version: 3.2.1 Date: 2009-11-04 [DESCRIPTION] This release fixes one serious bug in the element constraint for matrices; adds branchings using accumulated failure counts (also known as weighted degree); provides some optimizations (mostly for element constraints and for regular expressions with millions of nodes); adds two cute models (word-square and crossword); and a little this and that as always. [ENTRY] Module: minimodel What: performance Rank: minor Thanks: Håkan Kjellerstrand [DESCRIPTION] Conversion of a regular expression to a DFA would crash on regular expressions with several million nodes (due to running out of call stack space). [ENTRY] Module: set What: change Rank: minor [DESCRIPTION] Split rel-op.cpp and rel-op-const.cpp into several compilation units, to avoid excessive memory and time usage of the gcc compiler. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Element constraints for integer arrays now accept shared integer arrays (IntSharedArray). By this, the very same array can be shared among several element constraints. Models require no change, as IntArgs are automatically coerced to IntSharedArrays. See "Modeling with Gecode" for more explanation. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] The semantics of division and modulo has changed to match the C standard. This means that the operations round towards zero, and that the result of the modulo has the same sign as its first argument. [ENTRY] Module: example What: bug Rank: minor Thanks: Jan Wolter [DESCRIPTION] The Nonogram example no longer crashes on empty lines. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Optimized element for matrices (in special cases, the propagator is up to six times as efficient as before). [ENTRY] Module: flatzinc What: bug Rank: minor [DESCRIPTION] Fixed statistics output (number of solutions was sometimes wrong). [ENTRY] Module: int What: bug Rank: major [DESCRIPTION] Fixed segfault in matrix element constraint. [ENTRY] Module: example What: new Rank: minor Author: Håkan Kjellerstrand [DESCRIPTION] Added word square puzzle. [ENTRY] Module: example What: new Rank: minor Thanks: Peter Van Beek [DESCRIPTION] Added crossword puzzle (thanks to Peter Van Beek for providing access to some crossword grids). [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added INT_VAL_RANGES_MIN (and INT_VAL_RANGES_MAX) as value selection for branching: it tries the values from the smallest (largest) range first, if the variable's domain has several ranges, otherwise it splits the domain. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Added missing dispose function for linear disequality of Boolean variables (the only problem was that with a proper dispose function more memory can be reused when the propagator becomes subsumed, so really a tiny quirk). [ENTRY] Module: int What: new Rank: major [DESCRIPTION] Added AFC-based branching strategies for integer and Boolean variables: INT_VAR_AFC_MIN, INT_VAR_AFC_MAX, INT_VAR_SIZE_AFC_MIN, INT_VAR_SIZE_AFC_MAX. For details, see "Modeling with Gecode". [ENTRY] Module: set What: new Rank: major [DESCRIPTION] Added AFC-based branching strategies for set variables: SET_VAR_AFC_MIN, SET_VAR_AFC_MAX, SET_VAR_SIZE_AFC_MIN, SET_VAR_SIZE_AFC_MAX. For details, see "Modeling with Gecode". [ENTRY] Module: kernel What: new Rank: major [DESCRIPTION] Propagators and variables now maintain an accumulated failure count (AFC). [MORE] The AFC of a propagator counts how often has the propagator failed during the entire search, and the AFC of a variable is its degree plus the sum of the AFCs of all propagators depending on the variable. While it looks straightforward, this required a major extension of the Gecode kernel to deal with global information accessed concurrently from several threads during search. The AFC is also known as "weighted degree". [ENTRY] Module: example What: change Rank: minor [DESCRIPTION] Sudoku and GraphColor now uses smallest size over accumulated failure count (AFC) as the default heuristic. [ENTRY] Module: bug What: set Rank: minor [DESCRIPTION] For branching, SET_VAR_DEGREE_MAX would select the variable with smallest rather than largest degree. [ENTRY] Module: other What: change Rank: major [DESCRIPTION] Now posting of propagators and branchers take an object of class Home (rather than just a space) that can carry additional information relevant for posting (for example, groups and accumulated failure information). Models do not need to be changed in any way! [MORE] While models require no change, propagator rewriting does (it will work but some information might be lost). Instead of writing something like GECODE_REWRITE(*this,SomeProp::post(home,...)); where *this is the propagator to be rewritten, you should now write GECODE_REWRITE(*this,SomeProp::post(home(*this),...)); By this, the new propagator will inherit information from *this (in particular the accumulated failure count). [RELEASE] Version: 3.2.0 Date: 2009-10-05 [DESCRIPTION] This release has some important bug fixes (in particular for global cardinality aka count), the documentation has been improved (worked around some issues with generation by doxygen), integrates the FlatZinc interpreter into the Gecode source tree, provides propagators for disjunctive scheduling (experimental), and lots of small changes and fixes. For more consistent names, branchings are branchers now and branching descriptions are choices (this you might have to adapt to). [ENTRY] Module: scheduling What: new Rank: major [DESCRIPTION] Added propagators for disjunctive scheduling (unary resource scheduling). This is still experimental as the propagators are not yet optimized and branching and modelling support is not yet available. [ENTRY] Module: search What: bug Rank: minor [DESCRIPTION] The memory reported could be sometimes too low (that could only happen when an advisor allocates memory which they do only now). [ENTRY] Module: other What: documentation Rank: major [DESCRIPTION] Cleaned up the generated reference documentation, and introduced a number of workarounds for issues in doxygen. In particular, the documentation for linear constraints over Boolean variables and for the thread abstractions is now generated properly. [ENTRY] Module: flatzinc What: new Rank: major [DESCRIPTION] The Gecode interpreter for the FlatZinc language is now part of the main Gecode source tree. [ENTRY] Module: int What: performance Rank: minor Thanks: George Katsirelos, Nina Narodytska [DESCRIPTION] Extensional propagators using DFAs or REGs (aka regular) use a more compact state representation but create their state more eagerly. That can improve performance considerably (twice as fast) at a slight increase in memory. [ENTRY] Module: gist What: bug Rank: minor [DESCRIPTION] Gist now places clones also on the leftmost branch during search. [ENTRY] Module: other What: documentation Rank: minor Thanks: Vivian De Smedt [DESCRIPTION] Mention that also grep is needed for building Gecode. [ENTRY] Module: int What: bug Rank: minor Thanks: Jan Kelbel [DESCRIPTION] Slightly improved strength of the division propagator. [ENTRY] Module: example What: bug Rank: minor Thanks: Geoffrey Chu [DESCRIPTION] Fixed wrong symmetry breaking for TSP. [ENTRY] Module: support What: change Rank: minor Thanks: Alexandre Fayolle [DESCRIPTION] No longer depend on availability of timersub. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Optimized n-ary disjunction and conjunction and the clause constraint. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Linear constraints over Boolean variables with unit coefficients (aka Boolean cardinality constraints) have been reimplemented. Less memory (minus 30%) and more speed. For example, BIBD runs 10% faster now. [ENTRY] Module: search What: change Rank: minor [DESCRIPTION] Optimized thread creation by thread pools, now the creation and deletion of arbitrarily many parallel search engines also works for platforms using pthreads (Linux and MacOS). [ENTRY] Module: other What: change Rank: minor Thanks: David Rijsman [DESCRIPTION] Compiles with MSVC 2005 again. [ENTRY] Module: other What: bug Rank: minor [DESCRIPTION] The configure script checked for Qt 4.2, although Gist requires at least Qt 4.3. [ENTRY] Module: int What: bug Rank: major [DESCRIPTION] Fixed serious bug in the bounds propagator for global cardinality. [ENTRY] Module: kernel What: change Rank: major [DESCRIPTION] A branching is now a brancher and a branching description is now a choice. [MORE] Classes and member functions have been renamed accordingly. The change is necessary due to proper explanation in the forthcoming "Programming with Gecode". [ENTRY] Module: search What: bug Rank: minor [DESCRIPTION] Compiles again if no threads available. [ENTRY] Module: gist What: change Rank: minor [DESCRIPTION] The Gist console now has a toolbar that provides buttons to clear the text as well as to configure the console window to stay on top of Gist. Furthermore, after adding output, the console now automatically scrolls to the bottom. [ENTRY] Module: graph What: new Rank: minor [DESCRIPTION] Cost-based variants for circuit added. [ENTRY] Module: set What: change Rank: minor [DESCRIPTION] The element constraint with an integer index variable now throws an exception if used with an empty array. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] The element constraint now computes more accurate variable bounds when being posted (to avoid arithmetic overflow in naive models). [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] The element constraint now throws an exception if used with an empty array. [ENTRY] Module: example What: bug Rank: minor [DESCRIPTION] Fixed zero cost edges in TSP examples. [ENTRY] Module: example What: change Rank: minor [DESCRIPTION] Examples now use the symmetry-option for symmetry-breaking. [MORE] The affected examples are: - BlackHole - EFPA - Pentominoes - SteelMill . [ENTRY] Module: driver What: new Rank: minor [DESCRIPTION] Added new standard option for options called symmetry. [ENTRY] Module: int What: new Rank: minor Thanks: Kish Shen [DESCRIPTION] Added regret_min and regret_max for IntVar and BoolVar (they were only available for IntView). [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] Moved cumulatives to the new scheduling library. [ENTRY] Module: scheduling What: new Rank: minor [DESCRIPTION] Added a new module for scheduling. To use scheduling constraints, you have to include and link against the scheduling library. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] Moved circuit to the new graph library. [ENTRY] Module: graph What: new Rank: minor [DESCRIPTION] Added a new module for graph constraints. To use graph constraints, you have to include and link against the graph library. [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] Added branching following Warnsdorff's heuristic for Knights. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added branch and assign for single integer and Boolean variable. [ENTRY] Module: set What: new Rank: minor [DESCRIPTION] Added branch and assign for single set variable. [ENTRY] Module: minimodel What: new Rank: minor Thanks: Håkan Kjellerstrand [DESCRIPTION] Added element constraints for Matrix interface to arrays. [ENTRY] Module: int What: new Rank: minor Thanks: Håkan Kjellerstrand [DESCRIPTION] Added element constraints for Matrix arrays. [ENTRY] Module: set What: new Rank: minor Thanks: Håkan Kjellerstrand [DESCRIPTION] Added element constraints for Matrix arrays. [ENTRY] Module: search What: change Rank: minor Thanks: Vincent Barichard [DESCRIPTION] Path for search provides top and empty methods. [ENTRY] Module: driver What: change Rank: minor Bug: 59 Thanks: Luca Di Gaspero [DESCRIPTION] The driver takes copies of all string values passed top it. [RELEASE] Version: 3.1.0 Date: 2009-05-20 [DESCRIPTION] This release introduces parallel search, features improved memory management (can double efficiency on MacOS X), and provides a reusable command line driver upon popular request. And, of course, some this and that. [ENTRY] Module: set What: change Rank: minor [DESCRIPTION] The set constraint sequentialUnion has been renamed to sequence. [ENTRY] Module: example What: change Rank: minor [DESCRIPTION] The parameters of the Hamming Codes example are now configurable through command line options (instead of hard-coded). [ENTRY] Module: search What: change Rank: minor [DESCRIPTION] The stop function of stop objects now also takes a second argument of type Search::Options. This is in particular useful for decisions that involve the number of threads used for search. [ENTRY] Module: search What: new Rank: major [DESCRIPTION] Added parallel search engines for DFS, BAB, and Restart (but not LDS). Please make sure to read the section "Parallel search" in "Modeling with Gecode". [MORE] Parallel search is still experimental: creating and destroying a large number (more than 1000) of search engines (and hence a large number of threads) might raise exceptions on operating systems using pthreads as thread implementation. This will be fixed in a future release by using thread pools. [ENTRY] Module: support What: new Rank: minor [DESCRIPTION] Added a tiny portable thread package specifically tailored to the needs for parallel search. Unfortunately, other portable thread packages have just too many issues. [ENTRY] Module: gist What: bug Rank: minor [DESCRIPTION] Fixed a dead lock that could occur when closing the Gist main window while search is still running. [ENTRY] Module: gist What: bug Rank: minor [DESCRIPTION] The inspectors are finalized before Gist exits. This fixes a bug where (at least on Mac OS) some memory was not freed in the correct order. [ENTRY] Module: gist What: bug Rank: minor [DESCRIPTION] Gist now correctly centers the current node after search has finished. [ENTRY] Module: gist What: change Rank: minor [DESCRIPTION] Small user interface changes: disable search from hidden nodes, add depth information to status bar, and add statistics for subtrees (available from the node context menu and the Node menu). [ENTRY] Module: gist What: change Rank: minor [DESCRIPTION] Easily add multiple inspectors to Gist. Inspectors are not exclusive any longer, you can select any combination of them to respond to clicks or solutions simultaneously. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] The INT_VAL_MED value selection now consistently selects the greatest element in the domain not greater than the median. [ENTRY] Module: driver What: change Rank: minor [DESCRIPTION] If Gist is not available, -mode gist is the same as -mode solution. Invocation with -help also prints information about how Gecode has been configured. [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] Added new example for equidistant frequency permutation arrays (EFPA). [ENTRY] Module: kernel What: performance Rank: major [DESCRIPTION] Cache memory blocks from deleted spaces. This hardly increases peak memory consumption. It improves performance on Windows and Linux only by up to 5%, but on MacOS by 50% in some cases (this improvement is absolutely essential for parallel execution). [ENTRY] Module: set What: new Rank: minor [DESCRIPTION] Added a wait propagator: executes a function when a variable (or variables) become(s) assigned. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added a wait propagator: executes a function when a variable (or variables) become(s) assigned. [ENTRY] Module: driver What: new Rank: major [DESCRIPTION] Added a new module "driver" as a commandline driver for scripts. This is due to popular request: most people have been using the support functionality for examples anyway. This function is now wrapped into a proper module (and Example is now called Script to be more general). See "Modeling with Gecode" for documentation. [ENTRY] Module: support What: new Rank: minor [DESCRIPTION] Support::quicksort and Support::insertion support using the less than operator for the sort order by leaving out the comparator object. [RELEASE] Version: 3.0.2 Date: 2009-03-26 [DESCRIPTION] This is a bug fix release fixing two more embarrassing bugs. However, this time we redesigned our tests carefully such that they cover all changes and optimizations done for the transition from 2.2.0 to 3.0.*. Please update asap. [ENTRY] Module: example What: bug Rank: minor Thanks: Håkan Kjellerstrand [DESCRIPTION] The radiotherapy example was missing in the Makefile. [ENTRY] Module: int What: bug Rank: major [DESCRIPTION] Fixed bug in optimization of extensional constraints with DFAs (hard to reproduce, almost impossible). [ENTRY] Module: minimodel What: bug Rank: major Thanks: Gustavo Guiterrez [DESCRIPTION] Fixed bug in posting of Boolean expressions including reified linear expressions. Again, that escaped our testsuite (also fixed). [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Reoptimized element with integer values and created bizarre testcases. [ENTRY] Module: gist What: change Rank: minor [DESCRIPTION] A separator is printed between solutions in the TextInspector. [RELEASE] Version: 3.0.1 Date: 2009-03-24 [DESCRIPTION] This is a bug fix release fixing two embarrassing bugs that were not caught by our test infrastructure. Please update asap. [ENTRY] Module: int What: bug Rank: major Thanks: Vincent Barichard [DESCRIPTION] Fixed bug in element with integer values. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] IntSetArgs no longer inherit from PrimArgArray, which was wrong as IntSet is no primitive type and hence does not support vararg initializers. [ENTRY] Module: example What: bug Rank: minor [DESCRIPTION] The examples now pass the c-d and a-d command line options correctly to Gist. [ENTRY] Module: int What: bug Rank: major Thanks: Alberto Delgado [DESCRIPTION] Fixed bug in reified Boolean linear constraints (an optimization is currently disabled and will be active in the next release: the optimization was incorrect and was never tested). [ENTRY] Module: example What: bug Rank: minor Bug: 56 Thanks: Chris Mears [DESCRIPTION] The Steel Mill Slab Design example had two bugs in the search heuristic and a missing redundant constraint. [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] Added new example for Radiotherapy. [RELEASE] Version: 3.0.0 Date: 2009-03-13 [DESCRIPTION] This release is a major consolidation release: interfaces have been cleaned up (consistent parameter passing, consistent naming, simpler Gist interface, namespaces for operator overloading); some functionality has been extended (propagators can be non-monotonic; branchings support tie-breaking and random variable and value selection); some functionality that did not meet our quality goals has been removed (complete set variables, reflection); usage has been simplified (auto-linking on Windows, more commonly used filename extensions); important aspects have been optimized (memory management, memory usage and efficiency on 64bit machines). These cleanups were in particular necessary to make %Gecode easier to document (this release is the first to be accompanied by tutorial documentation explaining how to model with %Gecode). Apart from that, many small fixes and additions. Please see below for the details. As the interfaces have changed considerably, please consult \ref PageHowToChange_3 "How to Change to Gecode 3.0.0". [ENTRY] Module: example What: performance Rank: minor Thanks: Håkan Kjellerstrand [DESCRIPTION] Improved branching for Nonogram examples. [ENTRY] Module: set What: bug Rank: minor Thanks: Stefano Gualandi [DESCRIPTION] Fixed bug in creation of set variables. [ENTRY] Module: kernel What: bug Rank: major Thanks: Vincent Barichard [DESCRIPTION] Updating of a council of advisors crashed if a propagator has no advisors (as we had no example of this kind of propagators). [ENTRY] Module: set What: change Rank: minor [DESCRIPTION] Element and convexity constraints on set variables have a more uniform interface, and the match constrained has been renamed to channel. [ENTRY] Module: gist What: change Rank: minor [DESCRIPTION] Gist now takes an optional argument specifying options for the search, including the inspectors to be used. The Qt interface has been cleaned up, so that Gist is easier to extend. [ENTRY] Module: gist What: new Rank: minor [DESCRIPTION] Added inspectors that react on every solution instead of a double click. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] A TupleSet must be finalized before an extensional constraint can be posted using it. [ENTRY] Module: set What: removed Rank: minor [DESCRIPTION] Removed automatically generated set projectors, they will come back eventually. This makes no change to the available functionality for set variables. [ENTRY] Module: cpltset What: removed Rank: major [DESCRIPTION] Complete sets have been removed (just not good enough). [ENTRY] Module: kernel What: new Rank: minor Author: Filip Konvicka [DESCRIPTION] Integrated space and region-based allocators that work with STL classes. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed bug in domain consistent min and max propagators. [ENTRY] Module: int What: performance Rank: major Author: Tias Guns [DESCRIPTION] Integrated an efficient implementation of reified linear constraints over Boolean variables. [ENTRY] Module: example What: bug Rank: minor Thanks: Stefano Gualandi [DESCRIPTION] A bug in the independent set example has been fixed (most edges were ignored). [ENTRY] Module: set What: new Rank: minor [DESCRIPTION] More set branching strategies have been added (for instance random variable and value selection), as well as set assignment. [ENTRY] Module: other What: removed Rank: major [DESCRIPTION] All support for reflection has been removed: not clean enough, not powerful enough, too difficult, and too much trouble. [ENTRY] Module: kernel What: new Rank: minor Thanks: Denys Duchier [DESCRIPTION] Added support for synchronized execution during branching (executes a function). [ENTRY] Module: kernel What: change Rank: major [DESCRIPTION] The specification of propagation cost has changed. It now must be computed by the static member functions of the class Gecode::PropCost. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added support for synchronized execution that executes a function or a static member function when a Boolean variable becomes assigned (called when). [ENTRY] Module: int What: change Rank: minor Thanks: David Rijsman [DESCRIPTION] Make the variable deltas generated for minus_r more meaningful if possible. [ENTRY] Module: iter What: documentation Rank: minor Thanks: Anden Blah, Morten Boysen [DESCRIPTION] Mention that arrays for Iter::Values::Arrays must be sorted. [ENTRY] Module: int What: bug Rank: major Thanks: Roland Yap Hock Chuan [DESCRIPTION] Fixed off-by-one bug in extensional for DFAs. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] The clone operation on spaces is now const. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] TupleSet now accepts duplicate tuples. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] Renamed size() to ranges() for IntSet (returning the number of ranges). Added a size() and width() function that return the size and width of the set respectively. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] Introduced CopiedHandle as a new base class for SharedHandle. [MORE] A copied handle provides access to an object that is used by entities in a space, and that is copied when then space is copied. This abstraction can be used e.g. to pass information between different entities in a space, such as between propagators and branchings. [ENTRY] Module: support What: bug Rank: minor Thanks: Michal Dobrogost [DESCRIPTION] Sorting (quicksort and insertion) require strict orders and now work with arrays of more than 2^32 elements. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Integer sets can now be initialized from integer argument arrays. [ENTRY] Module: other What: bug Rank: minor Thanks: Chris Mears [DESCRIPTION] Output operators (<<) now respect formatting width and work with output streams using arbitrary character types. [ENTRY] Module: kernel What: change Rank: minor Thanks: Denys Duchier [DESCRIPTION] Made macros semicolon-safe. [ENTRY] Module: set What: bug Rank: minor Thanks: Denys Duchier [DESCRIPTION] Fixed constructors for set variables. They now throw proper exceptions when trying to create empty variable domains. [ENTRY] Module: set What: new Rank: minor Thanks: Denys Duchier [DESCRIPTION] Added reified propagators constraining an integer variable to be the minimum or maximum element of a set variable. [ENTRY] Module: int What: removed Rank: minor [DESCRIPTION] Support for PropKind has been removed for all but extensional constraints. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Domain constraints (dom) also accept integers now. [ENTRY] Module: other What: change Rank: major Thanks: Max [DESCRIPTION] All operators are now in their correct namespace. [ENTRY] Module: minimodel What: change Rank: minor [DESCRIPTION] LinExpr, LinRel, BoolExpr are now part of the Gecode namespace rather than Gecode::MiniModel (to support operator resolution). [ENTRY] Module: test What: new Rank: minor [DESCRIPTION] Tests for testing claims of bounds(Z) and bounds(D) consistency. These tests would have found the bug in the binary min and max propagators. [MORE] An integer test can enable these new tests by setting the contest member to CTL_BOUNDS_Z or CTL_BOUNDS_D. For domain-consistency propagators the contest member is set automatically to CTL_DOMAIN. If no consistency-testing should be done, contest should be set to CTL_NONE. [ENTRY] Module: search What: new Rank: minor [DESCRIPTION] The search engines now collect statistics for the number of nodes visited and the maximum depth of the search tree. The information for number of clone and commit operations has been removed as it was too confusing. [ENTRY] Module: search What: new Rank: major [DESCRIPTION] Search engines have been completely reimplemented. [ENTRY] Module: int What: bug Rank: minor Thanks: Jonathan Cederberg [DESCRIPTION] The binary min and max propagators did not do all pruning they should do. [MORE] Given the constraint x = max(y,z) with the store {x->{1,2,3}, y->{1,2}, z->{3}}, propagation did not yield any new information (now it gives the correct result {x->{3}, y->{1,2}, z->{3}}). [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] New example: the steel mill slab design problem (Problem 38 in CSPLib). [MORE] The model used is from Gargani and Refalo, "An efficient model and strategy for the steel mill slab design problem.", CP 2007. The symmetry-breaking search is from Van Hentenryck and Michel, "The Steel Mill Slab Design Problem Revisited", CPAIOR 2008. [ENTRY] Module: iter What: bug Rank: minor Thanks: Stefano Gualandi [DESCRIPTION] Fixed init method of SingletonAppend range iterator. [ENTRY] Module: example What: bug Rank: minor [DESCRIPTION] Fixed a bug in the extensional propagation-version of the domino example. [ENTRY] Module: other What: new Rank: minor [DESCRIPTION] For the Microsoft compiler, auto-link information is added during compilation. [MORE] That is, by including %Gecode headers during compilation the right libraries will be found automatically during linking. To simplify development and deployment, the libraries (and DLLs) encode version, platform, and build type (release or debug) in their filename. [ENTRY] Module: minimodel What: performance Rank: minor [DESCRIPTION] Posting constraints according to Boolean expressions now uses a negation normalform and by this avoids any propagator for negation and uses fewer propagators due to the new clause constraint. [ENTRY] Module: other What: change Rank: major [DESCRIPTION] Changed naming scheme for files. [MORE] All files with extension .cc have been renamed to .cpp, and .icc has become .hpp. This avoids conflicts as .icc is typically used for other file types. All include directives are now specified using <...> notation instead of "...", so that %Gecode headers do not clutter the include namespace of a client program. [ENTRY] Module: minimodel What: change Rank: minor [DESCRIPTION] The Matrix class is now in the Gecode namespace (and not in Gecode::MiniModel). [ENTRY] Module: set What: change Rank: minor [DESCRIPTION] Reorganized the internal data structures of set variables so that each variable takes up 8 bytes less memory on 64 bit machines. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] The index structure for variable dependencies is now implemented using integers instead of pointers, saving memory on 64 bit machines. [MORE] For example, the index structure of integer variables is now 40% smaller, for Boolean variables (which have the smallest possible index structure) we still save 16%. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added a Boolean clause constraint that supports conjunction and disjunction of both positive and negative variables. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Now n-ary Boolean disjunction and conjunction are constant time (rather than linear time, as before), even when a variable for the result is used. [ENTRY] Module: kernel What: change Rank: major [DESCRIPTION] %Gecode now supports weakly monotonic propagators. [MORE] A weakly monotonic propagator must only be able to decide for assignments whether they are solutions or not (which is a very natural property as it means the propagator must be a correct implementation of a constraint). Otherwise, the propagator does not have to be monotonic, it can even be indeterministic. Weakly monotonic but not monotonic propagators must notify a space about their existence: if a weakly monotonic propagator is created, it must execute "home.notice(*this,AP_WEAKLY)"; if it is disposed, it must execute "home.ignore(*this,AP_WEAKLY)". [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] The functions force and unforce of an actor to force disposal have been removed. [MORE] Now, the new interface based on notice and ignore using actor properties must be used instead. So, instead of "force(home)", write "home.notice(*this,AP_DISPOSE)" and, instead of "unforce(home)", write "home.ignore(*this,AP_DISPOSE)". [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] The incremental extensional propagator for tuplesets uses less memory (around 25%) and reports its size correctly. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] The element propagator for integer arrays now chooses datastructures according to and the elements of the array. [MORE] This can save more than 80% memory on a 64 bit machine, and up to 75% on a 32 bit machine. In common cases, one can expect a reduction by at least 50%. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] The regular propagator now chooses datastructures according to the size of the DFA. This can save up to 80% memory on a 64 bit machine, and still up to 50% on a 32 bit machine. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] The home space is now also passed to the cost function of a propagator. [ENTRY] Module: other What: change Rank: major [DESCRIPTION] Now everything is passed as reference (Space, Propagator, ModEventDelta, Advisor, Branching, and BranchingDesc). [MORE] The reason for this massive change is to be more C++ compliant and make the interfaces more consistent (at some places things were passed as references and at other places as pointers, for no obvious and explainable reason). Routines that create objects rather than pass them (such as copy, clone, or description) still return a pointer to an object (so that it can actually be deleted!). You will have to rewrite your models and other programs using %Gecode. For models this is easy enough: - Replace "(Space* home" by "(Space& home". - Replace "home->" by "home.". - Replace "(this" by "(*this". . That should do the trick for 99% of the models. For the other changes, just lookout for the changes in types and that "this" becomes "*this" now. [ENTRY] Module: other What: change Rank: major [DESCRIPTION] The memory management has been completely reworked. [MORE] It is now more robust, more portable (does not use alloca any longer), more efficient, fits C++ better and is much easier too understand. There are now three memory areas: a single heap, spaces, and regions. Heap and spaces are as before. A region (an object of class Region) is a simple and very efficient memory manager for temporary memory managed in a stack fashion. These three memory managers provide uniform operations for allocation (alloc), deallocation (free), and reallocation (realloc). These operations use constructors, destructors, and assignment operators as required by C++ and are implemented with efficient specializations for basic data types. [ENTRY] Module: support What: removed Rank: minor [DESCRIPTION] PQueue has been removed (too specialized to be reused anyway). [ENTRY] Module: support What: removed Rank: minor [DESCRIPTION] GECODE_AUTOARRAY has been removed. Use a Region for memory management instead. [ENTRY] Module: support What: removed Rank: minor [DESCRIPTION] GECODE_AUTOSTACK and SentinelStack has been removed. Use StaticStack instead. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Simpler and more efficient memory management for element propagators (integer arrays). [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] All functions for checking sharing for arrays (same, shared, unique) require a space argument (for memory management). [ENTRY] Module: minimodel What: new Rank: minor [DESCRIPTION] Added MinimizeSpace and MaximizeSpace classes for cost-based optimization (requires implementing a cost function returning an integer cost variable). Optimization can now be implemented by inheriting from these classes rather than from Space and by implementing a cost function. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] The description() member function of a space is not any longer const: it can be called at most once. [ENTRY] Module: kernel What: change Rank: major [DESCRIPTION] The constrain method used for best solution search must be virtual and takes an argument of type const Space& rather than Space* as argument. [ENTRY] Module: int What: change Rank: major [DESCRIPTION] Tie-breaking and random selection for branch is now supported. [ENTRY] Module: set What: change Rank: major [DESCRIPTION] The values for variable and value selection for branching have been made consistent and extended. [MORE] The following values have been renamed: - SET_VAR_MIN_CARD -> SET_VAR_SIZE_MIN - SET_VAR_MAX_CARD -> SET_VAR_SIZE_MAX - SET_VAR_MIN_UNKNOWN_ELEM -> SET_VAR_MIN_MIN - SET_VAR_MAX_UNKNOWN_ELEM -> SET_VAR_MAX_MAX - SET_VAL_MIN -> SET_VAL_MIN_INC - SET_VAL_MAX -> SET_VAL_MAX_INC . Tie-breaking and random selection is now supported. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] The variable selection INT_VAR_DEGREE_MIN and INT_VAR_DEGREE_MAX do not have tiebreaking with smallest domain size built in. [MORE] The old behavior can be reclaimed by explicit tiebreaking, for example replace INT_VAR_DEGREE_MAX by tiebreak(INT_VAR_DEGREE_MAX,INT_VAR_SIZE_MIN). [ENTRY] Module: kernel What: change Rank: major [DESCRIPTION] View and value branchings have been completely reimplemented to support tie-breaking and state (for randomized selection). [ENTRY] Module: kernel What: removed Rank: major [DESCRIPTION] View and value assignments have been removed as they now can be expressed by view and value branchings. [RELEASE] Version: 2.2.0 Date: 2008-08-25 [DESCRIPTION] This release adds many domain consistent propagators for arithmetic constraints and fixes a number of bugs. Some of these bugs fixed are potentially serious, in particular as they occur very seldom. Please change to 2.2.0 as soon as possible (in particular if you are using the 64bit Microsoft Visual C++ compiler). And, of course, the usual small fixes and changes. [ENTRY] Module: kernel What: bug Rank: major [DESCRIPTION] Fixed a bug in the memory alignment on Windows 64bit (very hard to reproduce). [ENTRY] Module: other What: new Rank: minor [DESCRIPTION] Added configure options for adding a prefix and a suffix to the names of the compiled libraries. [ENTRY] Module: int What: bug Rank: major [DESCRIPTION] Fixed a bug in the domain consistent distinct propagator that would cause a stack overflow under rare circumstances. [ENTRY] Module: set What: bug Rank: major [DESCRIPTION] The ternary intersection propagator was incorrect if any of the sets had a maximum cardinality of Set::Limits::card. [ENTRY] Module: int What: new Rank: minor Thanks: Raphael Reischuk [DESCRIPTION] The attempt to access the value of an unassigned integer or Boolean variable (IntVar or BoolVar) throws an exception now. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added bounds consistent division/modulo propagator. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] All functional linear and arithmetic constraints now put sharp bounds on the output variable (eases interfacing to modelling languages). [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] The channel constraint now comes in a version that allows to specify offsets to the array indices. [ENTRY] Module: example What: removed Rank: minor [DESCRIPTION] Example-based support for SAC (singleton arc consistency) has been removed. Might be reintroduced later in a more general fashion. [ENTRY] Module: other What: new Rank: minor [DESCRIPTION] The Makefile has a new target, check, which performs a minimal integrity check using some tests from the test suite. [ENTRY] Module: set What: change Rank: minor [DESCRIPTION] The set selection constraints are now called element. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed bug for domain-consistent distinct that never occurred in practice. [ENTRY] Module: kernel What: bug Rank: minor [DESCRIPTION] Fixed bug that could potentially have affected certain staged propagators. [ENTRY] Module: kernel What: documentation Rank: minor Thanks: David Rijsman [DESCRIPTION] Fixed explanation of ES_FIX and ES_NOFIX for advisors (description was mixed up). [ENTRY] Module: other What: change Rank: minor [DESCRIPTION] The configure script now always uses the Microsoft compiler on Windows. Use the CC and CXX environment variables to override this if you want to use gcc. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added domain consistent multiplication propagator. [ENTRY] Module: kernel What: bug Rank: major Thanks: Filip Konvicka [DESCRIPTION] Generated variable stubs were wrong (could only be observed for new variable types). [ENTRY] Module: int What: bug Rank: minor Thanks: David Rijsman [DESCRIPTION] Cumulatives did not do all the pruning it should do. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed bug in element with IntArgs and sharing between the two IntVars. [ENTRY] Module: int What: bug Rank: minor Thanks: Jaroslav Mlejnek [DESCRIPTION] Fixed bug in sqrt. [ENTRY] Module: int What: bug Rank: minor Thanks: David Rijsman [DESCRIPTION] Fixed bug in ValSplitMin::branchingSpec. [ENTRY] Module: kernel What: removed Rank: minor [DESCRIPTION] Removed ViewTuple. Just not useful enough... [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] Cleaned up Reflection::Var type, overloading did not conform to the C++ standard. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added domain consistent minimum (min) and maximum (max) propagators. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added domain consistent square root propagator (sqrt). [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added domain consistent squaring propagator (sqr). [ENTRY] Module: int What: documentation Rank: minor [DESCRIPTION] Added documentation for domain consistent absolute value (abs) propagator. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added reified propagators for relations over Boolean variables. [RELEASE] Version: 2.1.1 Date: 2008-03-06 [DESCRIPTION] This is a bugfix release. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Non-shared copying of dfa was broken (matters only for parallel execution). [ENTRY] Module: kernel What: bug Rank: major [DESCRIPTION] The generated med_updated function was incorrect, resulting in potential crashes of programs that use SetVars. [ENTRY] Module: cpltset What: documentation Rank: minor [DESCRIPTION] The CpltSet variables are now in the correct documentation group. [ENTRY] Module: gist What: bug Rank: minor [DESCRIPTION] Fixed redraw artefacts on Windows. [ENTRY] Module: other What: bug Rank: minor [DESCRIPTION] Fixed boost serialization. [ENTRY] Module: kernel What: bug Rank: minor [DESCRIPTION] Made the constructor of Reflection::Var explicit, otherwise overloading for output stream operators does not work as expected. [RELEASE] Version: 2.1.0 Date: 2008-02-29 [DESCRIPTION] This release makes two essential contributions: a partly reimplemented kernel that is faster, is simpler, and uses less memory and lots of small and not so small fixes. This release is the first release where really everything that we can test (rather than everything that we initially believed to matter) has been systematically tested. So, better switch now to 2.1.0! Apart from that, the value range for variables has been increased (basically, 32 bits minus three values, so that is 32 bits), the reflection API is now fully functional and no longer considered experimental, and we have the usual small additions. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added interface to extensional constraints defined by TupleSets with BoolVars. [ENTRY] Module: minimodel What: bug Rank: major [DESCRIPTION] Reimplemented linear expressions from scratch, they were just hopelessly screwed. [ENTRY] Module: minimodel What: bug Rank: minor [DESCRIPTION] Added work-around for compiler bug in MSVC. [ENTRY] Module: minimodel What: new Rank: minor [DESCRIPTION] Support reified linear expressions with Boolean variables. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] Throw an exception if variables occur multiply for array-based channel constraints. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed multiplication propagator for x*y=x. [ENTRY] Module: search What: change Rank: major [DESCRIPTION] All search engines now take an option value for configuration instead of individual arguments for recomputation, stop objects, etc. [ENTRY] Module: minimodel What: removed Rank: minor [DESCRIPTION] Removed scheduling abstractions. [ENTRY] Module: int What: removed Rank: minor [DESCRIPTION] Removed extensional constraints with offset arguments. [ENTRY] Module: minimodel What: new Rank: minor [DESCRIPTION] All minimodel functionality now understands both IntConLevel and PropKind arguments. [ENTRY] Module: set What: bug Rank: major [DESCRIPTION] Fixed bugs in several set constraints: rel(Space*,SetVar,IntRelType irt,IntVar) for irt=IRT_NQ, rel(Space*,SetVar,SetOpType sot,const IntSet&,SetRelType srt,SetVar) for sot=SOT_MINUS, srt=SRT_SUP, selectDisjoint, selectUnion with constant IntSet arguments, dom with SRT_NQ. [ENTRY] Module: kernel What: bug Rank: minor [DESCRIPTION] Fixed bug in unreflection of empty VarArrays. [ENTRY] Module: linear What: bug Rank: major [DESCRIPTION] Fixed overflow checking error in linear constraints. [ENTRY] Module: minimodel What: new Rank: minor [DESCRIPTION] Added sqrt function. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added sqrt propagator. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added sqr post function. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] The overloaded versions of dom for variable arrays could not be resolved automatically. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added missing branching for INT_VAR_SIZE_DEGREE_MIN and INT_VAR_SIZE_DEGREE_MAX for Boolean variables. [ENTRY] Module: minimodel What: bug Rank: major Thanks: Stanimir Dragiev [DESCRIPTION] Fixed bug in posting linear expressions. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] IntSet have been reimplemented for efficiency. [ENTRY] Module: other What: documentation Rank: minor Thanks: Martin Mann [DESCRIPTION] Function prototypes are now highlighted in the detailed function documentation. [ENTRY] Module: int What: removed Rank: minor [DESCRIPTION] The offset arguments for element constraints have been removed, as you can simply add dummy elements to the array to achieve the same effect. [ENTRY] Module: set What: removed Rank: minor [DESCRIPTION] The offset arguments for selection constraints have been removed, as you can simply add dummy elements to the array to achieve the same effect. [ENTRY] Module: other What: new Rank: major [DESCRIPTION] The serialization library now contains a registry of all the %Gecode post functions. This makes interfacing to %Gecode much easier. The registry is automatically generated from the post functions defined in gecode/int.hh and gecode/set.hh. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] Cleaned up reflection. Unreflection is now part of the kernel instead of the serialization library. Branchings now provide a human-readable description of a BranchingDesc. The name function of a Propagator has been renamed to ati (actor type identifier). All reflection is now const where possible. Unreflection of variables now checks dynamically that the variable types match. Unreflection of propagators checks the number of arguments. A tutorial-style section on reflection has been added to the documentation. [ENTRY] Module: set What: change Rank: major [DESCRIPTION] The limits for set variables have been moved from Limits::Set to Set::Limits. The range of set variables has been adapted to the range of integer variables. For example, on a standard machine (regardless of 32 or 64 bits), a set can hold values from -2^30+2 to 2^30-2, its maximum cardinality therefore is 2^31-3. [ENTRY] Module: int What: change Rank: major [DESCRIPTION] The limits for set variables have been moved from Limits::Set to Set::Limits. The range of integer variables have been extended by one bit. For example, on a standard machine (regardless of 32 or 64 bits), the largest possible integer value for an integer variable is 2^31-2, the smallest -2^31+2. With other words, only the integer values 2^31-1, -2^31, and -2^31+1 are missing from the two-complement representation (and we will never use these values for the sake of mental sanity. We promise.). [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Distinct with integer offsets checks accurately for overflow now. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Boolean variables consume 20% less memory. [ENTRY] Module: kernel What: change Rank: major [DESCRIPTION] Only stable and non-failed spaces can be cloned, otherwise Space::clone raises an exception. This makes cloning and propagation fully orthogonal. To emulate the old behavior, just execute Space::status before Space::clone. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] The number of propagators and branchings can be accurately retrieved from both failed and non-stable spaces. [ENTRY] Module: examples What: new Rank: minor [DESCRIPTION] Added an example that interprets a JavaScript program and runs a search of the model that the program encodes. This is an example of how to use the JavaScript interpreter. A simple JavaScript model for n-Queens has been added, too. [ENTRY] Module: kernel What: new Rank: minor [DESCRIPTION] A generic variable class has been added that can be used for interfacing. It can store arbitrary %Gecode variables (e.g. IntVar and SetVar), and cast them back using a run-time type check. The update, reflection, and output operations are implemented through the reflection registry. [ENTRY] Module: other What: new Rank: major [DESCRIPTION] (De-)Serialization to and from JavaScript added. [ENTRY] Module: other What: change Rank: major [DESCRIPTION] Both the cost and propagate function of a propagator take the current modification event delta as input. Likewise, retrieving the modification event for a particular View must use the static function View::me with the passed modification event delta. Again, this feature committed the kernel to a particular implementation which might not be available in the future. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] Views and variables do not any longer reveal whether they have been modified: this feature committed the kernel to a particular implementation which might not be available in the future. [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] Simple Singleton Arc Consistency pre-processing has been added as an optional step for examples. [ENTRY] Module: kernel What: change Rank: major [DESCRIPTION] The kernel has undergone some cleanups and improvements (much of it got actually reimplemented): - Automatically generated stubs for variable implementations are directly inlined into the kernel. This improves performance, but more importantly, lifts some limits on the number of variables. Now, the only limit is that the sum of the ceiling of the logarithms of the number of modification events of all variables does not exceed 32 (as an estimate, the kernel now can handle around 10 to 16 variable types). Moreover, if the need for more variable types arises this is straightforward to do. - The addition of new variable types for users has been simplified. - The main propagation loop has been entirely rewritten (much much simpler). Now, the kernel does not optimize any longer for the case that a variable is modified more than once during propagator execution. While this changes the asymptotic complexity, it reduces the propagator execution overhead by up to 30%. And a propagator is still free to make sure that a variable is modified only once (many propagators do that already). - Variable implementations became smaller by one word. Now variable implementations are optimal in the sense that no additional memory is needed for cloning or book-keeping, the memory required for propagation is sufficient. - Spaces have lost some weight as memory for datastructures only used during cloning or propagation are shared (saves some 25% of memory per space). [ENTRY] Module: kernel What: change Rank: major [DESCRIPTION] Propagator modification events have been renamed to modification event deltas (because that is what they are). [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] To not confuse variable implementations with variables, variable implementations are now always called VarImp, and not Variable. [ENTRY] Module: gist What: new Rank: major [DESCRIPTION] The %Gecode Interactive Search Tool (Gist), a Qt-based graphical search engine, is now part of the main %Gecode distribution. It is currently included as an experimental beta preview and may not be completely stable yet. [RELEASE] Version: 2.0.1 Date: 2008-02-07 [DESCRIPTION] This is a bug-fix only release. Very unfortunately, it fixes three serious bugs in search (LDS, Restart, and assignment branchings). We highly encourage you to switch to Gecode 2.0.1 as soon as possible. [ENTRY] Module: test What: bug Rank: minor [DESCRIPTION] Fixed memory leak in reflection tests. [ENTRY] Module: set What: bug Rank: minor [DESCRIPTION] Fixed memory leak in set projection propagators. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed memory leak in IntSet. [ENTRY] Module: test What: new Rank: major [DESCRIPTION] Added comprehensive tests for all search engines. [ENTRY] Module: search What: bug Rank: major [DESCRIPTION] Assignment branchings wrongly reported that they feature two alternatives rather than one. [ENTRY] Module: search What: bug Rank: major Thanks: Stefano Gualandi [DESCRIPTION] LDS had numerous quirks. It has been fixed and greatly improved: it detects when the entire search tree has been probed, independent of the maximal discrepancy. [ENTRY] Module: search What: bug Rank: major Thanks: Stefano Gualandi [DESCRIPTION] Restart was broken in case the problem failed immediately with propagation only, both when being initialized or when requesting a next solution. [ENTRY] Module: iter What: bug Rank: minor Thanks: David Barton [DESCRIPTION] Changed Ranges::Diff to make older versions of gcc happy. [ENTRY] Module: other What: bug Rank: minor Thanks: David Barton [DESCRIPTION] Fixed linking order so that static linking works again. [ENTRY] Module: int What: new Rank: minor Thanks: Mohamad Rabbath [DESCRIPTION] Re-added reified linear constraints for Boolean variables. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Domain-consistent abs could crash in certain (extremely rare) border cases. [ENTRY] Module: kernel What: bug Rank: major [DESCRIPTION] Static initialization order was undefined, making reflection work unreliably. In particular, linking Gecode statically did not work. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Initializing an IntVar with an empty IntSet did not throw the appropriate exception but crashed. [ENTRY] Module: kernel What: bug Rank: minor [DESCRIPTION] Exceptions did not have rtti information when compiled with gcc and visibility, which meant that they could not be caught. [ENTRY] Module: example What: bug Rank: minor Thanks: Helmut Simonis [DESCRIPTION] Fixed a bug and quirk in %Kakuro puzzles. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] The VarMapIter can now return both a specification and the actual VarBase* of the currently iterated variable. [ENTRY] Module: other What: bug Rank: minor [DESCRIPTION] Revived boost serialization. The serialization functions will be compiled if Gecode is configured with --with-boost. [ENTRY] Module: kernel What: performance Rank: minor [DESCRIPTION] Be less aggressive in increasing size of heap chunks. [ENTRY] Module: int What: documentation Rank: minor [DESCRIPTION] Fixed bug in documentation of table-based extensional constraint. [ENTRY] Module: kernel What: bug Rank: minor [DESCRIPTION] Fixed a bug in the hash function for pointers, which could return negative array indices. [RELEASE] Version: 2.0.0 Date: 2007-11-14 [DESCRIPTION] As witnessed by the version number change, this is a major release with too many changes, fixes, and additions to mention them all: please consult the changelog. The highlights are: - New propagators: channeling between Integer variable and array of Boolean variables, circuit, table constraint (extensional), incremental regular constraint (extensional), incremental Boolean linear constraints - Boolean variables have a dedicated implementation: twice as fast, half the memory - Advisors for incremental propagation (see: Lagerkvist, Schulte, Advisors for Incremental Propagation, CP 2007) - Many crucial performance and scalability improvements: memory management, memory footprint of propagators - Many cleanups and more documentation, many new examples - New set variables with complete domain representation (CpltSetVar) [experimental] - A reflection API to query spaces about their propagators [experimental] The features marked as experimental are all functional, but might be revised in the next releases. As %Gecode 2.0.0 is a major release, you might have to adapt your programs: \ref PageHowToChange_2 "How to Change to Gecode 2.0.0". [ENTRY] Module: int What: new Rank: major [DESCRIPTION] Added table-based extensional constraint. [ENTRY] Module: other What: new Rank: minor [DESCRIPTION] When compiling with gcc, the default visibility of symbols in the generated dynamic library is set to hidden. [ENTRY] Module: set What: removed Rank: minor [DESCRIPTION] Removed buggy distinct propagator for finite sets. [ENTRY] Module: example What: new Rank: minor Thanks: Helmut Simonis [DESCRIPTION] New example: %Kakuro puzzles. [ENTRY] Module: other What: new Rank: minor Thanks: Martin Mann [DESCRIPTION] Added dist and distdir targets for creating source distribution. [ENTRY] Module: other What: new Rank: minor Thanks: Filip Konvicka [DESCRIPTION] On windows with MSVC, always build program database files to ease debugging of applications using %Gecode (files are also included in packages). [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Added new variable selection based on largest or smallest quotient of size and degree. [ENTRY] Module: other What: new Rank: minor [DESCRIPTION] Variable arrays, view arrays, and argument arrays can directly be printed on standard output streams. [ENTRY] Module: other What: change Rank: minor [DESCRIPTION] The structure of includes has been drastically simplified. Support for iterators ("gecode/iter.hh") is automatically included with integers ("gecode/int.hh") and sets ("gecode/set.hh"). Likewise, all support functionality becomes available by including "gecode/support.hh" (one can assume that this is included in "gecode/kernel.hh"). [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] Shared arrays are now available in the kernel (where they properly belong). This entails that they are available in the Gecode namespace and not in Gecode::Support. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] The extensional constraint specified by a DFA or a regular expression (formerly known as regular) is now named "extensional" rather than "regular". [ENTRY] Module: minimodel What: bug Rank: minor [DESCRIPTION] Fixed small quirk in posting an absolute propagator via a function. [ENTRY] Module: set What: new Rank: minor [DESCRIPTION] Added channeling propagator between a SetVar and a BoolVarArray that propagates the characteristic function of the set to the Boolean variables. [ENTRY] Module: set What: performance Rank: minor [DESCRIPTION] Changed the datastructure for set variables to use singly-linked lists. [ENTRY] Module: other What: change Rank: minor [DESCRIPTION] The values (and types) for selecting how to branch have been made uniform for all variables types: they start with INT_ (or SET_ or CPLTSET_), followed by either VAL or VAR and the respective strategy. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] The interface for the global cardinality constraint has been simplified. The constraint is now called count. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] Regular expressions (REG) have been moved from the integer module to the minimodel module. [ENTRY] Module: example What: change Rank: major [DESCRIPTION] Most examples have been cleaned up. [ENTRY] Module: example What: change Rank: minor [DESCRIPTION] Parsing of commandline arguments has been completely redone and is much more extensible and flexible. [ENTRY] Module: other What: change Rank: minor [DESCRIPTION] All of %Gecode has been put under the MIT license (which the previous license was a simple rewording of). [ENTRY] Module: other What: bug Rank: minor [DESCRIPTION] Removed huge number of casts that could (only potentially) compromise portability. [ENTRY] Module: set What: new Rank: minor [DESCRIPTION] Finite set projectors can now be specified using formulas, in addition to set expressions. [ENTRY] Module: cpltset What: new Rank: major [DESCRIPTION] Finite integer set variables with complete domain representation, based on binary decision diagrams (BDDs), have been added as a new variable type. [ENTRY] Module: kernel What: new Rank: major [DESCRIPTION] A reflection API has been added, which allows querying spaces about the variables and propagators they contain. [ENTRY] Module: kernel What: bug Rank: major [DESCRIPTION] Branching ids were not properly initialized. This was a serious problem if you posted branchings in spaces other than the root space. [ENTRY] Module: int What: change Rank: major [DESCRIPTION] Iterator-based domain operations have been renamed, reimplemented, and extended. Now operations for both range and value iterators are supported and the operations can be told to perform more efficient destructive updates. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] Sortedness constraints have been renamed to sorted constraints. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] VarArrays can now be resized dynamically. [ENTRY] Module: int What: performance Rank: major [DESCRIPTION] Boolean linear equations and inequalities with constant right-hand sides use constant time propagators whenever appropriate (linear time with less overhead and memory for propagators with few variables). [ENTRY] Module: kernel What: new Rank: major [DESCRIPTION] Added advisors as an abstraction for incremental propagation: advisors are executed for their propagator whenever their view changes. Advisors, when not being used, add one word of overhead to each variable and slow down the system in the worst case by less than 1%. In average, no slowdown can be observed. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed a border-case bug for n-ary Boolean conjunction and disjunction. [ENTRY] Module: kernel What: new Rank: minor [DESCRIPTION] A new propagation condition PC_GEN_NONE (and hence, PC_INT_NONE, ...) has been introduced. Propagator patterns with this propagation condition now do not create any subscriptions. [ENTRY] Module: int What: performance Rank: major [DESCRIPTION] The regular constraint has been reimplemented, the new version runs more than twice as fast. [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] Added a model for the traveling salesman problem, mostly intended to exercise the new circuit constraint (as the model is not very competitive). [ENTRY] Module: kernel What: new Rank: major [DESCRIPTION] Support for reference-counted shared objects added: they handle both reference counting as well as non-shared copying. This fixes some bugs with the handling of shared arrays, integer sets, and finite automata. [ENTRY] Module: example What: bug Rank: minor [DESCRIPTION] Examples reported wrong number of propagator invocations (the invocations for problem setup were missing). [ENTRY] Module: kernel What: new Rank: major [DESCRIPTION] Added classes for shared objects and handles. Handles to shared objects allow to either share copies among spaces when being copied or to create a new shared copy, if requested. [ENTRY] Module: int What: new Rank: minor Thanks: Martin Mann [DESCRIPTION] Added a new version of count (and also atleast, atmost, exactly) that counts the number of variables equal to integers in an array. [ENTRY] Module: example What: bug Rank: minor Bug: 50 [DESCRIPTION] The number of colors in graph-color was off by one. [ENTRY] Module: int What: new Rank: major [DESCRIPTION] Added channel constraints that channel an integer variable to either a single or an array of Boolean variables. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed bug in copying of n-ary or-propagator for a special boundary case. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] Relaxed sharing restrictions for channel, in particular channel(this, x, x) is allowed. [ENTRY] Module: int What: new Rank: major [DESCRIPTION] Added propagators for the circuit constraint. [ENTRY] Module: kernel What: performance Rank: minor [DESCRIPTION] Improved automatic memory management on Windows platforms. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Domain consistent distinct and channel allocate memory from the space heap now. Much simpler. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] The Boolean tell operations one_none and zero_none now also return a ModEvent and hence must be checked for failure. This is needed for simpler advisors. [ENTRY] Module: kernel What: performance Rank: major [DESCRIPTION] The memory management policies have been completely reworked. Now memory requests are much more regular. Hence, memory is much more likely to be returned to the operating system. Furthermore, the flush member functions for actors have been removed (they were unneeded) and actors and spaces now have allocated member functions for returning how much memory is allocated by a space. Moreover, the memory reported by some propagators has been ignored. Note that this flaw did not affect the benchmark figures on the %Gecode webpage. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] The multiplication uses integer precision if possible for better performance. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] Integer and Boolean variables are now guaranteed to be inspectable (that is, all const member functions work on them), even though a space is failed. However, the variables might have been modified during a tell operation that has failed. [ENTRY] Module: minimodel What: change Rank: major [DESCRIPTION] Linear expressions and relations can also be created from Boolean variables, with the restriction that Boolean relations cannot be reified. [ENTRY] Module: int What: change Rank: major [DESCRIPTION] Boolean variables (and hence Boolean views) do not any longer share the implementation with integer variables. That has the following consequences: - Boolean variables are not any longer integer variables. The same holds true for arrays of variables. - All constraints that make sense for both Boolean and integer variables have post functions that support both integer and Boolean variables. - Memory for Boolean variables is reduced by 50% and performance increases in problems with many Boolean variables by up to 50%. [ENTRY] Module: int What: new Rank: major [DESCRIPTION] Added propagators for linear constraints over Boolean variables, in particular specialized and efficient versions for non-unit coefficients. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] The linear constraints are now more careful (that is, they will use more efficient versions more often if it is safe) to determine whether overflow occurs and which precision (integer or double) should be chosen. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] The element constraints now accept an additional offset argument. [ENTRY] Module: set What: new Rank: minor [DESCRIPTION] Added selection and reified relation constraints with constant sets. [ENTRY] Module: set What: change Rank: minor [DESCRIPTION] Slightly stronger inferences for the finite set sequence and selection constraints. [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] New example: the balanced academic curriculum problem (problem 030 from CSPlib). [ENTRY] Module: set What: bug Rank: minor [DESCRIPTION] Fixed the n-ary partition propagator to handle overflow of the sum of cardinalities correctly. [ENTRY] Module: kernel What: bug Rank: minor [DESCRIPTION] Subscription to constant views now should use the propagate member function from a variable implementation: it guarantees execution of a propagator at least once (int and set views have been adopted accordingly). [ENTRY] Module: int What: bug Rank: major Bug: 48 [DESCRIPTION] Branching on maximum regret would always crash on non-range domains. [ENTRY] Module: set What: change Rank: minor [DESCRIPTION] The finite set selection propagators accept an additional argument that specifies where the indexing should start. It should make some models more natural to express, and helps in porting code from other systems, such as Prolog or Mozart. In addition, the selectUnion propagator is now hand-written again, resulting in better performance. [ENTRY] Module: int What: change Rank: major [DESCRIPTION] All Boolean constraints got a new and regular interface. Rather than providing different post functions for the different constraints, the single post function rel is used: the Boolean operation then is described by a value of type BoolOpType. In addition, all Boolean propagators have been reimplemented for better performance and less memory use. [ENTRY] Module: test What: new Rank: minor [DESCRIPTION] Added simple testing for branchings. [ENTRY] Module: kernel What: change Rank: major [DESCRIPTION] The way how propagators report subsumption and partial fixpoints has changed. Now, a propagator must first call dispose (which then cancels subscriptions and possibly frees external resources) and only then can return that the propagator is subsumed. For that purpose a new function Gecode::ES_SUBSUMED has been defined. Likewise, ES_FIX_PARTIAL and ES_NOFIX_PARTIAL are functions rather than member functions of Gecode::Propagator. The benefit is that this saves memory and is more efficient. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] The use of the consistency options were a little confusing, now the rule is: the level of consistency increases from ICL_VAL to ICL_BND to ICL_DOM. [ENTRY] Module: minimodel What: performance Rank: minor [DESCRIPTION] Boolean expressions erroneously decomposed into ternary Boolean constraints, while not incorrect rather inefficient for large Boolean expressions. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] Made all macros type safe. [ENTRY] Module: kernel What: new Rank: major [DESCRIPTION] Added macro GECODE_REWRITE for rewriting propagators. It is strongly advised to always use this macro! [ENTRY] Module: example What: bug Rank: minor Bug: 46 [DESCRIPTION] Orientation of Sudokus now match the orientation in the specification-file. [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] New example: MineSweeper. [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] New example: Domino. [ENTRY] Module: set What: bug Rank: minor [DESCRIPTION] Set projectors could subscribe with bogus propagation conditions. [ENTRY] Module: set What: performance Rank: minor [DESCRIPTION] Performance of the tell operations on finite set variables was improved. Especially the intersect operation benefits from this. [ENTRY] Module: int What: new Rank: minor [DESCRIPTION] The element constraint now also supports integer values as result. [ENTRY] Module: kernel What: new Rank: minor [DESCRIPTION] Add a generic class for assignments during search (similar to generic branchings for views and values). [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] All branching classes for value and view selection are now parametric. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] Boolean variables cannot longer be initialized from an integer variable. If needed, a channel propagator must be posted (added). [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] The equality constraints have been replaced by a variant of rel. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] The propagator abstractions Inhom* have been renamed to Mix*. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] The operations t_one, t_one_none, t_zero, t_zero_none for Boolean views have been renamed to one, one_none, zero, zero_none. [ENTRY] Module: kernel What: performance Rank: major [DESCRIPTION] Explicit disposal of actors has been reimplemented (the old design was nothing but darn stupid). The memory overhead of propagators is reduced by 40% for most propagators and 20% for all. That is, a binary propagator takes 30% less memory and a ternary propagator takes 25% less memory. Programs with many binary or ternary propagators can run up to 20% faster. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] Propagators and branchings that require disposal when a space is deleted must now be explicitly registered via a force function and explicitly deregistered by an unforce function. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed memory leak in reified dom constraint. [ENTRY] Module: set What: bug Rank: minor [DESCRIPTION] Fixed memory leak in distinct constraint for sets. [ENTRY] Module: example What: new Rank: major [DESCRIPTION] New example: Pentominoes. The example uses extensional constraints specified as regular expressions to place irregular-shaped pieces on a board. [RELEASE] Version: 1.3.1 Date: 2006-10-25 [DESCRIPTION] This is a minor release which fixes a major bug (the first real serious bug). Please update as soon as possible. [ENTRY] Module: kernel What: bug Rank: major Thanks: Rafael Meneses [DESCRIPTION] Branch&Bound search with ViewValBranchings (all standard branchings) together with batch recomputation was severely broken. The problems ranged from wrong search trees (missing solutions) to segmentation faults. The fix changes the way assigned variables are removed from the array in a ViewValBranching. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Bounds-consistent distinct catches border case when an assigned variable during bounds propagation leads to value removal for value propagation. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Bounds-consistent distinct eliminates assigned variables more aggressively (can save up to 10% runtime in some cases). [ENTRY] Module: int What: bug Rank: minor Thanks: Alejandro Arbelaez [DESCRIPTION] IntVar::init now also raises exceptions for illegal domain specifications. [RELEASE] Version: 1.3.0 Date: 2006-09-19 [DESCRIPTION] This release adds a compiler for finite set projectors and provides new infrastructure making it easier to add new variable domains. In addition, it contains recent bug fixes and minor improvements. [ENTRY] Module: set What: new Rank: major [DESCRIPTION] Compiler for finite set projectors. Given a specification of a finite set constraint as a projector set, it generates C++ code for the corresponding propagator. Together with the dynamic propagator for finite set projectors, this implements the backend of the technique described in the paper "Generating Propagators for Finite Set Constraints" (Tack, Schulte, Smolka; CP 2006.). [ENTRY] Module: other What: new Rank: minor Thanks: Jorge Marques Pelizzoni [DESCRIPTION] Also pass options for linking standard libraries for MSVC. [ENTRY] Module: other What: bug Rank: minor [DESCRIPTION] The pkg-config files now contain the correct path if you configured to the default prefix (i.e. /usr/local). [ENTRY] Module: minimodel What: new Rank: minor [DESCRIPTION] Added aliases lex, atleast, atmost, and exactly for the count constraint. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] Renamed lex constraint to rel (as it also supports equality and disequality). [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Make count constraints with integer number of equal occurrences more incremental using dynamic subscriptions (gives a 20-30% speedup). [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] Added an example for solving Black Hole patience games. [ENTRY] Module: kernel What: new Rank: major [DESCRIPTION] Subscription to variables now features an additional and optional Boolean argument whether the propagator is to be processed. This allows dynamically creation of subscriptions during propagation. [ENTRY] Module: other What: new Rank: minor [DESCRIPTION] New configure switches: --enable-audit to include audit code, which may contain expensive checks of internal invariants or alternative, checked implementations of critical parts of %Gecode. --enable-universal and --with-sdk, to support building universal binaries on Mac OS X. [ENTRY] Module: kernel What: new Rank: minor [DESCRIPTION] Variables can now be deallocated when the Space is deallocated (for example in case of failure). This is important in case a variable implementation needs to reference external resources. Deallocation can be switched on in the high-level description used for generating the variable implementation. [ENTRY] Module: minimodel What: bug Rank: minor Thanks: Rafael Meneses [DESCRIPTION] Under certain conditions (posting in a failed space), the post function returned uninitialized variables. [ENTRY] Module: kernel What: performance Rank: major [DESCRIPTION] Variable implementations are now generated from a high-level description (taking care of all aspects relating to modification events and propagation conditions). While simplifying the implementation of new variable domains considerably, this also can, in lucky cases, deliver a speed-up of 5%. [ENTRY] Module: kernel What: performance Rank: major [DESCRIPTION] Allocate subscriptions in separate memory area. Can speedup execution in some (but few) cases by up to 15-20%. [ENTRY] Module: int What: documentation Rank: minor Bug: 43 [DESCRIPTION] Fixed documentation problem due to doxygen... [ENTRY] Module: search What: new Rank: major [DESCRIPTION] Branch-and-bound search now interleaves recomputation with adding bounding constraints. This can prune the search tree much earlier: instead of recomputing many nodes from the same copy node and then adding a constraint that fails all these nodes, it might be possible to already fail the copy node directly. In principle, the difference can be exponential, however for examples we tried the effect is minor. [ENTRY] Module: kernel What: bug Rank: minor [DESCRIPTION] Now commits can be interleaved with adding new constraints during batch recomputation. This also entails that commit does not raise an exception when applied to an already failed space (it is simply ignored). The bug could not be observed (unless you did some very fancy search engines yourself) and one could actually see it as an extension. [RELEASE] Version: 1.2.2 Date: 2006-07-25 [DESCRIPTION] This release switches recomputation back on and removes some experimental code that had sneaked into the system... [ENTRY] Module: kernel What: performance Rank: major [DESCRIPTION] Some experimental code had sneaked into the release, slowing down the system by more than 10%... [ENTRY] Module: search What: bug Rank: major [DESCRIPTION] With the changes to search in %Gecode 1.2.1 recomputation was actually almost switched off... [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Improve performance of domain-consistent distinct (by providing special ternary version). Can reduce runtime by 10-20% for some examples. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Cut memory requirements for element (for integer arrays) by half. [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] Added stress test for element constraint (originally due to Neng-Fa Zhou). [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] Added stress test for min constraint. [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] Added possibility to stop the search for solutions in examples based on the time taken, the number of fails, or both. [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] Added an example for solving Peacable co-existing armies of %Queens. [RELEASE] Version: 1.2.1 Date: 2006-07-19 [DESCRIPTION] In addition to the usual fixes and improvements, the biggest change is that all branchings now must support branching descriptions. This also entails straightforward changes (simplifications) to search-related space operations and to the implementation of search engines. [ENTRY] Module: kernel What: new Rank: minor [DESCRIPTION] Added a macro GECODE_NEVER that assert that this command is never executed. This is preferred over assert(false) as it is used for optimization, if supported by a compiler (for example, Microsoft Visual C++). [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed fixpoint detection bug in n-ary min and max propagators. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Min and max propagators now correctly handle cases such as min(x,y)=x. [ENTRY] Module: int What: removed Rank: minor [DESCRIPTION] Removed bounds-consistent propagation for count constraint (not worth the trouble, just use domain-consistent). [ENTRY] Module: kernel What: change Rank: minor Thanks: Martin Mann [DESCRIPTION] The ViewValBranching class now passes the home space to all member functions used in selecting the view and the value. [ENTRY] Module: set What: bug Rank: minor [DESCRIPTION] Fixed fixpoint detection for n-ary partition propagator. [ENTRY] Module: set What: new Rank: major [DESCRIPTION] Added finite set projection propagators. They allow to propagate all finite set constraints expressible as finite set projectors, including negated and reified constraints. [ENTRY] Module: support What: new Rank: minor [DESCRIPTION] Added simple class encapsulating a linear congruential pseudo-random number generator. [ENTRY] Module: kernel What: change Rank: major [DESCRIPTION] The interface for branchings has changed considerably, reflecting the fact now that all branchings must support branching descriptions. This is also reflected in the Space::status operation which has its arguments reversed and corrected const qualifiers on its arguments. But the good news is that it is considerably simpler than before. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Assignment branchings (that is, branchings with a single alternative) could possibly take the wrong values for assignment during recomputation. [ENTRY] Module: kernel What: change Rank: major [DESCRIPTION] The status operation does not any longer accept an argument for the number of alternatives. The number of alternatives is now available from a branching description (where it is passed upon creation of the description). This reflects the fact that branching descriptions are mandatory now. [ENTRY] Module: search What: bug Rank: major [DESCRIPTION] Fixed a serious bug where during recomputation the search stack was always inspected behind the last element: the reason why recomputation never crashed has been that stacks always keep one element extra for optimization. So, serious bug but looks as if no one stumbled over this... [ENTRY] Module: kernel What: bug Rank: minor [DESCRIPTION] As Boolean variables can be derived from integer variables, the assumption that a not yet assigned Boolean variable can not be modified is wrong. [ENTRY] Module: other What: documentation Rank: minor [DESCRIPTION] Generate one page per version released in changelog. [ENTRY] Module: kernel What: change Rank: minor Bug: 41 [DESCRIPTION] Change exceptions thrown by %Gecode to be compliant with C++ exceptions. [ENTRY] Module: other What: bug Rank: minor Bug: 42 [DESCRIPTION] Renamed macros so as to avoid nameclashes (all macros start with GECODE_). [ENTRY] Module: search What: bug Rank: minor [DESCRIPTION] Search engines now correctly count the number of propagation steps including propagation that occurs when adaptive recomputation creates additional clones. [ENTRY] Module: search What: change Rank: major [DESCRIPTION] Branchings now must return branching descriptions and commit operations also insist on being provided with branching descriptions. This change reflects that batch recomputation is of vital importance for efficiency in %Gecode. [ENTRY] Module: int What: performance Rank: major [DESCRIPTION] Make Boolean linear constraints with constant right hand sides more incremental using dynamic subscriptions (gives a 20-30% speedup). [ENTRY] Module: minimodel What: performance Rank: minor [DESCRIPTION] Take advantage of specialized Boolean propagators in Boolean expressions and relations. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Made n-ary Boolean conjunction and disjunction more incremental by using dynamic subscriptions. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Provide special versions of Boolean propagators optimizing cases where n-ary disjunctions are true. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Change implementation of Boolean propagators from conjunction to disjunction so that disjunction can be used as special case for Boolean sum with inequalities. [RELEASE] Version: 1.2.0 Date: 2006-06-20 [DESCRIPTION] This release makes quite some drastic changes to how propagators and branchings are deleted: instead of using destructors they use a dispose method that allows passing a home space during deletion (we will use this infrastructure measure to speed up cloning considerably a little later). Moreover the directory structure has changed on popular request so that all include files are to be found in a gecode subdirectory. Apart from that, some small fixes and extensions due to requests. [ENTRY] Module: set What: bug Rank: minor Thanks: Luis Otero [DESCRIPTION] Fixed memory leak in finite set distinct propagator. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed memory leak in global cardinality constraint. [ENTRY] Module: int What: bug Rank: minor Thanks: Martin Mann [DESCRIPTION] Fixed bug in equality tests that could lead to reified (dis)equality propagators not achieving domain consistency. [ENTRY] Module: test What: new Rank: minor [DESCRIPTION] Added --enable-leak-debug configure option. This option causes the test suite to call mtrace() under Linux, which can be used to test for memory leaks. [ENTRY] Module: kernel What: performance Rank: minor [DESCRIPTION] More aggressive inlining for canceling subscriptions. [ENTRY] Module: search What: bug Rank: minor Bug: 39 [DESCRIPTION] Fixed linkage of BAB destructor under Cygwin. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] The branch member function for branchings now also takes a home space as argument. [ENTRY] Module: kernel What: change Rank: major [DESCRIPTION] Canceling subscriptions on views and variable implementations now require also a home space (this has become possible due to not using destructors but ordinary "dispose" member functions). [ENTRY] Module: kernel What: change Rank: major [DESCRIPTION] Actors (propagators and branchings) do not any longer use destructors but a "dispose" member function that takes a home space as argument and must return the size of the actor. Important: this requires that dispose member functions from super-classes and class members are called explicitly! [ENTRY] Module: kernel What: new Rank: minor [DESCRIPTION] Spaces can be queried for number of propagators and branchings. [ENTRY] Module: search What: new Rank: minor [DESCRIPTION] Search engines can now be checked whether they have been stopped. [ENTRY] Module: int What: documentation Rank: minor Thanks: Martin Mann [DESCRIPTION] Fixed bug in description of PC_INT_DOM. [ENTRY] Module: other What: change Rank: major Thanks: Martin Mann [DESCRIPTION] Moved library source code into gecode subdirectory. Facilitates cleaner installation. Programs compiling against %Gecode now need to include e.g. "gecode/int.hh". [ENTRY] Module: example What: change Rank: minor [DESCRIPTION] Sudoku example generalized to arbitrarily sized Sudokus. [RELEASE] Version: 1.1.0 Date: 2006-04-10 [DESCRIPTION] This minor release adds some new constraints (see below), adds support for stopping search engines based on definable criteria, and some other small fixes. Most notably, the test infrastructure has been extended to also check whether propagators correctly claim that they have computed a fixpoint (now all invariants a propagator must obey in %Gecode are covered by the test infrastructure). This has lead to many small fixes. [ENTRY] Module: other What: bug Bug: 37 Rank: minor Thanks: Kari Pahula [DESCRIPTION] Added a configure switch --enable-doc-dot. If enabled, this checks for presence of the dot tool (used for generating graphs in the documentation) [ENTRY] Module: example What: new Rank: minor [DESCRIPTION] Added all-interval series using distinct. [ENTRY] Module: minimodel What: new Rank: minor [DESCRIPTION] Added functions returning variables for arithmetic (min, max, abs, mult, plus, minus). [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] Support for shared views has been removed in sortedness propagator and in the propagator for global cardinality with fixed cardinalities. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed bug in fixpoint detection of sortedness and global cardinality propagator. [ENTRY] Module: set What: bug Rank: minor Bug: 36 Thanks: Javier Mena [DESCRIPTION] A non-debug version of %Gecode could not be linked to a program compiled with assertions switched on, as BndSet::isConsistent was missing from the library. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] Staged propagation for domain-consistent absolute value propagator [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] EqBnd and EqDom now take two template parameters for their view types. This supports using different views, e.g. to express x0=-x1 using a MinusView. [ENTRY] Module: search What: new Rank: major Thanks: Rafael Meneses [DESCRIPTION] Added functionality to interrupt search engines (introduced a Search::Stop class). [ENTRY] Module: search What: change Rank: major [DESCRIPTION] Removed search engines optimizing for copying only (after all, one should always use some recomputation). [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed bug in fixpoint detection of n-ary maximum/minimum propagator. [ENTRY] Module: kernel What: change Rank: minor [DESCRIPTION] The status member function now also allows the first argument to be optional. [ENTRY] Module: set What: bug Rank: minor [DESCRIPTION] Fixed bugs in fixpoint detection of several set propagators (match, convexity, sequence, n-ary (disjoint) union). [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed bug in fixpoint detection of bounds-consistent element for variables propagator. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed bug in fixpoint detection of bounds-consistent squaring propagator (mult with the same variable twice). [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed bug in fixpoint detection of bounds-consistent abs propagator. [ENTRY] Module: int What: performance Rank: minor [DESCRIPTION] Rewrite n-ary linear, min/max, and Boolean propagators to binary/ternary variants during cloning if possible (saves memory). [ENTRY] Module: int What: bug Rank: minor Thanks: Stefano Gualandi [DESCRIPTION] Fixed wrong assertion in gcc-bnd propagator. [ENTRY] Module: int What: bug Rank: major Thanks: Jean-Christophe Godart [DESCRIPTION] Fixed indexing bug in SupportSet (part of the domain consistent linear equation propagator). [ENTRY] Module: int What: new Rank: major [DESCRIPTION] Added new constraint channel for variable/value channeling between two variable arrays. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] All distinct propagators raise an exception if a variable occurs multiply in its arguments. [ENTRY] Module: set What: change Rank: major [DESCRIPTION] Renamed the set propagators minElement to min, maxElement to max, and channelVarVal to channel. [ENTRY] Module: int What: performance Rank: major [DESCRIPTION] Improved initialization of domain-consistent distinct propagator, in common cases for distinct this can save up to 10% runtime. [ENTRY] Module: set What: bug Rank: minor Thanks: Patrick Pekczynski [DESCRIPTION] Fixed off-by-one bug in SetVarImp::lubMinN and SetVarImp::lubMaxN. [ENTRY] Module: minimodel What: bug Rank: minor Thanks: Olof Sivertsson [DESCRIPTION] (In-)Equations were still not correct with respect to the sign. [ENTRY] Module: minimodel What: bug Rank: minor Bug: 33 Thanks: Olof Sivertsson [DESCRIPTION] Slice-operation now returns elements in right order. [ENTRY] Module: minimodel What: bug Rank: minor Bug: 32 Thanks: Olof Sivertsson [DESCRIPTION] Possible array-out-of bounds access fixed for MiniModel::Matrix. [ENTRY] Module: example What: performance Rank: minor [DESCRIPTION] Added redundant constraint to social golfers example. [RELEASE] Version: 1.0.1 Date: 2006-03-01 [DESCRIPTION] Maintenance release including some additions of domain-consistent propagators and a fix for a serious bug in reified linear inequalities. [ENTRY] Module: search What: change Rank: minor [DESCRIPTION] Changed default copying recomputation distance to 8. [ENTRY] Module: minimodel What: bug Rank: minor Thanks: Olof Sivertsson [DESCRIPTION] (In-)Equations with an int on the left hand side (like 9==x) were translated with a wrong sign (as -9==x). [ENTRY] Module: other What: bug Rank: minor Bug: 31 [DESCRIPTION] The preprocessor macro NDEBUG for disabling assertions is no longer put into config.hpp. Without this fix, user programs could not use assert if %Gecode was compiled with NDEBUG. [ENTRY] Module: minimodel What: new Rank: minor [DESCRIPTION] The post functions for linear expressions and relations also take an integer consistency level as optional argument. [ENTRY] Module: int What: new Rank: major [DESCRIPTION] Added domain-consistent linear equalities. [ENTRY] Module: int What: bug Rank: minor Bug: 30 [DESCRIPTION] Fixed fixpoint detection for ternary min and max. [ENTRY] Module: int What: bug Rank: minor [DESCRIPTION] Fixed subsumption detection for regular with multiple variable occurences. [ENTRY] Module: int What: change Rank: minor [DESCRIPTION] Cost computation for sortedness has been changed from static to dynamic (taking into account the variable reduction the propagator can perform). [ENTRY] Module: int What: change Rank: major [DESCRIPTION] Global cardinality changed to non-staged version. Further inference for cardinality variables added. Parts of the graph structure for the domain-consistent propagator have been revised so as to avoid unnecessary propagation in case of fixed cardinalities and to allow better staging for the propagator. Revision of propagation for fixed cardinalities has also been applied to bounds-consistent propagator. [ENTRY] Module: int What: new Rank: major [DESCRIPTION] Added domain-consistent version of the absolute value propagator. [ENTRY] Module: other What: performance Rank: major [DESCRIPTION] Switch assertions off in optimized builds with Microsoft's C++ compiler. [ENTRY] Module: int What: bug Rank: major Bug: 29 Thanks: Dominik Brill [DESCRIPTION] Fixed a very serious bug in the reified linear inequality propagator. [ENTRY] Module: other What: bug Rank: minor Thanks: Filip Konvicka [DESCRIPTION] Removed some compiler warnings for the Microsoft compiler with -W3. [ENTRY] Module: int What: bug Rank: major Bug: 27 [DESCRIPTION] The strongly connected components represented by the permutation variables in the extended version of Sortedness has been fixed restoring bounds consistency on the permutation variables. [ENTRY] Module: other What: change Rank: minor Bug: 24 [DESCRIPTION] The soname for libraries on Linux is now set properly, as well as the version information on Darwin (Mac OS). [ENTRY] Module: other What: change Rank: minor Bug: 25 [DESCRIPTION] The build system has been updated to support building both static and shared libraries at the same time on Unix-like systems. [ENTRY] Module: example What: change Rank: minor [DESCRIPTION] Examples now use per default the recomputation settings as defined in the search module. [RELEASE] Version: 1.0.0 Date: 2005-12-06 [DESCRIPTION] Initial release. gecode-4.2.1/CMakeLists.txt0000755000175000010010000003114712236040373014632 0ustar schulteNone# # Main authors: # Victor Zverovich # # Copyright: # Victor Zverovich, 2013 # # Last modified: # $Date: 2013-11-05 01:51:07 +0100 (Tue, 05 Nov 2013) $ by $Author: tack $ # $Revision: 14054 $ # # This file is part of Gecode, the generic constraint # development environment: # http://www.gecode.org # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # # CMake build script for Gecode. # cmake_minimum_required(VERSION 2.8.8) project(GECODE) include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include(CheckCXXCompilerFlag) if (GECODE_DISABLE_WARNINGS) if (CMAKE_COMPILER_IS_GNUCXX) add_definitions(-Wno-overloaded-virtual) add_definitions(-Wno-switch) add_definitions(-Wno-unused-parameter) check_cxx_compiler_flag( -Wno-unused-but-set-variable HAVE_WNO_UNUSED_BUT_SET_VARIABLE_FLAG) if (HAVE_WNO_UNUSED_BUT_SET_VARIABLE_FLAG) add_definitions(-Wno-unused-but-set-variable) endif () elseif (MSVC) foreach (flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) string(REPLACE "/W3" "/w" ${flag_var} "${${flag_var}}") endforeach() endif () endif () # The following part of config.h is hard to derive from configure.ac. file(READ gecode/support/config.hpp.in CONFIG) string(REGEX REPLACE "^/\\*([^*]|\\*[^/])*\\*/" "" CONFIG ${CONFIG}) string(REGEX MATCHALL "[^\n]*\n" CONFIG "${CONFIG} /* Define to 1 if you have the `getpagesize' function. */ #undef HAVE_GETPAGESIZE /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have a working `mmap' system call. */ #undef HAVE_MMAP /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS ") # Get version numbers and parts of config.h from configure.ac. file(READ configure.ac LINES) # Replace semicolons with "" to avoid CMake messing with them. string(REPLACE ";" "" LINES "${LINES}") # Split into lines keeping newlines to avoid foreach skipping empty ones. string(REGEX MATCHALL "[^\n]*\n" LINES "${LINES}") set(ah_command FALSE) foreach (line "${EXTRA_CONFIG}" ${LINES}) string(REPLACE ";" "" line "${line}") if (ah_command) # Do nothing. elseif (line MATCHES "AC_INIT\\(([^,]*), *([^,]*), *([^)]*)\\)") set(PACKAGE ${CMAKE_MATCH_1}) set(VERSION ${CMAKE_MATCH_2}) set(PACKAGE_BUGREPORT ${CMAKE_MATCH_3}) message(STATUS "Got VERSION=${VERSION} from configure.ac") elseif (line MATCHES "ac_gecode_flatzincversion=(.*)\n") set(GECODE_FLATZINC_VERSION "${CMAKE_MATCH_1}") elseif (line MATCHES "AH_BOTTOM\\(\\[(.*)") set(ah_command bottom) set(line "${CMAKE_MATCH_1}") elseif (line MATCHES "AH_VERBATIM[^,]+,(.*)") set(ah_command verbatim) set(line "${CMAKE_MATCH_1}") endif () if (ah_command) set(saved_ah_command ${ah_command}) if (line MATCHES "^\\[(.*)") set(line "${CMAKE_MATCH_1}") endif () if (line MATCHES "\\]\\)") set(ah_command FALSE) string(REPLACE "])" "" line "${line}") endif () # For some reason CMake may bundle several lines together. Split them too. string(REGEX MATCHALL "[^\n]*\n" sublines "${line}") set(config_add "") foreach (subline ${sublines}) set(config_add ${config_add} "${subline}") endforeach () if (saved_ah_command STREQUAL "verbatim") set(CONFIG ${config_add} ${CONFIG}) else () set(CONFIG ${CONFIG} "\n" ${config_add}) endif () endif () endforeach () set(PACKAGE_NAME ${PACKAGE}) string(TOLOWER ${PACKAGE} PACKAGE_TARNAME) set(PACKAGE_URL "") set(PACKAGE_VERSION ${VERSION}) set(${PACKAGE}_VERSION ${VERSION}) string(REPLACE "." "-" GECODE_LIBRARY_VERSION "${VERSION}") set(PACKAGE_STRING "${PACKAGE} ${VERSION}") if (VERSION MATCHES "(.*)\\.(.*)\\.(.*)") math(EXPR GECODE_VERSION_NUMBER "${CMAKE_MATCH_1} * 100000 + ${CMAKE_MATCH_2} * 100 + ${CMAKE_MATCH_3}") endif () set(GECODE_DLL_USERPREFIX "") set(GECODE_DLL_USERSUFFIX "") set(GECODE_HAS_INT_VARS "/**/") set(GECODE_HAS_SET_VARS "/**/") set(GECODE_HAS_FLOAT_VARS "/**/") set(GECODE_STATIC_LIBS 1) check_cxx_compiler_flag(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN_FLAG) if (HAVE_VISIBILITY_HIDDEN_FLAG) set(GECODE_GCC_HAS_CLASS_VISIBILITY "/**/") endif () if (WIN32) set(GECODE_THREADS_WINDOWS 1) else () set(GECODE_THREADS_PTHREADS 1) endif () find_package(Qt5 QUIET COMPONENTS Core Gui Widgets PrintSupport) if (Qt5_FOUND) set(GECODE_HAS_QT "/**/") set(GECODE_HAS_GIST "/**/") set(EXTRA_LIBS gist) set(CMAKE_AUTOMOC TRUE) else() find_package(Qt4) if (QT4_FOUND) set(GECODE_HAS_QT "/**/") set(GECODE_HAS_GIST "/**/") set(EXTRA_LIBS gist) set(CMAKE_AUTOMOC TRUE) include(${QT_USE_FILE}) endif() endif() include(CheckSymbolExists) check_symbol_exists(getpagesize unistd.h HAVE_GETPAGESIZE) check_symbol_exists(mmap sys/mman.h HAVE_MMAP) # Checks for header files. include(CheckIncludeFiles) foreach (header inttypes.h memory.h stdint.h stdlib.h strings.h string.h sys/param.h sys/stat.h sys/time.h sys/types.h unistd.h) string(TOUPPER HAVE_${header} var) string(REGEX REPLACE "\\.|/" "_" var ${var}) check_include_files(${header} ${var}) endforeach () check_include_files(stdio.h STDC_HEADERS) if (HAVE_SYS_TIME_H) set(GECODE_USE_GETTIMEOFDAY 1) else () set(GECODE_USE_CLOCK 1) endif () if (HAVE_UNISTD_H) set(GECODE_HAS_UNISTD_H 1) endif () include(CheckCXXSourceCompiles) check_cxx_source_compiles(" #include int main() {}" HAVE_EXT_HASH_MAP) if (HAVE_EXT_HASH_MAP) set(GECODE_HAS_GNU_HASH_MAP "/**/") endif () include(CheckTypeSize) check_type_size(int SIZEOF_INT) # Check for inline. include(CheckCSourceCompiles) check_c_source_compiles(" inline __attribute__ ((__always_inline__)) void foo(void) {} int main() {}" HAVE_ALWAYS_INLINE) set(forceinline inline) if (HAVE_ALWAYS_INLINE) set(forceinline "inline __attribute__ ((__always_inline__))") endif () check_c_source_compiles(" int main() { return __builtin_ffsl(0); }" HAVE_BUILTIN_FFSL) if (HAVE_BUILTIN_FFSL) set(GECODE_HAS_BUILTIN_FFSL "/**/") endif () # Process config.hpp using autoconf rules. list(LENGTH CONFIG length) math(EXPR length "${length} - 1") foreach (i RANGE ${length}) list(GET CONFIG ${i} line) if (line MATCHES "^#( *)undef (.*)\n") set(space "${CMAKE_MATCH_1}") set(var ${CMAKE_MATCH_2}) if (NOT DEFINED ${var} OR (var MATCHES "HAVE_.*" AND NOT ${var})) set(line "/* #${space}undef ${var} */\n") else () if ("${${var}}" STREQUAL "/**/" OR "${var}" STREQUAL "GECODE_VERSION_NUMBER" OR "${var}" STREQUAL "forceinline" OR var MATCHES "SIZEOF_.*") set(value ${${var}}) elseif (NOT (var MATCHES ^HAVE OR ${var} EQUAL 0 OR ${var} EQUAL 1)) set(value \"${${var}}\") elseif (${var}) set(value 1) else () set(value 0) endif () set(line "#${space}define ${var} ${value}\n") endif () endif () string(REPLACE "" ";" line "${line}") set(CONFIG_OUT "${CONFIG_OUT}${line}") endforeach () file(WRITE ${GECODE_BINARY_DIR}/gecode/support/config.hpp "/* gecode/support/config.hpp. Generated from config.hpp.in by configure. */ /* gecode/support/config.hpp.in. Generated from configure.ac by autoheader. */ /* Disable autolink because all the dependencies are handled by CMake. */ #define GECODE_BUILD_SUPPORT #define GECODE_BUILD_KERNEL #define GECODE_BUILD_SEARCH #define GECODE_BUILD_INT #define GECODE_BUILD_SET #define GECODE_BUILD_FLOAT #define GECODE_BUILD_MINIMODEL #define GECODE_BUILD_FLATZINC #define GECODE_BUILD_DRIVER #define GECODE_BUILD_GIST ${CONFIG_OUT}") # Expands a value substituting variables and appends the result to ${var}. function (expand var value) if (value MATCHES "\\$\\(([^:]+)(.*)\\)") # Perform substitution. set(pattern ${CMAKE_MATCH_2}) set(items ${${CMAKE_MATCH_1}}) if (pattern MATCHES ":%=([^%]*)%([^%]*)") set(values ) foreach (item ${items}) set(values ${values} ${CMAKE_MATCH_1}${item}${CMAKE_MATCH_2}) endforeach () else () set(values ${items}) endif () else () set(values ${value}) endif () set(${var} ${${var}} ${values} PARENT_SCOPE) endfunction () # Parse Makefile.in extracting variables. file(READ Makefile.in text) string(REPLACE "\\\n" "" text "${text}") string(REGEX REPLACE "#[^\n]*\n" "" text "${text}") string(REGEX MATCHALL "[^\n]+" lines "${text}") foreach (line ${lines}) if (line MATCHES "([^ \t]+)[ \t]*=[ \t]*(.*)") set(var ${CMAKE_MATCH_1}) set(${var} ) string(REGEX MATCHALL "[^ \t]+" items "${CMAKE_MATCH_2}") foreach (item ${items}) expand(${var} ${item}) endforeach () endif () endforeach () foreach (lib support kernel search int set float minimodel driver flatzinc ${EXTRA_LIBS}) if (lib STREQUAL "minimodel") set(libupper MM) else () string(TOUPPER ${lib} libupper) endif () if (${libupper}SRC) set(sources ${${libupper}SRC}) if (${libupper}_GENSRC) set(sources ${sources} ${${libupper}_GENSRC}) endif() add_library(gecode${lib} ${sources} ${${libupper}HDR}) endif () endforeach () find_package(Threads) target_link_libraries(gecodesupport ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries(gecodekernel gecodesupport) target_link_libraries(gecodesearch gecodekernel) target_link_libraries(gecodeint gecodekernel) target_link_libraries(gecodeset gecodekernel) target_link_libraries(gecodeminimodel gecodeint gecodeset gecodesearch) if (GECODE_HAS_QT) if (Qt5_FOUND) qt5_use_modules(gecodegist Widgets Gui PrintSupport) else() target_link_libraries(gecodegist ${QT_LIBRARIES}) target_link_libraries(gecodeflatzinc gecodegist ${QT_LIBRARIES}) endif() endif () if (FLOATSRC) target_link_libraries(gecodefloat gecodekernel) target_link_libraries(gecodeminimodel gecodefloat) endif () add_executable(gecode-test ${TESTSRC} ${TESTHDR}) target_link_libraries(gecode-test gecodeminimodel) add_executable(fzn-gecode ${FLATZINCEXESRC}) target_link_libraries(fzn-gecode gecodeflatzinc gecodeminimodel gecodedriver) enable_testing() add_test(test gecode-test -iter 2 -test Branch::Int::Dense::3 -test Int::Linear::Int::Int::Eq::Bnd::12::4 -test Int::Distinct::Random -test Int::Arithmetic::Mult::XYZ::Bnd::C -test Int::Arithmetic::Mult::XYZ::Dom::A -test Search::BAB::Sol::BalGr::Binary::Binary::Binary::1::1) gecode-4.2.1/configure0000755000175000010010000144750712227072140014007 0ustar schulteNone#! /bin/sh # From configure.ac Id: configure.ac.in 13938 2013-07-23 12:30:31Z schulte . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for GECODE 4.2.1. # # Report bugs to . # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and users@gecode.org $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GECODE' PACKAGE_TARNAME='gecode' PACKAGE_VERSION='4.2.1' PACKAGE_STRING='GECODE 4.2.1' PACKAGE_BUGREPORT='users@gecode.org' PACKAGE_URL='' ac_unique_file="gecode/kernel.hh" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_list= enable_option_checking=no ac_subst_vars='LTLIBOBJS LIBOBJS BATCHFILE DLL_ARCH ALLVIS GLDFLAGS DLLFLAGS VERSION subdirs enable_search enable_minimodel enable_examples enable_flatzinc enable_driver HAVEBISON HAVE_FLEXBISON HAVEFLEX enable_gist enable_qt QTLIBS QTDEFINES QTINCLUDES MOC QMAKE enable_mpfr MPFR_LINK MPFR_LIB_PATH MPFR_CPPFLAGS GMP_LINK GMP_LIB_PATH GMP_CPPFLAGS enable_int_vars LINKINT enable_set_vars LINKSET enable_float_vars LINKFLOAT ENABLEDOCDOCSET ENABLEDOCCHM GECODE_DOXYGEN_TAGFILE ENABLEDOCSEARCH GECODE_DOXYGEN_DOT DOT DRIVER FLATZINC GIST MM SET FLOAT INT SEARCH KERNEL SUPPORT EXEOUTPUT LINKOUTPUT LINKSUFFIX LINKPREFIX INSTALLLIBS EXAMPLES_EXTRA_CXXFLAGS CCIN CXXIN COMPILESBJ COMPILEOBJ cygpathprefix LINKLIBDIR MINUSLDIR STATICLIBEXT LIBPREFIX LIBEXT SBJEXT MANIFEST GECODE_BUILD_DRIVER_FLAG GECODE_BUILD_FLATZINC_FLAG GECODE_BUILD_GIST_FLAG GECODE_BUILD_MINIMODEL_FLAG GECODE_BUILD_SET_FLAG GECODE_BUILD_FLOAT_FLAG GECODE_BUILD_INT_FLAG GECODE_BUILD_SEARCH_FLAG GECODE_BUILD_KERNEL_FLAG GECODE_BUILD_SUPPORT_FLAG WLSONAME sharedlibdir SOLINKSUFFIX SOSUFFIX DLLEXT need_soname DLLPATH DEBUG_BUILD BUILDDLL BUILDSTATIC BUILD_MACOS_FRAMEWORK USERSUFFIX EGREP GREP enable_resource RESCOMP HAVE_RC CXXCPP PROG_PERL PROG_SED PROG_MAKE PROG_TAR PROG_DIFF RANLIB ac_ct_CC CFLAGS CC OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX GECODE_FLATZINC_VERSION GECODE_SOVERSION target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_host_os with_compiler_vendor enable_resource with_sdk with_macosx_version_min with_architectures with_lib_prefix with_lib_suffix enable_framework enable_static enable_shared enable_debug enable_peakheap enable_small_codesize enable_leak_debug enable_audit enable_profile enable_gcov enable_thread enable_gcc_visibility enable_doc_dot enable_doc_search enable_doc_tagfile enable_doc_chm enable_doc_docset with_vis enable_float_vars enable_set_vars enable_int_vars enable_mpfr with_gmp_include with_gmp_lib with_mpfr_include with_mpfr_lib enable_qt enable_gist enable_driver enable_flatzinc enable_examples enable_minimodel enable_search ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CXXCPP' ac_subdirs_all='' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures GECODE 4.2.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/gecode] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of GECODE 4.2.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-resource build Gecode with resource files for Microsoft Visual Studio [default=no] --enable-framework build framework bundle on Mac OS X [default=no] --enable-static build static libraries [default=no] --enable-shared build shared libraries [default=yes] --enable-debug build with assertions [default=no] --enable-peakheap build with peak heap size tracking [default=no] --enable-small-codesize optimize for code size [default=no] --enable-leak-debug build with support for finding memory leaks [default=no] --enable-audit build with auditing code [default=no] --enable-profile build with profiling information [default=no] --enable-gcov build with gcov support [default=no] --enable-thread build with multi-threading support [default=yes] --enable-gcc-visibility use gcc visibility attributes [default=yes] --enable-doc-dot enable graphs in documentation [default=yes] --enable-doc-search enable documentation search engine [default=no] --enable-doc-tagfile generate doxygen tagfile [default=yes] --enable-doc-chm build compressed html documentation [default=yes on Windows] --enable-doc-docset build docset documentation for XCode [default=no] --enable-float-vars build float variable library (implies --enable-int-vars) [default=yes] --enable-set-vars build finite set library (implies --enable-int-vars) [default=yes] --enable-int-vars build finite domain library [default=yes] --enable-mpfr build with MPFR support [default=yes] --enable-qt build with Qt support, requires at least Qt 4.3 [default=yes] --enable-gist build Gecode Interactive Search Tool [default=yes] --enable-driver build script commandline driver library [default=yes] --enable-flatzinc build FlatZinc interpreter [default=yes] --enable-examples build examples for the enabled variable types [default=yes] --enable-minimodel build modeling support library for the enabled variable types [default=yes] --enable-search build search engines [default=yes] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-host-os Override operating system test. Valid values are Linux, Darwin, FreeBSD, NetBSD, and Windows. --with-compiler-vendor Override compiler test. Valid values are gnu, intel, and microsoft. --with-sdk SDK to use on Mac OS X --with-macosx-version-min minimum version of Mac OS X to support --with-architectures architectures to compile for on Mac OS X --with-lib-prefix add user-defined prefix to library names --with-lib-suffix add user-defined suffix to library names --with-vis additional variable implementation specifications --with-gmp-include path to the gmp or mpir header files --with-gmp-lib path to the gmp or mpir library --with-mpfr-include path to the mpfr header file --with-mpfr-lib path to the mpfr library Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF GECODE configure 4.2.1 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------- ## ## Report this to users@gecode.org ## ## ------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_cxx_check_func LINENO FUNC VAR # ------------------------------------ # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_cxx_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_func # ac_fn_cxx_check_decl LINENO SYMBOL VAR INCLUDES # ----------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_cxx_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_decl # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by GECODE $as_me 4.2.1, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " stdlib.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_header_list " sys/param.h" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers gecode/support/config.hpp" ac_gecode_soversion=36 GECODE_SOVERSION=${ac_gecode_soversion} ac_gecode_flatzincversion=1.6 GECODE_FLATZINC_VERSION=${ac_gecode_flatzincversion} # checks for programs : ${CXXFLAGS=""} : ${CFLAGS=""} : ${DLLFLAGS=""} : ${GLDFLAGS=""} # Test for platform specific behaviour of arithmetic # Check whether --with-host-os was given. if test "${with_host_os+set}" = set; then : withval=$with_host_os; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the host operating system" >&5 $as_echo_n "checking for the host operating system... " >&6; } if test "${with_host_os:-no}" = "no"; then guess_host_os=$(uname -s 2>/dev/null) else guess_host_os=${with_host_os} fi case ${guess_host_os} in GNU/kFreeBSD|*inux*|FreeBSD|NetBSD) host_os=linux { $as_echo "$as_me:${as_lineno-$LINENO}: result: Linux" >&5 $as_echo "Linux" >&6; } ;; *arwin*) host_os=darwin { $as_echo "$as_me:${as_lineno-$LINENO}: result: Darwin" >&5 $as_echo "Darwin" >&6; } ;; CYGWIN*|*indows*) host_os=windows { $as_echo "$as_me:${as_lineno-$LINENO}: result: Windows" >&5 $as_echo "Windows" >&6; } ;; *) as_fn_error $? "Host OS not supported." "$LINENO" 5 ;; esac if test "${CXX}x" = "x" -a "${CC}x" = "x" -a "${host_os}" = "windows"; then CC=cl CXX=cl fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Extract the first word of "diff", so it can be a program name with args. set dummy diff; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PROG_DIFF+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PROG_DIFF"; then ac_cv_prog_PROG_DIFF="$PROG_DIFF" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PROG_DIFF="ok" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PROG_DIFF=$ac_cv_prog_PROG_DIFF if test -n "$PROG_DIFF"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROG_DIFF" >&5 $as_echo "$PROG_DIFF" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "${PROG_DIFF}x" = "x"; then as_fn_error $? "In order to compile Gecode, you need the diff tool." "$LINENO" 5 fi # Extract the first word of "tar", so it can be a program name with args. set dummy tar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PROG_TAR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PROG_TAR"; then ac_cv_prog_PROG_TAR="$PROG_TAR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PROG_TAR="ok" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PROG_TAR=$ac_cv_prog_PROG_TAR if test -n "$PROG_TAR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROG_TAR" >&5 $as_echo "$PROG_TAR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "${PROG_TAR}x" = "x"; then as_fn_error $? "In order to compile Gecode, you need the tar tool." "$LINENO" 5 fi # Extract the first word of "make", so it can be a program name with args. set dummy make; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PROG_MAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PROG_MAKE"; then ac_cv_prog_PROG_MAKE="$PROG_MAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PROG_MAKE="ok" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PROG_MAKE=$ac_cv_prog_PROG_MAKE if test -n "$PROG_MAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROG_MAKE" >&5 $as_echo "$PROG_MAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "${PROG_MAKE}x" = "x"; then as_fn_error $? "In order to compile Gecode, you need the make tool." "$LINENO" 5 fi # Extract the first word of "sed", so it can be a program name with args. set dummy sed; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PROG_SED+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PROG_SED"; then ac_cv_prog_PROG_SED="$PROG_SED" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PROG_SED="ok" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PROG_SED=$ac_cv_prog_PROG_SED if test -n "$PROG_SED"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROG_SED" >&5 $as_echo "$PROG_SED" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "${PROG_SED}x" = "x"; then as_fn_error $? "In order to compile Gecode, you need the sed tool." "$LINENO" 5 fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PROG_PERL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PROG_PERL"; then ac_cv_prog_PROG_PERL="$PROG_PERL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PROG_PERL="ok" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PROG_PERL=$ac_cv_prog_PROG_PERL if test -n "$PROG_PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROG_PERL" >&5 $as_echo "$PROG_PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "${PROG_PERL}x" = "x"; then as_fn_error $? "In order to compile Gecode, you need perl." "$LINENO" 5 fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # Check whether --with-compiler-vendor was given. if test "${with_compiler_vendor+set}" = set; then : withval=$with_compiler_vendor; fi if test "${with_compiler_vendor:-no}" = "no"; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __GNUG__ # error "Macro __GNUG__ is undefined!" /* For some compilers (eg. SGI's CC), #error is not enough... */ please, do fail #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_cxx_compiler_vendor=gnu else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __INTEL_COMPILER # error "Macro __INTEL_COMPILER is undefined!" /* For some compilers (eg. SGI's CC), #error is not enough... */ please, do fail #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_cxx_compiler_vendor=intel cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef _M_IX86 # error "Macro _M_IX86 is undefined!" /* For some compilers (eg. SGI's CC), #error is not enough... */ please, do fail #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_gecode_library_architecture="-x86${ac_gecode_library_architecture}" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef _M_IA64 # error "Macro _M_IA64 is undefined!" /* For some compilers (eg. SGI's CC), #error is not enough... */ please, do fail #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_gecode_library_architecture="-ia64${ac_gecode_library_architecture}" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef _M_X64 # error "Macro _M_X64 is undefined!" /* For some compilers (eg. SGI's CC), #error is not enough... */ please, do fail #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_gecode_library_architecture="-x64${ac_gecode_library_architecture}" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef _MSC_VER # error "Macro _MSC_VER is undefined!" /* For some compilers (eg. SGI's CC), #error is not enough... */ please, do fail #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_cxx_compiler_vendor=microsoft cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef _M_IX86 # error "Macro _M_IX86 is undefined!" /* For some compilers (eg. SGI's CC), #error is not enough... */ please, do fail #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_gecode_library_architecture="-x86${ac_gecode_library_architecture}" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef _M_IA64 # error "Macro _M_IA64 is undefined!" /* For some compilers (eg. SGI's CC), #error is not enough... */ please, do fail #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_gecode_library_architecture="-ia64${ac_gecode_library_architecture}" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef _M_X64 # error "Macro _M_X64 is undefined!" /* For some compilers (eg. SGI's CC), #error is not enough... */ please, do fail #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_gecode_library_architecture="-x64${ac_gecode_library_architecture}" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else ac_cv_cxx_compiler_vendor=unknown fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu else ac_cv_cxx_compiler_vendor=${with_compiler_vendor} fi ac_gecode_compiler_vendor="$ac_cv_cxx_compiler_vendor" case $ac_gecode_compiler_vendor in gnu) ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2) #error Version too old really, the version is too old #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else as_fn_error $? "Your version of gcc is too old. You need at least version 4.2." "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2) #error Version too old really, the version is too old #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else as_fn_error $? "Your version of g++ is too old. You need at least version 4.2." "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ;; intel) ;; microsoft) ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if _MSC_VER < 1400 #error Version too old really, the version is too old #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else as_fn_error $? "Your version of cl is too old. You need at least Microsoft Visual C++ 2005." "$LINENO" 5 ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; *) ;; esac # Check whether --enable-resource was given. if test "${enable_resource+set}" = set; then : enableval=$enable_resource; fi # Extract the first word of "rc.exe", so it can be a program name with args. set dummy rc.exe; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_HAVE_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$HAVE_RC"; then ac_cv_prog_HAVE_RC="$HAVE_RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_HAVE_RC="found" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi HAVE_RC=$ac_cv_prog_HAVE_RC if test -n "$HAVE_RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_RC" >&5 $as_echo "$HAVE_RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with Visual Studio resource files" >&5 $as_echo_n "checking whether to build with Visual Studio resource files... " >&6; } if test "${enable_resource:-no}" = "yes" -a \ "${ac_gecode_compiler_vendor}" = "microsoft"; then if test "${HAVE_RC}x" = "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } RESCOMP=@true enable_resource=no else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } RESCOMP="rc.exe" enable_resource=yes fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } enable_resource=no RESCOMP=@true fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_cxx_check_header_mongrel "$LINENO" "ext/hash_map" "ac_cv_header_ext_hash_map" "$ac_includes_default" if test "x$ac_cv_header_ext_hash_map" = xyes; then : $as_echo "#define GECODE_HAS_GNU_HASH_MAP /**/" >>confdefs.h fi # Check whether --with-sdk was given. if test "${with_sdk+set}" = set; then : withval=$with_sdk; fi if test "${host_os}" = "darwin"; then if test "${with_sdk:-no}" != "no"; then if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -isysroot ${with_sdk}" >&5 $as_echo_n "checking whether ${CXX} accepts -isysroot ${with_sdk}... " >&6; } if ${CXX} -isysroot ${with_sdk} 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-isysroot ${with_sdk}${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-isysroot ${with_sdk}${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -isysroot ${with_sdk}" >&5 $as_echo_n "checking whether ${CXX} accepts -isysroot ${with_sdk}... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-isysroot ${with_sdk}${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-isysroot ${with_sdk}${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -isysroot ${with_sdk}" >&5 $as_echo_n "checking whether ${CC} accepts -isysroot ${with_sdk}... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-isysroot ${with_sdk}${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-isysroot ${with_sdk}${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi DLLFLAGS="-Wl,-syslibroot,${with_sdk}${DLLFLAGS:+ }${DLLFLAGS}" fi fi # Check whether --with-macosx-version-min was given. if test "${with_macosx_version_min+set}" = set; then : withval=$with_macosx_version_min; fi if test "${host_os}" = "darwin"; then if test "${with_macosx_version_min:-no}" != "no"; then if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -mmacosx-version-min=${with_macosx_version_min}" >&5 $as_echo_n "checking whether ${CXX} accepts -mmacosx-version-min=${with_macosx_version_min}... " >&6; } if ${CXX} -mmacosx-version-min=${with_macosx_version_min} 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-mmacosx-version-min=${with_macosx_version_min}${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-mmacosx-version-min=${with_macosx_version_min}${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -mmacosx-version-min=${with_macosx_version_min}" >&5 $as_echo_n "checking whether ${CXX} accepts -mmacosx-version-min=${with_macosx_version_min}... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-mmacosx-version-min=${with_macosx_version_min}${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-mmacosx-version-min=${with_macosx_version_min}${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -mmacosx-version-min=${with_macosx_version_min}" >&5 $as_echo_n "checking whether ${CC} accepts -mmacosx-version-min=${with_macosx_version_min}... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-mmacosx-version-min=${with_macosx_version_min}${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-mmacosx-version-min=${with_macosx_version_min}${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi DLLFLAGS="-mmacosx-version-min=${with_macosx_version_min}${DLLFLAGS:+ }${DLLFLAGS}" fi fi # Check whether --with-architectures was given. if test "${with_architectures+set}" = set; then : withval=$with_architectures; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking Whether to build for different architectures" >&5 $as_echo_n "checking Whether to build for different architectures... " >&6; } if test "${host_os}" = "darwin"; then if test "${with_architectures:-no}" != "no"; then archflags=""; for a in `echo ${with_architectures} | sed -e "s/,/ /g"`; do archflags="${archflags} -arch $a"; done if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts ${archflags}" >&5 $as_echo_n "checking whether ${CXX} accepts ${archflags}... " >&6; } if ${CXX} ${archflags} 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="${archflags}${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="${archflags}${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts ${archflags}" >&5 $as_echo_n "checking whether ${CXX} accepts ${archflags}... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="${archflags}${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="${archflags}${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts ${archflags}" >&5 $as_echo_n "checking whether ${CC} accepts ${archflags}... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="${archflags}${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="${archflags}${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi DLLFLAGS="${archflags}${DLLFLAGS:+ }${DLLFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --with-lib-prefix was given. if test "${with_lib_prefix+set}" = set; then : withval=$with_lib_prefix; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for user-defined library name prefix" >&5 $as_echo_n "checking for user-defined library name prefix... " >&6; } if test "x${with_lib_prefix}" != "x"; then ac_gecode_userprefix=${with_lib_prefix} { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_lib_prefix}" >&5 $as_echo "${with_lib_prefix}" >&6; } else ac_gecode_userprefix= { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi cat >>confdefs.h <<_ACEOF #define GECODE_DLL_USERPREFIX "${ac_gecode_userprefix}" _ACEOF # Check whether --with-lib-suffix was given. if test "${with_lib_suffix+set}" = set; then : withval=$with_lib_suffix; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for user-defined library name suffix" >&5 $as_echo_n "checking for user-defined library name suffix... " >&6; } if test "x${with_lib_suffix}" != "x"; then ac_gecode_usersuffix=${with_lib_suffix} USERSUFFIX=${with_lib_suffix} { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_lib_suffix}" >&5 $as_echo "${with_lib_suffix}" >&6; } else ac_gecode_usersuffix= USERSUFFIX="" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi cat >>confdefs.h <<_ACEOF #define GECODE_DLL_USERSUFFIX "${ac_gecode_usersuffix}" _ACEOF # Check whether --enable-framework was given. if test "${enable_framework+set}" = set; then : enableval=$enable_framework; fi if test "${host_os}" = "darwin"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build framework bundle on Mac OS X" >&5 $as_echo_n "checking whether to build framework bundle on Mac OS X... " >&6; } if test "${enable_framework:-no}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } BUILD_MACOS_FRAMEWORK="yes" enable_static="yes"; enable_shared="no"; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } BUILD_MACOS_FRAMEWORK="no" fi fi if test "${host_os}" = "windows" -a \ "${ac_gecode_compiler_vendor}" = "gnu"; then enable_static="yes" enable_shared="no" fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } if test "${enable_static:-no}" = "yes"; then $as_echo "#define GECODE_STATIC_LIBS /**/" >>confdefs.h BUILDSTATIC="yes" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_shared=no else BUILDSTATIC="no" enable_shared=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } if test "${enable_shared:-yes}" = "yes"; then BUILDDLL="yes" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else BUILDDLL="no" if test "${enable_static:-no}" = "no"; then as_fn_error $? "One of --enable-static or --enable-shared must be given" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with debug symbols and assertions" >&5 $as_echo_n "checking whether to build with debug symbols and assertions... " >&6; } if test "${enable_debug:-no}" = "yes"; then ac_gecode_library_architecture="-d${ac_gecode_library_architecture}" DEBUG_BUILD=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else ac_gecode_library_architecture="-r${ac_gecode_library_architecture}" DEBUG_BUILD=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } CFLAGS="-DNDEBUG${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-DNDEBUG${CXXFLAGS:+ }${CXXFLAGS}" fi # Check whether --enable-peakheap was given. if test "${enable_peakheap+set}" = set; then : enableval=$enable_peakheap; fi if test "${enable_peakheap:-no}" = "yes"; then ac_fn_cxx_check_func "$LINENO" "_msize" "ac_cv_func__msize" if test "x$ac_cv_func__msize" = xyes; then : $as_echo "#define GECODE_PEAKHEAP /**/" >>confdefs.h $as_echo "#define GECODE_PEAKHEAP_MALLOC_H /**/" >>confdefs.h $as_echo "#define GECODE_MSIZE _msize" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with peak heap size tracking" >&5 $as_echo_n "checking whether to build with peak heap size tracking... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else for ac_header in malloc/malloc.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "malloc/malloc.h" "ac_cv_header_malloc_malloc_h" "$ac_includes_default" if test "x$ac_cv_header_malloc_malloc_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MALLOC_MALLOC_H 1 _ACEOF ac_fn_cxx_check_func "$LINENO" "malloc_size" "ac_cv_func_malloc_size" if test "x$ac_cv_func_malloc_size" = xyes; then : $as_echo "#define GECODE_PEAKHEAP /**/" >>confdefs.h $as_echo "#define GECODE_PEAKHEAP_MALLOC_MALLOC_H /**/" >>confdefs.h $as_echo "#define GECODE_MSIZE malloc_size" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with peak heap size tracking" >&5 $as_echo_n "checking whether to build with peak heap size tracking... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with peak heap size tracking" >&5 $as_echo_n "checking whether to build with peak heap size tracking... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else for ac_header in malloc.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" if test "x$ac_cv_header_malloc_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MALLOC_H 1 _ACEOF ac_fn_cxx_check_func "$LINENO" "malloc_usable_size" "ac_cv_func_malloc_usable_size" if test "x$ac_cv_func_malloc_usable_size" = xyes; then : $as_echo "#define GECODE_PEAKHEAP /**/" >>confdefs.h $as_echo "#define GECODE_PEAKHEAP_MALLOC_H /**/" >>confdefs.h $as_echo "#define GECODE_MSIZE malloc_usable_size" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with peak heap size tracking" >&5 $as_echo_n "checking whether to build with peak heap size tracking... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with peak heap size tracking" >&5 $as_echo_n "checking whether to build with peak heap size tracking... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with peak heap size tracking" >&5 $as_echo_n "checking whether to build with peak heap size tracking... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi done fi done fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with peak heap size tracking" >&5 $as_echo_n "checking whether to build with peak heap size tracking... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --enable-small-codesize was given. if test "${enable_small_codesize+set}" = set; then : enableval=$enable_small_codesize; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to optimize for code size" >&5 $as_echo_n "checking whether to optimize for code size... " >&6; } if test "${enable_debug:-no}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not in debug builds" >&5 $as_echo "not in debug builds" >&6; } elif test "${enable_small_codesize:-no}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } case $host_os in darwin*) ac_gecode_gcc_optimize_flag=-Oz ;; *) ac_gecode_gcc_optimize_flag=-Os ac_gecode_cl_optimize_flag=-O1 ;; esac else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_gecode_gcc_optimize_flag=-O3 ac_gecode_cl_optimize_flag=-O2 fi # Check whether --enable-leak-debug was given. if test "${enable_leak_debug+set}" = set; then : enableval=$enable_leak_debug; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with support for finding memory leaks" >&5 $as_echo_n "checking whether to build with support for finding memory leaks... " >&6; } if test "${enable_leak_debug:-no}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_fn_cxx_check_decl "$LINENO" "mtrace" "ac_cv_have_decl_mtrace" "#include " if test "x$ac_cv_have_decl_mtrace" = xyes; then : $as_echo "#define GECODE_HAS_MTRACE /**/" >>confdefs.h else as_fn_error $? "mtrace not available." "$LINENO" 5 fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --enable-audit was given. if test "${enable_audit+set}" = set; then : enableval=$enable_audit; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with auditing code" >&5 $as_echo_n "checking whether to build with auditing code... " >&6; } if test "${enable_audit:-no}" = "yes"; then $as_echo "#define GECODE_AUDIT /**/" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --enable-profile was given. if test "${enable_profile+set}" = set; then : enableval=$enable_profile; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with profiling information" >&5 $as_echo_n "checking whether to build with profiling information... " >&6; } if test "${enable_profile:-no}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -pg" >&5 $as_echo_n "checking whether ${CXX} accepts -pg... " >&6; } if ${CXX} -pg 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -p" >&5 $as_echo_n "checking whether ${CXX} accepts -p... " >&6; } if ${CXX} -p 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-p${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-p${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -p" >&5 $as_echo_n "checking whether ${CXX} accepts -p... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-p${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-p${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -p" >&5 $as_echo_n "checking whether ${CC} accepts -p... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-p${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-p${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-pg${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-pg${CXXFLAGS:+ }${CXXFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -pg" >&5 $as_echo_n "checking whether ${CXX} accepts -pg... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-pg${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -p" >&5 $as_echo_n "checking whether ${CXX} accepts -p... " >&6; } if ${CXX} -p 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-p${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-p${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -p" >&5 $as_echo_n "checking whether ${CXX} accepts -p... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-p${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-p${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -p" >&5 $as_echo_n "checking whether ${CC} accepts -p... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-p${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-p${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-pg${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-pg${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -p" >&5 $as_echo_n "checking whether ${CXX} accepts -p... " >&6; } if ${CXX} -p 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-p${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-p${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -p" >&5 $as_echo_n "checking whether ${CXX} accepts -p... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-p${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-p${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -p" >&5 $as_echo_n "checking whether ${CC} accepts -p... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-p${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-p${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --enable-gcov was given. if test "${enable_gcov+set}" = set; then : enableval=$enable_gcov; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with gcov support" >&5 $as_echo_n "checking whether to build with gcov support... " >&6; } if test "${enable_gcov:-no}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fprofile-arcs" >&5 $as_echo_n "checking whether ${CXX} accepts -fprofile-arcs... " >&6; } if ${CXX} -fprofile-arcs 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fprofile-arcs${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-fprofile-arcs${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fprofile-arcs" >&5 $as_echo_n "checking whether ${CXX} accepts -fprofile-arcs... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-fprofile-arcs${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fprofile-arcs${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -fprofile-arcs" >&5 $as_echo_n "checking whether ${CC} accepts -fprofile-arcs... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-fprofile-arcs${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-fprofile-arcs${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -ftest-coverage" >&5 $as_echo_n "checking whether ${CXX} accepts -ftest-coverage... " >&6; } if ${CXX} -ftest-coverage 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-ftest-coverage${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-ftest-coverage${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -ftest-coverage" >&5 $as_echo_n "checking whether ${CXX} accepts -ftest-coverage... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-ftest-coverage${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-ftest-coverage${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -ftest-coverage" >&5 $as_echo_n "checking whether ${CC} accepts -ftest-coverage... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-ftest-coverage${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-ftest-coverage${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi DLLFLAGS=""-fprofile-arcs"${DLLFLAGS:+ }${DLLFLAGS}" DLLFLAGS=""-ftest-coverage"${DLLFLAGS:+ }${DLLFLAGS}" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 $as_echo_n "checking size of int... " >&6; } if ${ac_cv_sizeof_int+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : else if test "$ac_cv_type_int" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_int=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 $as_echo "$ac_cv_sizeof_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking if int has at least 32 bit" >&5 $as_echo_n "checking if int has at least 32 bit... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #if SIZEOF_INT>=4 #else blablub #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else as_fn_error $? "Gecode needs at least 32 bit integers." "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking if doubles have a big enough mantissa" >&5 $as_echo_n "checking if doubles have a big enough mantissa... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if DBL_MANT_DIG>=53 #else blablub #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else as_fn_error $? "Gecode needs a double mantissa of at least 53 bits." "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # Check whether --enable-thread was given. if test "${enable_thread+set}" = set; then : enableval=$enable_thread; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with multi-threading support" >&5 $as_echo_n "checking whether to build with multi-threading support... " >&6; } if test "${enable_thread:-yes}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_fn_cxx_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" if test "x$ac_cv_header_unistd_h" = xyes; then : $as_echo "#define GECODE_HAS_UNISTD_H 1" >>confdefs.h fi ac_fn_cxx_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" if test "x$ac_cv_header_pthread_h" = xyes; then : $as_echo "#define GECODE_THREADS_PTHREADS 1" >>confdefs.h CFLAGS="-pthread${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-pthread${CXXFLAGS:+ }${CXXFLAGS}" DLLFLAGS="-pthread${DLLFLAGS:+ }${DLLFLAGS}" ac_fn_cxx_check_header_mongrel "$LINENO" "libkern/OSAtomic.h" "ac_cv_header_libkern_OSAtomic_h" "$ac_includes_default" if test "x$ac_cv_header_libkern_OSAtomic_h" = xyes; then : $as_echo "#define GECODE_THREADS_OSX 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for spin locks" >&5 $as_echo_n "checking for spin locks... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { pthread_spinlock_t t; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define GECODE_THREADS_PTHREADS_SPINLOCK 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else ac_fn_cxx_check_header_mongrel "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" if test "x$ac_cv_header_windows_h" = xyes; then : $as_echo "#define GECODE_THREADS_WINDOWS 1" >>confdefs.h fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ac_fn_cxx_check_header_mongrel "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" if test "x$ac_cv_header_sys_time_h" = xyes; then : $as_echo "#define GECODE_USE_GETTIMEOFDAY 1" >>confdefs.h else $as_echo "#define GECODE_USE_CLOCK 1" >>confdefs.h fi case $ac_gecode_compiler_vendor in gnu) DLLPATH=-L. case $host_os in darwin*) need_soname="yes" DLLFLAGS="-Wl,-single_module${DLLFLAGS:+ }${DLLFLAGS}" DLLFLAGS=""-dynamiclib"${DLLFLAGS:+ }${DLLFLAGS}" DLLEXT="${ac_gecode_soversion}.0.dylib" SOSUFFIX=".${ac_gecode_soversion}.dylib" SOLINKSUFFIX=".dylib" sharedlibdir="${libdir}" WLSONAME="-compatibility_version ${ac_gecode_soversion}.0 -current_version ${ac_gecode_soversion}.0 -install_name ${libdir}/" GECODE_BUILD_SUPPORT_FLAG="" GECODE_BUILD_KERNEL_FLAG="" GECODE_BUILD_SEARCH_FLAG="" GECODE_BUILD_INT_FLAG="" GECODE_BUILD_FLOAT_FLAG="" GECODE_BUILD_SET_FLAG="" GECODE_BUILD_MINIMODEL_FLAG="" GECODE_BUILD_GIST_FLAG="" GECODE_BUILD_FLATZINC_FLAG="" GECODE_BUILD_DRIVER_FLAG="" ;; windows*) need_soname="no" if test "${enable_static:-no}" = "yes" -a \ "${enable_shared:-yes}" = "yes"; then as_fn_error $? "Only either static or shared libraries can be built." "$LINENO" 5 fi DLLFLAGS=""-shared"${DLLFLAGS:+ }${DLLFLAGS}" DLLEXT="dll" SOSUFFIX="" SOLINKSUFFIX="" WLSONAME="" if test "${enable_static:-no}" = "no"; then sharedlibdir="${bindir}" else sharedlibdir="${libdir}" fi GECODE_BUILD_SUPPORT_FLAG="-DGECODE_BUILD_SUPPORT" GECODE_BUILD_KERNEL_FLAG="-DGECODE_BUILD_KERNEL" GECODE_BUILD_SEARCH_FLAG="-DGECODE_BUILD_SEARCH" GECODE_BUILD_INT_FLAG="-DGECODE_BUILD_INT" GECODE_BUILD_FLOAT_FLAG="-DGECODE_BUILD_FLOAT" GECODE_BUILD_SET_FLAG="-DGECODE_BUILD_SET" GECODE_BUILD_MINIMODEL_FLAG="-DGECODE_BUILD_MINIMODEL" GECODE_BUILD_GIST_FLAG="-DGECODE_BUILD_GIST" GECODE_BUILD_FLATZINC_FLAG="-DGECODE_BUILD_FLATZINC" GECODE_BUILD_DRIVER_FLAG="-DGECODE_BUILD_DRIVER" ;; *) need_soname="yes" DLLFLAGS=""-shared"${DLLFLAGS:+ }${DLLFLAGS}" DLLEXT="so.${ac_gecode_soversion}.0" SOSUFFIX=".so.${ac_gecode_soversion}" SOLINKSUFFIX=".so" WLSONAME="-Wl,-soname=" sharedlibdir="${libdir}" GECODE_BUILD_SUPPORT_FLAG="" GECODE_BUILD_KERNEL_FLAG="" GECODE_BUILD_SEARCH_FLAG="" GECODE_BUILD_INT_FLAG="" GECODE_BUILD_FLOAT_FLAG="" GECODE_BUILD_SET_FLAG="" GECODE_BUILD_MINIMODEL_FLAG="" GECODE_BUILD_GIST_FLAG="" GECODE_BUILD_FLATZINC_FLAG="" GECODE_BUILD_DRIVER_FLAG="" ;; esac if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fPIC" >&5 $as_echo_n "checking whether ${CXX} accepts -fPIC... " >&6; } if ${CXX} -fPIC 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fPIC${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-fPIC${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fPIC" >&5 $as_echo_n "checking whether ${CXX} accepts -fPIC... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-fPIC${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fPIC${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -fPIC" >&5 $as_echo_n "checking whether ${CC} accepts -fPIC... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-fPIC${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-fPIC${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -Wextra" >&5 $as_echo_n "checking whether ${CXX} accepts -Wextra... " >&6; } if ${CXX} -Wextra 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-Wextra${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-Wextra${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -Wextra" >&5 $as_echo_n "checking whether ${CXX} accepts -Wextra... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-Wextra${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-Wextra${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -Wextra" >&5 $as_echo_n "checking whether ${CC} accepts -Wextra... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-Wextra${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-Wextra${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -Wall" >&5 $as_echo_n "checking whether ${CXX} accepts -Wall... " >&6; } if ${CXX} -Wall 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-Wall${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-Wall${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -Wall" >&5 $as_echo_n "checking whether ${CXX} accepts -Wall... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-Wall${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-Wall${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -Wall" >&5 $as_echo_n "checking whether ${CC} accepts -Wall... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-Wall${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-Wall${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -pipe" >&5 $as_echo_n "checking whether ${CXX} accepts -pipe... " >&6; } if ${CXX} -pipe 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-pipe${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-pipe${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -pipe" >&5 $as_echo_n "checking whether ${CXX} accepts -pipe... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-pipe${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-pipe${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -pipe" >&5 $as_echo_n "checking whether ${CC} accepts -pipe... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-pipe${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-pipe${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -ggdb" >&5 $as_echo_n "checking whether ${CXX} accepts -ggdb... " >&6; } if ${CXX} -ggdb 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -g" >&5 $as_echo_n "checking whether ${CXX} accepts -g... " >&6; } if ${CXX} -g 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-g${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-g${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -g" >&5 $as_echo_n "checking whether ${CXX} accepts -g... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-g${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-g${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -g" >&5 $as_echo_n "checking whether ${CC} accepts -g... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-g${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-g${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-ggdb${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-ggdb${CXXFLAGS:+ }${CXXFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -ggdb" >&5 $as_echo_n "checking whether ${CXX} accepts -ggdb... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-ggdb${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -g" >&5 $as_echo_n "checking whether ${CXX} accepts -g... " >&6; } if ${CXX} -g 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-g${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-g${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -g" >&5 $as_echo_n "checking whether ${CXX} accepts -g... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-g${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-g${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -g" >&5 $as_echo_n "checking whether ${CC} accepts -g... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-g${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-g${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-ggdb${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-ggdb${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -g" >&5 $as_echo_n "checking whether ${CXX} accepts -g... " >&6; } if ${CXX} -g 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-g${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-g${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -g" >&5 $as_echo_n "checking whether ${CXX} accepts -g... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-g${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-g${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -g" >&5 $as_echo_n "checking whether ${CC} accepts -g... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-g${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-g${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi ac_fn_cxx_check_func "$LINENO" "__builtin_ffsl" "ac_cv_func___builtin_ffsl" if test "x$ac_cv_func___builtin_ffsl" = xyes; then : $as_echo "#define GECODE_HAS_BUILTIN_FFSL /**/" >>confdefs.h fi docdir="${datadir}/doc/gecode" MANIFEST="@true" SBJEXT="s" LIBEXT="${DLLEXT}" LIBPREFIX="lib${ac_gecode_userprefix}gecode" STATICLIBEXT="a" MINUSLDIR="-L${libdir}" LINKLIBDIR="" cygpathprefix=$prefix test "x$cygpathprefix" = xNONE && cygpathprefix=$ac_default_prefix cygpathprefix="${cygpathprefix}" COMPILEOBJ="-c -o " COMPILESBJ="-S -o " CXXIN=" " CCIN=" " EXAMPLES_EXTRA_CXXFLAGS="" INSTALLLIBS="no" LINKPREFIX="-l${ac_gecode_userprefix}gecode" LINKSUFFIX="" LINKOUTPUT="-o " EXEOUTPUT="-o " SUPPORT="support" KERNEL="kernel" SEARCH="search" INT="int" FLOAT="float" SET="set" MM="minimodel" GIST="gist" FLATZINC="flatzinc" DRIVER="driver" # Check whether --enable-gcc-visibility was given. if test "${enable_gcc_visibility+set}" = set; then : enableval=$enable_gcc_visibility; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use gcc visibility attributes" >&5 $as_echo_n "checking whether to use gcc visibility attributes... " >&6; } if test "${enable_gcc_visibility:-yes}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fvisibility=hidden" >&5 $as_echo_n "checking whether ${CXX} accepts -fvisibility=hidden... " >&6; } if ${CXX} -fvisibility=hidden 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define GECODE_GCC_HAS_CLASS_VISIBILITY /**/" >>confdefs.h CFLAGS="-fvisibility=hidden${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-fvisibility=hidden${CXXFLAGS:+ }${CXXFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fvisibility=hidden" >&5 $as_echo_n "checking whether ${CXX} accepts -fvisibility=hidden... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-fvisibility=hidden${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define GECODE_GCC_HAS_CLASS_VISIBILITY /**/" >>confdefs.h CFLAGS="-fvisibility=hidden${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-fvisibility=hidden${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "${enable_debug:-no}" = "no" -a "${enable_gcov:-no}" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports forced inlining" >&5 $as_echo_n "checking if compiler supports forced inlining... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="${CXXFLAGS:+ }${CXXFLAGS} -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __clang__ # error "Macro __clang__ is undefined!" /* For some compilers (eg. SGI's CC), #error is not enough... */ please, do fail #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "#define forceinline inline" >>confdefs.h else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ inline __attribute__ ((__always_inline__)) void foo(void) {} int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define forceinline inline __attribute__ ((__always_inline__))" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "#define forceinline inline" >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS=${ac_gecode_save_CXXFLAGS} ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts ${ac_gecode_gcc_optimize_flag}" >&5 $as_echo_n "checking whether ${CXX} accepts ${ac_gecode_gcc_optimize_flag}... " >&6; } if ${CXX} ${ac_gecode_gcc_optimize_flag} 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="${ac_gecode_gcc_optimize_flag}${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="${ac_gecode_gcc_optimize_flag}${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts ${ac_gecode_gcc_optimize_flag}" >&5 $as_echo_n "checking whether ${CXX} accepts ${ac_gecode_gcc_optimize_flag}... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="${ac_gecode_gcc_optimize_flag}${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="${ac_gecode_gcc_optimize_flag}${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts ${ac_gecode_gcc_optimize_flag}" >&5 $as_echo_n "checking whether ${CC} accepts ${ac_gecode_gcc_optimize_flag}... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="${ac_gecode_gcc_optimize_flag}${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="${ac_gecode_gcc_optimize_flag}${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fno-strict-aliasing" >&5 $as_echo_n "checking whether ${CXX} accepts -fno-strict-aliasing... " >&6; } if ${CXX} -fno-strict-aliasing 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fno-strict-aliasing${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-fno-strict-aliasing${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fno-strict-aliasing" >&5 $as_echo_n "checking whether ${CXX} accepts -fno-strict-aliasing... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-fno-strict-aliasing${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fno-strict-aliasing${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -fno-strict-aliasing" >&5 $as_echo_n "checking whether ${CC} accepts -fno-strict-aliasing... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-fno-strict-aliasing${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-fno-strict-aliasing${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fno-math-errno" >&5 $as_echo_n "checking whether ${CXX} accepts -fno-math-errno... " >&6; } if ${CXX} -fno-math-errno 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fno-math-errno${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-fno-math-errno${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fno-math-errno" >&5 $as_echo_n "checking whether ${CXX} accepts -fno-math-errno... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-fno-math-errno${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fno-math-errno${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -fno-math-errno" >&5 $as_echo_n "checking whether ${CC} accepts -fno-math-errno... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-fno-math-errno${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-fno-math-errno${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -ffinite-math-only" >&5 $as_echo_n "checking whether ${CXX} accepts -ffinite-math-only... " >&6; } if ${CXX} -ffinite-math-only 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-ffinite-math-only${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-ffinite-math-only${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -ffinite-math-only" >&5 $as_echo_n "checking whether ${CXX} accepts -ffinite-math-only... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-ffinite-math-only${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-ffinite-math-only${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -ffinite-math-only" >&5 $as_echo_n "checking whether ${CC} accepts -ffinite-math-only... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-ffinite-math-only${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-ffinite-math-only${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fno-rounding-math" >&5 $as_echo_n "checking whether ${CXX} accepts -fno-rounding-math... " >&6; } if ${CXX} -fno-rounding-math 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fno-rounding-math${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-fno-rounding-math${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fno-rounding-math" >&5 $as_echo_n "checking whether ${CXX} accepts -fno-rounding-math... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-fno-rounding-math${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fno-rounding-math${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -fno-rounding-math" >&5 $as_echo_n "checking whether ${CC} accepts -fno-rounding-math... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-fno-rounding-math${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-fno-rounding-math${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fno-signaling-nans" >&5 $as_echo_n "checking whether ${CXX} accepts -fno-signaling-nans... " >&6; } if ${CXX} -fno-signaling-nans 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fno-signaling-nans${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-fno-signaling-nans${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fno-signaling-nans" >&5 $as_echo_n "checking whether ${CXX} accepts -fno-signaling-nans... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-fno-signaling-nans${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fno-signaling-nans${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -fno-signaling-nans" >&5 $as_echo_n "checking whether ${CC} accepts -fno-signaling-nans... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-fno-signaling-nans${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-fno-signaling-nans${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fcx-limited-range" >&5 $as_echo_n "checking whether ${CXX} accepts -fcx-limited-range... " >&6; } if ${CXX} -fcx-limited-range 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fcx-limited-range${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-fcx-limited-range${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fcx-limited-range" >&5 $as_echo_n "checking whether ${CXX} accepts -fcx-limited-range... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-fcx-limited-range${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fcx-limited-range${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -fcx-limited-range" >&5 $as_echo_n "checking whether ${CC} accepts -fcx-limited-range... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-fcx-limited-range${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-fcx-limited-range${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -mthreads" >&5 $as_echo_n "checking whether ${CXX} accepts -mthreads... " >&6; } if ${CXX} -mthreads 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-mthreads${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-mthreads${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -mthreads" >&5 $as_echo_n "checking whether ${CXX} accepts -mthreads... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-mthreads${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-mthreads${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -mthreads" >&5 $as_echo_n "checking whether ${CC} accepts -mthreads... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-mthreads${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-mthreads${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi else if test "${enable_debug:-no}" = "yes"; then $as_echo "#define forceinline inline" >>confdefs.h if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fno-inline-functions" >&5 $as_echo_n "checking whether ${CXX} accepts -fno-inline-functions... " >&6; } if ${CXX} -fno-inline-functions 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fno-inline-functions${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-fno-inline-functions${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fno-inline-functions" >&5 $as_echo_n "checking whether ${CXX} accepts -fno-inline-functions... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-fno-inline-functions${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fno-inline-functions${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -fno-inline-functions" >&5 $as_echo_n "checking whether ${CC} accepts -fno-inline-functions... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-fno-inline-functions${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-fno-inline-functions${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fimplement-inlines" >&5 $as_echo_n "checking whether ${CXX} accepts -fimplement-inlines... " >&6; } if ${CXX} -fimplement-inlines 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fimplement-inlines${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-fimplement-inlines${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fimplement-inlines" >&5 $as_echo_n "checking whether ${CXX} accepts -fimplement-inlines... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-fimplement-inlines${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fimplement-inlines${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -fimplement-inlines" >&5 $as_echo_n "checking whether ${CC} accepts -fimplement-inlines... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-fimplement-inlines${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-fimplement-inlines${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi fi fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -Qunused-arguments" >&5 $as_echo_n "checking whether ${CXX} accepts -Qunused-arguments... " >&6; } if ${CXX} -Qunused-arguments 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-Qunused-arguments${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-Qunused-arguments${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -Qunused-arguments" >&5 $as_echo_n "checking whether ${CXX} accepts -Qunused-arguments... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-Qunused-arguments${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-Qunused-arguments${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -Qunused-arguments" >&5 $as_echo_n "checking whether ${CC} accepts -Qunused-arguments... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-Qunused-arguments${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-Qunused-arguments${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi ;; intel) case $host_os in windows*) $as_echo "#define forceinline __forceinline" >>confdefs.h CFLAGS="-nologo -bigobj${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-nologo -bigobj${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-D_CRT_SECURE_NO_DEPRECATE${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-EHsc${CXXFLAGS:+ }${CXXFLAGS}" $as_echo "#define GECODE_MEMORY_ALIGNMENT sizeof(void*)" >>confdefs.h if test "${enable_debug:-no}" = "no"; then CFLAGS="${ac_gecode_cl_optimize_flag}${CFLAGS:+ }${CFLAGS}" CXXFLAGS="${ac_gecode_cl_optimize_flag}${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-MD -GS- -wd4355${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-MD -GS- -wd4355${CXXFLAGS:+ }${CXXFLAGS}" if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -arch:SSE2" >&5 $as_echo_n "checking whether ${CXX} accepts -arch:SSE2... " >&6; } if ${CXX} -arch:SSE2 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-arch:SSE2${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-arch:SSE2${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -arch:SSE2" >&5 $as_echo_n "checking whether ${CXX} accepts -arch:SSE2... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-arch:SSE2${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-arch:SSE2${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -arch:SSE2" >&5 $as_echo_n "checking whether ${CC} accepts -arch:SSE2... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-arch:SSE2${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-arch:SSE2${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi DLLFLAGS="${CXXFLAGS} -LD${DLLFLAGS:+ }${DLLFLAGS}" GLDFLAGS="-link -DEBUG -OPT:REF -OPT:ICF -MANIFEST -INCREMENTAL:NO" else CFLAGS="-MDd -Zi -wd4355${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-MDd -Zi -wd4355${CXXFLAGS:+ }${CXXFLAGS}" DLLFLAGS="${CXXFLAGS} -LDd${DLLFLAGS:+ }${DLLFLAGS}" GLDFLAGS="-link -MANIFEST -INCREMENTAL:NO" fi sharedlibdir="${bindir}" docdir="${prefix}" if test "${enable_static:-no}" = "yes"; then as_fn_error $? "Static linking not supported for Windows/cl." "$LINENO" 5 fi # Extract the first word of "mt.exe", so it can be a program name with args. set dummy mt.exe; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST"; then ac_cv_prog_MANIFEST="$MANIFEST" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_MANIFEST="mt.exe" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST=$ac_cv_prog_MANIFEST if test -n "$MANIFEST"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST" >&5 $as_echo "$MANIFEST" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi DLLPATH="" SBJEXT="sbj" DLLEXT="dll" SOSUFFIX="" SOLINKSUFFIX="" WLSONAME="" LIBEXT="lib" LIBPREFIX="${ac_gecode_userprefix}Gecode" LINKPREFIX="${ac_gecode_userprefix}Gecode" LINKSUFFIX=".lib" MINUSLDIR="" LINKLIBDIR="${libdir}/" cygpathprefix=$prefix test "x$cygpathprefix" = xNONE && cygpathprefix=$ac_default_prefix cygpathprefix=`cygpath -m ${cygpathprefix}` cygpathprefix="${cygpathprefix}" GECODE_BUILD_SUPPORT_FLAG="-DGECODE_BUILD_SUPPORT" GECODE_BUILD_KERNEL_FLAG="-DGECODE_BUILD_KERNEL" GECODE_BUILD_SEARCH_FLAG="-DGECODE_BUILD_SEARCH" GECODE_BUILD_INT_FLAG="-DGECODE_BUILD_INT" GECODE_BUILD_FLOAT_FLAG="-DGECODE_BUILD_FLOAT" GECODE_BUILD_SET_FLAG="-DGECODE_BUILD_SET" GECODE_BUILD_MINIMODEL_FLAG="-DGECODE_BUILD_MINIMODEL" GECODE_BUILD_GIST_FLAG="-DGECODE_BUILD_GIST" GECODE_BUILD_FLATZINC_FLAG="-DGECODE_BUILD_FLATZINC" GECODE_BUILD_DRIVER_FLAG="-DGECODE_BUILD_DRIVER" COMPILEOBJ="-c -Fo" COMPILESBJ="-c -Fa" CXXIN="-Tp" CCIN="-Tc" INSTALLLIBS="yes" LINKOUTPUT="-Fe" EXEOUTPUT="-Fe" SUPPORT="Support" KERNEL="Kernel" SEARCH="Search" INT="Int" FLOAT="Float" SET="Set" MM="Minimodel" GIST="Gist" FLATZINC="FlatZinc" DRIVER="Driver" ;; *) # Check whether --enable-gcc-visibility was given. if test "${enable_gcc_visibility+set}" = set; then : enableval=$enable_gcc_visibility; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use gcc visibility attributes" >&5 $as_echo_n "checking whether to use gcc visibility attributes... " >&6; } if test "${enable_gcc_visibility:-yes}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fvisibility=hidden" >&5 $as_echo_n "checking whether ${CXX} accepts -fvisibility=hidden... " >&6; } if ${CXX} -fvisibility=hidden 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define GECODE_GCC_HAS_CLASS_VISIBILITY /**/" >>confdefs.h CFLAGS="-fvisibility=hidden${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-fvisibility=hidden${CXXFLAGS:+ }${CXXFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fvisibility=hidden" >&5 $as_echo_n "checking whether ${CXX} accepts -fvisibility=hidden... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-fvisibility=hidden${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define GECODE_GCC_HAS_CLASS_VISIBILITY /**/" >>confdefs.h CFLAGS="-fvisibility=hidden${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-fvisibility=hidden${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi DLLPATH=-L. case $host_os in darwin*) need_soname="yes" DLLFLAGS="-Wl,-single_module${DLLFLAGS:+ }${DLLFLAGS}" DLLFLAGS=""-dynamiclib"${DLLFLAGS:+ }${DLLFLAGS}" DLLEXT="${ac_gecode_soversion}.0.dylib" SOSUFFIX=".${ac_gecode_soversion}.dylib" SOLINKSUFFIX=".dylib" sharedlibdir="${libdir}" WLSONAME="-compatibility_version ${ac_gecode_soversion}.0 -current_version ${ac_gecode_soversion}.0 -install_name ${libdir}/" GECODE_BUILD_SUPPORT_FLAG="" GECODE_BUILD_KERNEL_FLAG="" GECODE_BUILD_SEARCH_FLAG="" GECODE_BUILD_INT_FLAG="" GECODE_BUILD_FLOAT_FLAG="" GECODE_BUILD_SET_FLAG="" GECODE_BUILD_MINIMODEL_FLAG="" GECODE_BUILD_GIST_FLAG="" GECODE_BUILD_FLATZINC_FLAG="" GECODE_BUILD_DRIVER_FLAG="" ;; windows*) need_soname="no" if test "${enable_static:-no}" = "yes" -a \ "${enable_shared:-yes}" = "yes"; then as_fn_error $? "Only either static or shared libraries can be built." "$LINENO" 5 fi DLLFLAGS=""-shared"${DLLFLAGS:+ }${DLLFLAGS}" DLLEXT="dll" SOSUFFIX="" SOLINKSUFFIX="" WLSONAME="" if test "${enable_static:-no}" = "no"; then sharedlibdir="${bindir}" else sharedlibdir="${libdir}" fi GECODE_BUILD_SUPPORT_FLAG="-DGECODE_BUILD_SUPPORT" GECODE_BUILD_KERNEL_FLAG="-DGECODE_BUILD_KERNEL" GECODE_BUILD_SEARCH_FLAG="-DGECODE_BUILD_SEARCH" GECODE_BUILD_INT_FLAG="-DGECODE_BUILD_INT" GECODE_BUILD_FLOAT_FLAG="-DGECODE_BUILD_FLOAT" GECODE_BUILD_SET_FLAG="-DGECODE_BUILD_SET" GECODE_BUILD_MINIMODEL_FLAG="-DGECODE_BUILD_MINIMODEL" GECODE_BUILD_GIST_FLAG="-DGECODE_BUILD_GIST" GECODE_BUILD_FLATZINC_FLAG="-DGECODE_BUILD_FLATZINC" GECODE_BUILD_DRIVER_FLAG="-DGECODE_BUILD_DRIVER" ;; *) need_soname="yes" DLLFLAGS=""-shared"${DLLFLAGS:+ }${DLLFLAGS}" DLLEXT="so.${ac_gecode_soversion}.0" SOSUFFIX=".so.${ac_gecode_soversion}" SOLINKSUFFIX=".so" WLSONAME="-Wl,-soname=" sharedlibdir="${libdir}" GECODE_BUILD_SUPPORT_FLAG="" GECODE_BUILD_KERNEL_FLAG="" GECODE_BUILD_SEARCH_FLAG="" GECODE_BUILD_INT_FLAG="" GECODE_BUILD_FLOAT_FLAG="" GECODE_BUILD_SET_FLAG="" GECODE_BUILD_MINIMODEL_FLAG="" GECODE_BUILD_GIST_FLAG="" GECODE_BUILD_FLATZINC_FLAG="" GECODE_BUILD_DRIVER_FLAG="" ;; esac if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fPIC" >&5 $as_echo_n "checking whether ${CXX} accepts -fPIC... " >&6; } if ${CXX} -fPIC 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fPIC${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-fPIC${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fPIC" >&5 $as_echo_n "checking whether ${CXX} accepts -fPIC... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-fPIC${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fPIC${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -fPIC" >&5 $as_echo_n "checking whether ${CC} accepts -fPIC... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-fPIC${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-fPIC${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -Wextra" >&5 $as_echo_n "checking whether ${CXX} accepts -Wextra... " >&6; } if ${CXX} -Wextra 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-Wextra${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-Wextra${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -Wextra" >&5 $as_echo_n "checking whether ${CXX} accepts -Wextra... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-Wextra${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-Wextra${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -Wextra" >&5 $as_echo_n "checking whether ${CC} accepts -Wextra... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-Wextra${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-Wextra${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -Wall" >&5 $as_echo_n "checking whether ${CXX} accepts -Wall... " >&6; } if ${CXX} -Wall 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-Wall${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-Wall${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -Wall" >&5 $as_echo_n "checking whether ${CXX} accepts -Wall... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-Wall${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-Wall${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -Wall" >&5 $as_echo_n "checking whether ${CC} accepts -Wall... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-Wall${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-Wall${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -pipe" >&5 $as_echo_n "checking whether ${CXX} accepts -pipe... " >&6; } if ${CXX} -pipe 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-pipe${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-pipe${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -pipe" >&5 $as_echo_n "checking whether ${CXX} accepts -pipe... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-pipe${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-pipe${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -pipe" >&5 $as_echo_n "checking whether ${CC} accepts -pipe... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-pipe${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-pipe${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -ggdb" >&5 $as_echo_n "checking whether ${CXX} accepts -ggdb... " >&6; } if ${CXX} -ggdb 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -g" >&5 $as_echo_n "checking whether ${CXX} accepts -g... " >&6; } if ${CXX} -g 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-g${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-g${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -g" >&5 $as_echo_n "checking whether ${CXX} accepts -g... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-g${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-g${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -g" >&5 $as_echo_n "checking whether ${CC} accepts -g... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-g${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-g${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-ggdb${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-ggdb${CXXFLAGS:+ }${CXXFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -ggdb" >&5 $as_echo_n "checking whether ${CXX} accepts -ggdb... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-ggdb${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -g" >&5 $as_echo_n "checking whether ${CXX} accepts -g... " >&6; } if ${CXX} -g 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-g${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-g${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -g" >&5 $as_echo_n "checking whether ${CXX} accepts -g... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-g${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-g${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -g" >&5 $as_echo_n "checking whether ${CC} accepts -g... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-g${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-g${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-ggdb${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-ggdb${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -g" >&5 $as_echo_n "checking whether ${CXX} accepts -g... " >&6; } if ${CXX} -g 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-g${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-g${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -g" >&5 $as_echo_n "checking whether ${CXX} accepts -g... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-g${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-g${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -g" >&5 $as_echo_n "checking whether ${CC} accepts -g... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-g${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-g${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi ac_fn_cxx_check_func "$LINENO" "__builtin_ffsl" "ac_cv_func___builtin_ffsl" if test "x$ac_cv_func___builtin_ffsl" = xyes; then : $as_echo "#define GECODE_HAS_BUILTIN_FFSL /**/" >>confdefs.h fi docdir="${datadir}/doc/gecode" MANIFEST="@true" SBJEXT="s" LIBEXT="${DLLEXT}" LIBPREFIX="lib${ac_gecode_userprefix}gecode" STATICLIBEXT="a" MINUSLDIR="-L${libdir}" LINKLIBDIR="" cygpathprefix=$prefix test "x$cygpathprefix" = xNONE && cygpathprefix=$ac_default_prefix cygpathprefix="${cygpathprefix}" COMPILEOBJ="-c -o " COMPILESBJ="-S -o " CXXIN=" " CCIN=" " EXAMPLES_EXTRA_CXXFLAGS="" INSTALLLIBS="no" LINKPREFIX="-l${ac_gecode_userprefix}gecode" LINKSUFFIX="" LINKOUTPUT="-o " EXEOUTPUT="-o " SUPPORT="support" KERNEL="kernel" SEARCH="search" INT="int" FLOAT="float" SET="set" MM="minimodel" GIST="gist" FLATZINC="flatzinc" DRIVER="driver" if test "${enable_debug:-no}" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports forced inlining" >&5 $as_echo_n "checking if compiler supports forced inlining... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="${CXXFLAGS:+ }${CXXFLAGS} -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __clang__ # error "Macro __clang__ is undefined!" /* For some compilers (eg. SGI's CC), #error is not enough... */ please, do fail #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "#define forceinline inline" >>confdefs.h else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ inline __attribute__ ((__always_inline__)) void foo(void) {} int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define forceinline inline __attribute__ ((__always_inline__))" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "#define forceinline inline" >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS=${ac_gecode_save_CXXFLAGS} ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts ${ac_gecode_gcc_optimize_flag}" >&5 $as_echo_n "checking whether ${CXX} accepts ${ac_gecode_gcc_optimize_flag}... " >&6; } if ${CXX} ${ac_gecode_gcc_optimize_flag} 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="${ac_gecode_gcc_optimize_flag}${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="${ac_gecode_gcc_optimize_flag}${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts ${ac_gecode_gcc_optimize_flag}" >&5 $as_echo_n "checking whether ${CXX} accepts ${ac_gecode_gcc_optimize_flag}... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="${ac_gecode_gcc_optimize_flag}${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="${ac_gecode_gcc_optimize_flag}${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts ${ac_gecode_gcc_optimize_flag}" >&5 $as_echo_n "checking whether ${CC} accepts ${ac_gecode_gcc_optimize_flag}... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="${ac_gecode_gcc_optimize_flag}${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="${ac_gecode_gcc_optimize_flag}${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fno-strict-aliasing" >&5 $as_echo_n "checking whether ${CXX} accepts -fno-strict-aliasing... " >&6; } if ${CXX} -fno-strict-aliasing 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fno-strict-aliasing${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-fno-strict-aliasing${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fno-strict-aliasing" >&5 $as_echo_n "checking whether ${CXX} accepts -fno-strict-aliasing... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-fno-strict-aliasing${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fno-strict-aliasing${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -fno-strict-aliasing" >&5 $as_echo_n "checking whether ${CC} accepts -fno-strict-aliasing... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-fno-strict-aliasing${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-fno-strict-aliasing${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi else $as_echo "#define forceinline inline" >>confdefs.h if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fno-inline-functions" >&5 $as_echo_n "checking whether ${CXX} accepts -fno-inline-functions... " >&6; } if ${CXX} -fno-inline-functions 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fno-inline-functions${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-fno-inline-functions${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fno-inline-functions" >&5 $as_echo_n "checking whether ${CXX} accepts -fno-inline-functions... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-fno-inline-functions${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fno-inline-functions${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -fno-inline-functions" >&5 $as_echo_n "checking whether ${CC} accepts -fno-inline-functions... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-fno-inline-functions${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-fno-inline-functions${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fimplement-inlines" >&5 $as_echo_n "checking whether ${CXX} accepts -fimplement-inlines... " >&6; } if ${CXX} -fimplement-inlines 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fimplement-inlines${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-fimplement-inlines${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -fimplement-inlines" >&5 $as_echo_n "checking whether ${CXX} accepts -fimplement-inlines... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-fimplement-inlines${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-fimplement-inlines${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -fimplement-inlines" >&5 $as_echo_n "checking whether ${CC} accepts -fimplement-inlines... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-fimplement-inlines${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-fimplement-inlines${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi fi ;; esac ;; microsoft) $as_echo "#define forceinline __forceinline" >>confdefs.h CFLAGS="-nologo -bigobj${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-nologo -bigobj${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-D_CRT_SECURE_NO_DEPRECATE${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-EHsc${CXXFLAGS:+ }${CXXFLAGS}" $as_echo "#define GECODE_MEMORY_ALIGNMENT sizeof(void*)" >>confdefs.h if test "${enable_debug:-no}" = "no"; then CFLAGS="${ac_gecode_cl_optimize_flag}${CFLAGS:+ }${CFLAGS}" CXXFLAGS="${ac_gecode_cl_optimize_flag}${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-MD -GS- -wd4355${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-MD -GS- -wd4355${CXXFLAGS:+ }${CXXFLAGS}" if test "${ac_cv_cxx_compiler_vendor}" = "microsoft"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -arch:SSE2" >&5 $as_echo_n "checking whether ${CXX} accepts -arch:SSE2... " >&6; } if ${CXX} -arch:SSE2 2>&1 | grep "ignoring unknown option" -q; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-arch:SSE2${CXXFLAGS:+ }${CXXFLAGS}" CFLAGS="-arch:SSE2${CFLAGS:+ }${CFLAGS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} accepts -arch:SSE2" >&5 $as_echo_n "checking whether ${CXX} accepts -arch:SSE2... " >&6; } ac_gecode_save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-arch:SSE2${CXXFLAGS:+ }${CXXFLAGS} -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="-arch:SSE2${CXXFLAGS:+ }${CXXFLAGS}" fi else CXXFLAGS="${ac_gecode_save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} accepts -arch:SSE2" >&5 $as_echo_n "checking whether ${CC} accepts -arch:SSE2... " >&6; } ac_gecode_save_CFLAGS="${CFLAGS}" CFLAGS="-arch:SSE2${CFLAGS:+ }${CFLAGS} -Werror" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep -q "unrecognized\|argument unused" conftest.err; then CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="-arch:SSE2${CFLAGS:+ }${CFLAGS}" fi else CFLAGS="${ac_gecode_save_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi DLLFLAGS="${CXXFLAGS} -LD${DLLFLAGS:+ }${DLLFLAGS}" GLDFLAGS="-link -DEBUG -OPT:REF -OPT:ICF -MANIFEST -INCREMENTAL:NO" else CFLAGS="-MDd -Zi -wd4355${CFLAGS:+ }${CFLAGS}" CXXFLAGS="-MDd -Zi -wd4355${CXXFLAGS:+ }${CXXFLAGS}" DLLFLAGS="${CXXFLAGS} -LDd${DLLFLAGS:+ }${DLLFLAGS}" GLDFLAGS="-link -MANIFEST -INCREMENTAL:NO" fi sharedlibdir="${bindir}" docdir="${prefix}" if test "${enable_static:-no}" = "yes"; then as_fn_error $? "Static linking not supported for Windows/cl." "$LINENO" 5 fi # Extract the first word of "mt.exe", so it can be a program name with args. set dummy mt.exe; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST"; then ac_cv_prog_MANIFEST="$MANIFEST" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_MANIFEST="mt.exe" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST=$ac_cv_prog_MANIFEST if test -n "$MANIFEST"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST" >&5 $as_echo "$MANIFEST" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi DLLPATH="" SBJEXT="sbj" DLLEXT="dll" SOSUFFIX="" SOLINKSUFFIX="" WLSONAME="" LIBEXT="lib" LIBPREFIX="${ac_gecode_userprefix}Gecode" LINKPREFIX="${ac_gecode_userprefix}Gecode" LINKSUFFIX=".lib" MINUSLDIR="" LINKLIBDIR="${libdir}/" cygpathprefix=$prefix test "x$cygpathprefix" = xNONE && cygpathprefix=$ac_default_prefix cygpathprefix=`cygpath -m ${cygpathprefix}` cygpathprefix="${cygpathprefix}" GECODE_BUILD_SUPPORT_FLAG="-DGECODE_BUILD_SUPPORT" GECODE_BUILD_KERNEL_FLAG="-DGECODE_BUILD_KERNEL" GECODE_BUILD_SEARCH_FLAG="-DGECODE_BUILD_SEARCH" GECODE_BUILD_INT_FLAG="-DGECODE_BUILD_INT" GECODE_BUILD_FLOAT_FLAG="-DGECODE_BUILD_FLOAT" GECODE_BUILD_SET_FLAG="-DGECODE_BUILD_SET" GECODE_BUILD_MINIMODEL_FLAG="-DGECODE_BUILD_MINIMODEL" GECODE_BUILD_GIST_FLAG="-DGECODE_BUILD_GIST" GECODE_BUILD_FLATZINC_FLAG="-DGECODE_BUILD_FLATZINC" GECODE_BUILD_DRIVER_FLAG="-DGECODE_BUILD_DRIVER" COMPILEOBJ="-c -Fo" COMPILESBJ="-c -Fa" CXXIN="-Tp" CCIN="-Tc" INSTALLLIBS="yes" LINKOUTPUT="-Fe" EXEOUTPUT="-Fe" SUPPORT="Support" KERNEL="Kernel" SEARCH="Search" INT="Int" FLOAT="Float" SET="Set" MM="Minimodel" GIST="Gist" FLATZINC="FlatZinc" DRIVER="Driver" ;; *) as_fn_error $? "Gecode currently only supports the GNU and Microsoft compilers." "$LINENO" 5 ;; esac # Check whether --enable-doc-dot was given. if test "${enable_doc_dot+set}" = set; then : enableval=$enable_doc_dot; fi # Extract the first word of "dot", so it can be a program name with args. set dummy dot; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DOT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DOT"; then ac_cv_prog_DOT="$DOT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DOT="dot" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DOT=$ac_cv_prog_DOT if test -n "$DOT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOT" >&5 $as_echo "$DOT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable graphs in the documentation" >&5 $as_echo_n "checking whether to enable graphs in the documentation... " >&6; } if test "${enable_doc_dot:-yes}" = "yes"; then if test x$DOT = x; then if test x"${enable_doc_dot}" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } GECODE_DOXYGEN_DOT=NO else as_fn_error $? "you need the dot tool from graphviz to generate graphs in the documentation" "$LINENO" 5 fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } GECODE_DOXYGEN_DOT=YES fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } GECODE_DOXYGEN_DOT=NO fi # Check whether --enable-doc-search was given. if test "${enable_doc_search+set}" = set; then : enableval=$enable_doc_search; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable the documentation search engine" >&5 $as_echo_n "checking whether to enable the documentation search engine... " >&6; } if test "${enable_doc_search:-no}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ENABLEDOCSEARCH="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ENABLEDOCSEARCH="no" fi # Check whether --enable-doc-tagfile was given. if test "${enable_doc_tagfile+set}" = set; then : enableval=$enable_doc_tagfile; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to generate a doxygen tagfile" >&5 $as_echo_n "checking whether to generate a doxygen tagfile... " >&6; } if test "${enable_doc_tagfile:-yes}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } GECODE_DOXYGEN_TAGFILE="doc/gecode-doc.tag" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --enable-doc-chm was given. if test "${enable_doc_chm+set}" = set; then : enableval=$enable_doc_chm; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build compressed html documentation" >&5 $as_echo_n "checking whether to build compressed html documentation... " >&6; } case $host_os in windows*) if test "${enable_doc_chm:-yes}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ENABLEDOCCHM="yes" ENABLEDOCSEARCH="no" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ENABLEDOCCHM="no" fi ;; *) if test "${enable_doc_chm:-no}" = "yes"; then as_fn_error $? "building chms is only supported on Windows." "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ENABLEDOCCHM="no" fi ;; esac # Check whether --enable-doc-docset was given. if test "${enable_doc_docset+set}" = set; then : enableval=$enable_doc_docset; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build docset documentation for XCode" >&5 $as_echo_n "checking whether to build docset documentation for XCode... " >&6; } case $host_os in darwin*) if test "${enable_doc_docset:-no}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ENABLEDOCDOCSET="yes" ENABLEDOCSEARCH="no" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ENABLEDOCDOCSET="no" fi ;; *) if test "${enable_doc_docset:-no}" = "yes"; then as_fn_error $? "building docsets is only supported on Mac OS X." "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ENABLEDOCDOCSET="no" fi ;; esac # Check whether --with-vis was given. if test "${with_vis+set}" = set; then : withval=$with_vis; fi if test "${with_vis:-no}" != "no"; then with_vis=${with_vis//,/ } ac_gecode_vis="${with_vis}${ac_gecode_vis:+ }${ac_gecode_vis}" fi # Check whether --enable-float-vars was given. if test "${enable_float_vars+set}" = set; then : enableval=$enable_float_vars; fi ac_gecode_vis="\$(top_srcdir)/gecode/float/var-imp/float.vis${ac_gecode_vis:+ }${ac_gecode_vis}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the float variables library" >&5 $as_echo_n "checking whether to build the float variables library... " >&6; } if test "${enable_float_vars:-yes}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_float_vars="yes"; enable_int_vars="yes"; LINKFLOAT=${LINKLIBDIR}${LINKPREFIX}${FLOAT}${DLL_ARCH}${LINKSUFFIX} $as_echo "#define GECODE_HAS_FLOAT_VARS /**/" >>confdefs.h else enable_float_vars="no"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi enable_float_vars=${enable_float_vars} # Check whether --enable-set-vars was given. if test "${enable_set_vars+set}" = set; then : enableval=$enable_set_vars; fi ac_gecode_vis="\$(top_srcdir)/gecode/set/var-imp/set.vis${ac_gecode_vis:+ }${ac_gecode_vis}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the set variables library" >&5 $as_echo_n "checking whether to build the set variables library... " >&6; } if test "${enable_set_vars:-yes}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_set_vars="yes"; enable_int_vars="yes"; LINKSET=${LINKLIBDIR}${LINKPREFIX}${SET}${DLL_ARCH}${LINKSUFFIX} $as_echo "#define GECODE_HAS_SET_VARS /**/" >>confdefs.h else enable_set_vars="no"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi enable_set_vars=${enable_set_vars} # Check whether --enable-int-vars was given. if test "${enable_int_vars+set}" = set; then : enableval=$enable_int_vars; fi ac_gecode_vis="\$(top_srcdir)/gecode/int/var-imp/int.vis \$(top_srcdir)/gecode/int/var-imp/bool.vis${ac_gecode_vis:+ }${ac_gecode_vis}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the int variables library" >&5 $as_echo_n "checking whether to build the int variables library... " >&6; } if test "${enable_int_vars:-yes}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_int_vars="yes"; LINKINT=${LINKLIBDIR}${LINKPREFIX}${INT}${DLL_ARCH}${LINKSUFFIX} $as_echo "#define GECODE_HAS_INT_VARS /**/" >>confdefs.h else enable_int_vars="no"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi enable_int_vars=${enable_int_vars} # Check whether --enable-mpfr was given. if test "${enable_mpfr+set}" = set; then : enableval=$enable_mpfr; fi if test "${enable_float_vars:-yes}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with MPFR support" >&5 $as_echo_n "checking whether to build with MPFR support... " >&6; } if test "${enable_mpfr:-yes}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # Check whether --with-gmp-include was given. if test "${with_gmp_include+set}" = set; then : withval=$with_gmp_include; fi if test "${with_gmp_include:-no}" != "no"; then GMP_CPPFLAGS=-I${with_gmp_include} fi # Check whether --with-gmp-lib was given. if test "${with_gmp_lib+set}" = set; then : withval=$with_gmp_lib; fi ac_gecode_tmp_gmp_lib="" if test "${with_gmp_lib:-no}" != "no"; then case $ac_gecode_compiler_vendor in gnu) GMP_LIB_PATH="-L${with_gmp_lib}" ;; microsoft) GMP_LIB_PATH="/LIBPATH:${with_gmp_lib}" ;; esac else GMP_LIB_PATH="" fi ac_gecode_save_CPPFLAGS="${CPPFLAGS}" ac_gecode_save_LIBS="${LIBS}" case $ac_gecode_compiler_vendor in gnu) CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ } ${GMP_CPPFLAGS}" LIBS="${LIBS}${LIBS:+ } ${GMP_LIB_PATH}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpz_init in -lgmp" >&5 $as_echo_n "checking for __gmpz_init in -lgmp... " >&6; } if ${ac_cv_lib_gmp___gmpz_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgmp $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __gmpz_init (); int main () { return __gmpz_init (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_gmp___gmpz_init=yes else ac_cv_lib_gmp___gmpz_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp___gmpz_init" >&5 $as_echo "$ac_cv_lib_gmp___gmpz_init" >&6; } if test "x$ac_cv_lib_gmp___gmpz_init" = xyes; then : GMP_LINK="${ac_gecode_tmp_gmp_lib} -lgmp" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpz_init in -lmpir" >&5 $as_echo_n "checking for __gmpz_init in -lmpir... " >&6; } if ${ac_cv_lib_mpir___gmpz_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmpir $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __gmpz_init (); int main () { return __gmpz_init (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_mpir___gmpz_init=yes else ac_cv_lib_mpir___gmpz_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpir___gmpz_init" >&5 $as_echo "$ac_cv_lib_mpir___gmpz_init" >&6; } if test "x$ac_cv_lib_mpir___gmpz_init" = xyes; then : GMP_LINK="${ac_gecode_tmp_gmp_lib} -lmpir" else enable_mpfr=no; fi fi ;; microsoft) CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ } ${GMP_CPPFLAGS}" LIBS="${LIBS}${LIBS:+ } /link ${GMP_LIB_PATH} gmp.lib" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpz_init in -lgmp" >&5 $as_echo_n "checking for __gmpz_init in -lgmp... " >&6; } if ${ac_cv_lib_gmp___gmpz_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgmp $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __gmpz_init (); int main () { return __gmpz_init (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_gmp___gmpz_init=yes else ac_cv_lib_gmp___gmpz_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp___gmpz_init" >&5 $as_echo "$ac_cv_lib_gmp___gmpz_init" >&6; } if test "x$ac_cv_lib_gmp___gmpz_init" = xyes; then : GMP_LINK="${ac_gecode_tmp_gmp_lib} gmp.lib" else LIBS="${ac_gecode_save_LIBS}" LIBS="${LIBS}${LIBS:+ } /link ${GMP_LIB_PATH} mpir.lib" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpz_init in -lmpir" >&5 $as_echo_n "checking for __gmpz_init in -lmpir... " >&6; } if ${ac_cv_lib_mpir___gmpz_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmpir $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __gmpz_init (); int main () { return __gmpz_init (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_mpir___gmpz_init=yes else ac_cv_lib_mpir___gmpz_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpir___gmpz_init" >&5 $as_echo "$ac_cv_lib_mpir___gmpz_init" >&6; } if test "x$ac_cv_lib_mpir___gmpz_init" = xyes; then : GMP_LINK="${ac_gecode_tmp_gmp_lib} mpir.lib" else enable_mpfr=no; fi fi ;; esac CPPFLAGS="${ac_gecode_save_CPPFLAGS}" LIBS="${ac_gecode_save_LIBS}" # Check whether --with-mpfr-include was given. if test "${with_mpfr_include+set}" = set; then : withval=$with_mpfr_include; fi if test "${with_mpfr_include:-no}" != "no"; then MPFR_CPPFLAGS=-I${with_mpfr_include} fi # Check whether --with-mpfr-lib was given. if test "${with_mpfr_lib+set}" = set; then : withval=$with_mpfr_lib; fi if test "${with_mpfr_lib:-no}" != "no"; then case $ac_gecode_compiler_vendor in gnu) MPFR_LIB_PATH="-L${with_mpfr_lib}" ;; microsoft) MPFR_LIB_PATH="/LIBPATH:${with_mpfr_lib}" ;; esac else MPFR_LIB_PATH="" fi case $ac_gecode_compiler_vendor in gnu) MPFR_LINK="-lmpfr" ;; microsoft) MPFR_LINK="mpfr.lib" ;; esac ac_gecode_save_CPPFLAGS="${CPPFLAGS}" ac_gecode_save_LIBS="${LIBS}" case $ac_gecode_compiler_vendor in gnu) CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ } ${MPFR_CPPFLAGS} ${GMP_CPPFLAGS}" LIBS="${LIBS}${LIBS:+ } ${MPFR_LIB_PATH} ${GMP_LIB_PATH} ${MPFR_LINK} ${GMP_LINK}" for ac_header in gmp.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "gmp.h" "ac_cv_header_gmp_h" "$ac_includes_default" if test "x$ac_cv_header_gmp_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GMP_H 1 _ACEOF for ac_header in mpfr.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "mpfr.h" "ac_cv_header_mpfr_h" "$ac_includes_default" if test "x$ac_cv_header_mpfr_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MPFR_H 1 _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mpfr_add in -lmpfr" >&5 $as_echo_n "checking for mpfr_add in -lmpfr... " >&6; } if ${ac_cv_lib_mpfr_mpfr_add+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmpfr $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char mpfr_add (); int main () { return mpfr_add (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_mpfr_mpfr_add=yes else ac_cv_lib_mpfr_mpfr_add=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpfr_mpfr_add" >&5 $as_echo "$ac_cv_lib_mpfr_mpfr_add" >&6; } if test "x$ac_cv_lib_mpfr_mpfr_add" = xyes; then : $as_echo "#define GECODE_HAS_MPFR /**/" >>confdefs.h enable_mpfr=yes; else enable_mpfr=no; fi else enable_mpfr=no; fi done else enable_mpfr=no; fi done ;; microsoft) CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ } ${MPFR_CPPFLAGS} ${GMP_CPPFLAGS}" LIBS="${LIBS}${LIBS:+ } /link ${MPFR_LIB_PATH} ${GMP_LIB_PATH} ${MPFR_LINK} ${GMP_LINK}" for ac_header in gmp.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "gmp.h" "ac_cv_header_gmp_h" "$ac_includes_default" if test "x$ac_cv_header_gmp_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GMP_H 1 _ACEOF for ac_header in mpfr.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "mpfr.h" "ac_cv_header_mpfr_h" "$ac_includes_default" if test "x$ac_cv_header_mpfr_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MPFR_H 1 _ACEOF ac_fn_cxx_check_func "$LINENO" "mpfr_add" "ac_cv_func_mpfr_add" if test "x$ac_cv_func_mpfr_add" = xyes; then : $as_echo "#define GECODE_HAS_MPFR /**/" >>confdefs.h enable_mpfr=yes; else enable_mpfr=no; fi else enable_mpfr=no; fi done else enable_mpfr=no; fi done ;; esac CPPFLAGS="${ac_gecode_save_CPPFLAGS}" LIBS="${ac_gecode_save_LIBS}" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } enable_mpfr=no; fi else enable_mpfr=no; fi enable_mpfr=${enable_mpfr} # Check whether --enable-qt was given. if test "${enable_qt+set}" = set; then : enableval=$enable_qt; fi for ac_prog in qmake-qt4 qmake do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$QMAKE"; then ac_cv_prog_QMAKE="$QMAKE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_QMAKE="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi QMAKE=$ac_cv_prog_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$QMAKE" && break done for ac_prog in moc-qt4 moc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MOC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MOC"; then ac_cv_prog_MOC="$MOC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_MOC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MOC=$ac_cv_prog_MOC if test -n "$MOC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MOC" >&5 $as_echo "$MOC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$MOC" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with Qt support" >&5 $as_echo_n "checking whether to build with Qt support... " >&6; } if test "${enable_qt:-yes}" = "yes"; then if test "${QMAKE}x" = "x" -o "${MOC}x" = "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else ac_gecode_qt_version=`${QMAKE} -query QT_VERSION` ac_gecode_qt_major=`echo ${ac_gecode_qt_version} | grep -o '^[0-9]*'` ac_gecode_qt_minor=`echo ${ac_gecode_qt_version} | sed -e 's/^[0-9]*\\.//g' -e 's/\\.[0-9]*$//g'` ac_gecode_qt_ok="yes" if test ${ac_gecode_qt_major} -lt 4; then ac_gecode_qt_ok="no"; else if test ${ac_gecode_qt_major} -eq 4 \ -a ${ac_gecode_qt_minor} -lt 3; then ac_gecode_qt_ok="no"; fi fi if test "${ac_gecode_qt_ok}" != "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define GECODE_HAS_QT /**/" >>confdefs.h ac_gecode_qt_tmpdir=`mktemp -d gistqt.XXXXXX` || exit 1 cd ${ac_gecode_qt_tmpdir} echo "CONFIG += release" > a.pro if test ${ac_gecode_qt_major} -eq 5; then echo "QT += widgets printsupport" >> a.pro fi ${QMAKE} if test -d a.xcodeproj; then ac_gecode_qt_makefile=a.xcodeproj/qt_preprocess.mak elif test -d a.pbproj; then ac_gecode_qt_makefile=a.pbproj/qt_preprocess.mak elif test -f Makefile.Debug; then if test "${enable_debug:-no}" = "no"; then ac_gecode_qt_makefile=Makefile.Release else ac_gecode_qt_makefile=Makefile.Debug fi else ac_gecode_qt_makefile=Makefile fi ac_gecode_qt_defines=`grep ${ac_gecode_qt_makefile} -e 'DEFINES.*=' | sed -e 's/.*=//' -e 's|\\\\|/|g' -e 's|-I\\("*\\)\\.\\./\\.\\.|-I\\1..|g'` ac_gecode_qt_inc=`grep ${ac_gecode_qt_makefile} -e 'INCPATH.*=' | sed -e 's/.*=//' -e 's|\\\\|/|g' -e 's|-I\\("*\\)\\.\\./\\.\\.|-I\\1..|g'` ac_gecode_qt_libs=`grep ${ac_gecode_qt_makefile} -e 'LIBS.*=' | sed -e 's/.*=//' -e 's|\\\\|/|g' -e 's|-I\\("*\\)\\.\\./\\.\\.|-I\\1..|g'` if test -d a.xcodeproj -o -d a.pbproj; then ac_gecode_qt_libs="-framework QtGui -framework QtCore" fi cd .. rm -r ${ac_gecode_qt_tmpdir} QTINCLUDES=${ac_gecode_qt_inc} QTDEFINES=${ac_gecode_qt_defines} QTLIBS=${ac_gecode_qt_libs} enable_qt=yes enable_qt=yes; fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } enable_qt=no; fi enable_qt=${enable_qt} # Check whether --enable-gist was given. if test "${enable_gist+set}" = set; then : enableval=$enable_gist; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build Gist" >&5 $as_echo_n "checking whether to build Gist... " >&6; } if test "${enable_gist:-yes}" = "yes" -a "${enable_qt}" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_gist=yes $as_echo "#define GECODE_HAS_GIST /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}flex", so it can be a program name with args. set dummy ${ac_tool_prefix}flex; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_HAVEFLEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$HAVEFLEX"; then ac_cv_prog_HAVEFLEX="$HAVEFLEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_HAVEFLEX="${ac_tool_prefix}flex" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi HAVEFLEX=$ac_cv_prog_HAVEFLEX if test -n "$HAVEFLEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVEFLEX" >&5 $as_echo "$HAVEFLEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_HAVEFLEX"; then ac_ct_HAVEFLEX=$HAVEFLEX # Extract the first word of "flex", so it can be a program name with args. set dummy flex; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_HAVEFLEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_HAVEFLEX"; then ac_cv_prog_ac_ct_HAVEFLEX="$ac_ct_HAVEFLEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_HAVEFLEX="flex" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_HAVEFLEX=$ac_cv_prog_ac_ct_HAVEFLEX if test -n "$ac_ct_HAVEFLEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_HAVEFLEX" >&5 $as_echo "$ac_ct_HAVEFLEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_HAVEFLEX" = x; then HAVEFLEX="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac HAVEFLEX=$ac_ct_HAVEFLEX fi else HAVEFLEX="$ac_cv_prog_HAVEFLEX" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have at least flex 2.5.33" >&5 $as_echo_n "checking whether we have at least flex 2.5.33... " >&6; } if test "${HAVEFLEX}x" = "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_FLEXBISON="no" else if flex --version | grep ' 2\.5\.3[3-9]$' >/dev/null 2>&1 || flex --version | grep ' 2\.5\.4[0-9]$' >/dev/null 2>&1 || flex --version | grep ' 2\.[6-9]\.[0-9]*$' >/dev/null 2>&1 then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}bison", so it can be a program name with args. set dummy ${ac_tool_prefix}bison; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_HAVEBISON+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$HAVEBISON"; then ac_cv_prog_HAVEBISON="$HAVEBISON" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_HAVEBISON="${ac_tool_prefix}bison" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi HAVEBISON=$ac_cv_prog_HAVEBISON if test -n "$HAVEBISON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVEBISON" >&5 $as_echo "$HAVEBISON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_HAVEBISON"; then ac_ct_HAVEBISON=$HAVEBISON # Extract the first word of "bison", so it can be a program name with args. set dummy bison; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_HAVEBISON+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_HAVEBISON"; then ac_cv_prog_ac_ct_HAVEBISON="$ac_ct_HAVEBISON" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_HAVEBISON="bison" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_HAVEBISON=$ac_cv_prog_ac_ct_HAVEBISON if test -n "$ac_ct_HAVEBISON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_HAVEBISON" >&5 $as_echo "$ac_ct_HAVEBISON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_HAVEBISON" = x; then HAVEBISON="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac HAVEBISON=$ac_ct_HAVEBISON fi else HAVEBISON="$ac_cv_prog_HAVEBISON" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have at least bison 2.3" >&5 $as_echo_n "checking whether we have at least bison 2.3... " >&6; } if test "${HAVEBISON}x" = "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_FLEXBISON="no" else if bison --version | \ grep ' 2\.[3-9]\($\|\.[0-9]$\)' >/dev/null 2>&1 then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_FLEXBISON="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_FLEXBISON="no" fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_FLEXBISON="no" fi fi for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in getpagesize do : ac_fn_cxx_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" if test "x$ac_cv_func_getpagesize" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETPAGESIZE 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 $as_echo_n "checking for working mmap... " >&6; } if ${ac_cv_func_mmap_fixed_mapped+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_mmap_fixed_mapped=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc /* Thanks to Mike Haertel and Jim Avera for this test. Here is a matrix of mmap possibilities: mmap private not fixed mmap private fixed at somewhere currently unmapped mmap private fixed at somewhere already mapped mmap shared not fixed mmap shared fixed at somewhere currently unmapped mmap shared fixed at somewhere already mapped For private mappings, we should verify that changes cannot be read() back from the file, nor mmap's back from the file at a different address. (There have been systems where private was not correctly implemented like the infamous i386 svr4.0, and systems where the VM page cache was not coherent with the file system buffer cache like early versions of FreeBSD and possibly contemporary NetBSD.) For shared mappings, we should conversely verify that changes get propagated back to all the places they're supposed to be. Grep wants private fixed already mapped. The main things grep needs to know about mmap are: * does it exist and is it safe to write into the mmap'd area * how to use it (BSD variants) */ #include #include #if !defined STDC_HEADERS && !defined HAVE_STDLIB_H char *malloc (); #endif /* This mess was copied from the GNU getpagesize.h. */ #ifndef HAVE_GETPAGESIZE # ifdef _SC_PAGESIZE # define getpagesize() sysconf(_SC_PAGESIZE) # else /* no _SC_PAGESIZE */ # ifdef HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */ # ifdef NBPG # define getpagesize() NBPG * CLSIZE # ifndef CLSIZE # define CLSIZE 1 # endif /* no CLSIZE */ # else /* no NBPG */ # ifdef NBPC # define getpagesize() NBPC # else /* no NBPC */ # ifdef PAGESIZE # define getpagesize() PAGESIZE # endif /* PAGESIZE */ # endif /* no NBPC */ # endif /* no NBPG */ # endif /* no EXEC_PAGESIZE */ # else /* no HAVE_SYS_PARAM_H */ # define getpagesize() 8192 /* punt totally */ # endif /* no HAVE_SYS_PARAM_H */ # endif /* no _SC_PAGESIZE */ #endif /* no HAVE_GETPAGESIZE */ int main () { char *data, *data2, *data3; const char *cdata2; int i, pagesize; int fd, fd2; pagesize = getpagesize (); /* First, make a file with some known garbage in it. */ data = (char *) malloc (pagesize); if (!data) return 1; for (i = 0; i < pagesize; ++i) *(data + i) = rand (); umask (0); fd = creat ("conftest.mmap", 0600); if (fd < 0) return 2; if (write (fd, data, pagesize) != pagesize) return 3; close (fd); /* Next, check that the tail of a page is zero-filled. File must have non-zero length, otherwise we risk SIGBUS for entire page. */ fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); if (fd2 < 0) return 4; cdata2 = ""; if (write (fd2, cdata2, 1) != 1) return 5; data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); if (data2 == MAP_FAILED) return 6; for (i = 0; i < pagesize; ++i) if (*(data2 + i)) return 7; close (fd2); if (munmap (data2, pagesize)) return 8; /* Next, try to mmap the file at a fixed address which already has something else allocated at it. If we can, also make sure that we see the same garbage. */ fd = open ("conftest.mmap", O_RDWR); if (fd < 0) return 9; if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) return 10; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) return 11; /* Finally, make sure that changes to the mapped area do not percolate back to the file as seen by read(). (This is a bug on some variants of i386 svr4.0.) */ for (i = 0; i < pagesize; ++i) *(data2 + i) = *(data2 + i) + 1; data3 = (char *) malloc (pagesize); if (!data3) return 12; if (read (fd, data3, pagesize) != pagesize) return 13; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) return 14; close (fd); return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : ac_cv_func_mmap_fixed_mapped=yes else ac_cv_func_mmap_fixed_mapped=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 $as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then $as_echo "#define HAVE_MMAP 1" >>confdefs.h fi rm -f conftest.mmap conftest.txt # Check whether --enable-driver was given. if test "${enable_driver+set}" = set; then : enableval=$enable_driver; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build driver" >&5 $as_echo_n "checking whether to build driver... " >&6; } if test "${enable_driver:-yes}" = "yes"; then enable_driver="yes"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_search="yes"; enable_int="yes"; else enable_driver="no"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi enable_driver=${enable_driver} # Check whether --enable-flatzinc was given. if test "${enable_flatzinc+set}" = set; then : enableval=$enable_flatzinc; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build flatzinc" >&5 $as_echo_n "checking whether to build flatzinc... " >&6; } if test "${enable_flatzinc:-yes}" = "yes"; then enable_flatzinc="yes"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_search="yes"; enable_driver="yes"; enable_minimodel="yes"; else enable_flatzinc="no"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi enable_flatzinc=${enable_flatzinc} # Check whether --enable-driver was given. if test "${enable_driver+set}" = set; then : enableval=$enable_driver; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build driver" >&5 $as_echo_n "checking whether to build driver... " >&6; } if test "${enable_driver:-yes}" = "yes"; then enable_driver="yes"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_search="yes"; enable_int="yes"; else enable_driver="no"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi enable_driver=${enable_driver} # Check whether --enable-examples was given. if test "${enable_examples+set}" = set; then : enableval=$enable_examples; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build examples" >&5 $as_echo_n "checking whether to build examples... " >&6; } if test "${enable_examples:-yes}" = "yes"; then enable_examples="yes"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_search="yes"; enable_driver="yes"; enable_minimodel="yes"; else enable_examples="no"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi enable_examples=${enable_examples} # Check whether --enable-minimodel was given. if test "${enable_minimodel+set}" = set; then : enableval=$enable_minimodel; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build minimodel" >&5 $as_echo_n "checking whether to build minimodel... " >&6; } if test "${enable_minimodel:-yes}" = "yes"; then enable_minimodel="yes"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else enable_minimodel="no"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi enable_minimodel=${enable_minimodel} # Check whether --enable-search was given. if test "${enable_search+set}" = set; then : enableval=$enable_search; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build search" >&5 $as_echo_n "checking whether to build search... " >&6; } if test "${enable_search:-yes}" = "yes"; then enable_search="yes"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else enable_search="no"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi enable_search=${enable_search} ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. subdirs="$subdirs " VERSION=${PACKAGE_VERSION} DLLFLAGS=${DLLFLAGS} GLDFLAGS=${GLDFLAGS} ALLVIS=${ac_gecode_vis} VERSION_DASHES=`echo $PACKAGE_VERSION | sed -e s/\\\\./-/g` ARR=($(echo $PACKAGE_VERSION | sed 's/\./ /g')) PACKAGE_VERSION_NUMBER=$(expr $(expr $(expr ${ARR[0]} "*" 100000) + $(expr ${ARR[1]} "*" 100)) + ${ARR[2]}) cat >>confdefs.h <<_ACEOF #define GECODE_VERSION "${PACKAGE_VERSION}" _ACEOF cat >>confdefs.h <<_ACEOF #define GECODE_LIBRARY_VERSION "${VERSION_DASHES}" _ACEOF cat >>confdefs.h <<_ACEOF #define GECODE_VERSION_NUMBER ${PACKAGE_VERSION_NUMBER} _ACEOF cat >>confdefs.h <<_ACEOF #define GECODE_FLATZINC_VERSION "${GECODE_FLATZINC_VERSION}" _ACEOF ac_gecode_library_architecture=-${VERSION_DASHES}${ac_gecode_library_architecture} if test "$ac_gecode_compiler_vendor" == "microsoft" \ -o \( "$ac_gecode_compiler_vendor" == "intel" \ -a "$host_os" == "windows" \) ; then DLL_ARCH=${ac_gecode_library_architecture} else DLL_ARCH="" fi ac_config_files="$ac_config_files Makefile" if test "${host_os}" = "windows"; then BATCHFILE=".bat" ac_config_files="$ac_config_files tools/flatzinc/mzn-gecode.bat:tools/flatzinc/mzn-gecode.bat.in" else BATCHFILE="" ac_config_files="$ac_config_files tools/flatzinc/mzn-gecode:tools/flatzinc/mzn-gecode.in" fi ac_config_files="$ac_config_files doxygen.conf:doxygen/doxygen.conf.in" ac_config_files="$ac_config_files doxygen.hh:doxygen/doxygen.hh.in" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by GECODE $as_me 4.2.1, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ GECODE config.status 4.2.1 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "gecode/support/config.hpp") CONFIG_HEADERS="$CONFIG_HEADERS gecode/support/config.hpp" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "tools/flatzinc/mzn-gecode.bat") CONFIG_FILES="$CONFIG_FILES tools/flatzinc/mzn-gecode.bat:tools/flatzinc/mzn-gecode.bat.in" ;; "tools/flatzinc/mzn-gecode") CONFIG_FILES="$CONFIG_FILES tools/flatzinc/mzn-gecode:tools/flatzinc/mzn-gecode.in" ;; "doxygen.conf") CONFIG_FILES="$CONFIG_FILES doxygen.conf:doxygen/doxygen.conf.in" ;; "doxygen.hh") CONFIG_FILES="$CONFIG_FILES doxygen.hh:doxygen/doxygen.hh.in" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac case $ac_file$ac_mode in "tools/flatzinc/mzn-gecode.bat":F) chmod +x tools/flatzinc/mzn-gecode.bat ;; "tools/flatzinc/mzn-gecode":F) chmod +x tools/flatzinc/mzn-gecode ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file, --srcdir, and --disable-option-checking arguments # so they do not pile up. ac_sub_configure_args= ac_prev= eval "set x $ac_configure_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" # Pass --silent if test "$silent" = yes; then ac_sub_configure_args="--silent $ac_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d "$srcdir/$ac_dir" || continue ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 $as_echo "$ac_msg" >&6 as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ac_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ac_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ac_sub_configure=$ac_aux_dir/configure else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 $as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi cd "$ac_popdir" done fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gecode-4.2.1/configure.ac0000644000175000010010000002441212173473547014367 0ustar schulteNonednl This file was generated by Makefile.contribs. dnl Do not edit! Modifications will get lost! dnl Edit configure.ac.in instead. dnl dnl Main authors: dnl Guido Tack dnl dnl Copyright: dnl Guido Tack, 2004, 2005 dnl dnl Last modified: dnl $Date: 2013-07-23 14:30:31 +0200 (Tue, 23 Jul 2013) $ dnl by $Author: schulte $ dnl $Revision: 13938 $ dnl dnl This file is part of Gecode, the generic constraint dnl development environment: dnl http://www.gecode.org dnl dnl Permission is hereby granted, free of charge, to any person obtaining dnl a copy of this software and associated documentation files (the dnl "Software"), to deal in the Software without restriction, including dnl without limitation the rights to use, copy, modify, merge, publish, dnl distribute, sublicense, and/or sell copies of the Software, and to dnl permit persons to whom the Software is furnished to do so, subject to dnl the following conditions: dnl dnl The above copyright notice and this permission notice shall be dnl included in all copies or substantial portions of the Software. dnl dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, dnl EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND dnl NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE dnl LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION dnl OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION dnl WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. dnl dnl AC_REVISION([$Id: configure.ac 13938 2013-07-23 12:30:31Z schulte $]) AC_PREREQ(2.53) AC_INIT(GECODE, 4.2.1, users@gecode.org) AC_CONFIG_HEADERS([gecode/support/config.hpp]) AC_CONFIG_SRCDIR(gecode/kernel.hh) ac_gecode_soversion=36 AC_SUBST(GECODE_SOVERSION, ${ac_gecode_soversion}) ac_gecode_flatzincversion=1.6 AC_SUBST(GECODE_FLATZINC_VERSION, ${ac_gecode_flatzincversion}) # checks for programs : ${CXXFLAGS=""} dnl we do not want autoconf's default : ${CFLAGS=""} dnl we do not want autoconf's default : ${DLLFLAGS=""} dnl we do not want autoconf's default : ${GLDFLAGS=""} dnl we do not want autoconf's default dnl include Gecode specific macros m4_include([gecode.m4]) dnl determine the operating system AC_GECODE_GET_OS if test "${CXX}x" = "x" -a "${CC}x" = "x" -a "${host_os}" = "windows"; then CC=cl CXX=cl fi AC_PROG_CXX AC_PROG_CC AC_LANG(C++) AC_PROG_RANLIB dnl check whether we have certain programs we need AC_CHECK_PROG(PROG_DIFF, diff, [ok]) if test "${PROG_DIFF}x" = "x"; then AC_MSG_ERROR([In order to compile Gecode, you need the diff tool.]) fi AC_CHECK_PROG(PROG_TAR, tar, [ok]) if test "${PROG_TAR}x" = "x"; then AC_MSG_ERROR([In order to compile Gecode, you need the tar tool.]) fi AC_CHECK_PROG(PROG_MAKE, make, [ok]) if test "${PROG_MAKE}x" = "x"; then AC_MSG_ERROR([In order to compile Gecode, you need the make tool.]) fi AC_CHECK_PROG(PROG_SED, sed, [ok]) if test "${PROG_SED}x" = "x"; then AC_MSG_ERROR([In order to compile Gecode, you need the sed tool.]) fi AC_CHECK_PROG(PROG_PERL, perl, [ok]) if test "${PROG_PERL}x" = "x"; then AC_MSG_ERROR([In order to compile Gecode, you need perl.]) fi dnl determine which compiler we are using AC_CXX_COMPILER_VENDOR(ac_gecode_compiler_vendor) case $ac_gecode_compiler_vendor in gnu) AC_CHECK_GCC_VERSION(4,2) ;; intel) ;; microsoft) AC_CHECK_MSVC_VERSION(1400,2005) ;; *) ;; esac AC_GECODE_RESOURCE dnl check whether we can use GNU hash_map AC_CHECK_HEADER([ext/hash_map], [AC_DEFINE([GECODE_HAS_GNU_HASH_MAP],[], [Whether GNU hash_map is available])]) dnl check whether we want to build universal binaries on Mac OS X AC_GECODE_UNIVERSAL dnl check whether the user wants a prefix or suffixes for the libraries AC_GECODE_USER_SUFFIX dnl check whether we want to build a framework bundle on Mac OS X AC_GECODE_FRAMEWORK dnl check whether we want to build static libraries AC_GECODE_STATICLIBS dnl check whether we want to have assertions and debugging options AC_GECODE_DEBUG dnl check whether we want to have peak heap size tracking AC_GECODE_PEAKHEAP dnl check whether to optimize for code size AC_GECODE_CODESIZE dnl check whether we want to have support for finding memory leaks AC_GECODE_LEAK_DEBUG dnl check whether we want audit code in our build AC_GECODE_AUDIT dnl check whether we want to produce code suitable for profiling AC_GECODE_PROFILE dnl check whether we want to produce code instrumented for gcov AC_GECODE_GCOV dnl check platform specific behaviour of arithmetic AC_GECODE_CHECK_ARITH dnl checking for thread support AC_GECODE_THREADS dnl checking for timer to use AC_GECODE_TIMER case $ac_gecode_compiler_vendor in gnu) dnl general compiler flags AC_GECODE_UNIX_PATHS AC_GECODE_GCC_GENERAL_SWITCHES dnl check whether we want to use visibility attributes with gcc AC_GECODE_GCC_VISIBILITY if test "${enable_debug:-no}" = "no" -a "${enable_gcov:-no}" = "no"; then dnl compiler flags for an optimized build AC_GECODE_GCC_OPTIMIZED_SWITCHES dnl compiler flags for optimize float computings dnl AC_GECODE_CHECK_COMPILERFLAG([-ffast-math]) dnl ffast-math implies:-fno-math-errno -funsafe-math-optimizations -ffinite-math-only -fno-rounding-math -fno-signaling-nans -fcx-limited-range dnl but -funsafe-math-optimizations break IEEE float comptability, so we have to avoid it AC_GECODE_CHECK_COMPILERFLAG([-fno-math-errno]) AC_GECODE_CHECK_COMPILERFLAG([-ffinite-math-only]) AC_GECODE_CHECK_COMPILERFLAG([-fno-rounding-math]) AC_GECODE_CHECK_COMPILERFLAG([-fno-signaling-nans]) AC_GECODE_CHECK_COMPILERFLAG([-fcx-limited-range]) AC_GECODE_CHECK_COMPILERFLAG([-mthreads]) else if test "${enable_debug:-no}" = "yes"; then dnl compiler flags for a debug build AC_GECODE_GCC_DEBUG_SWITCHES fi fi AC_GECODE_CHECK_COMPILERFLAG([-Qunused-arguments]) ;; intel) dnl flags for creating dlls case $host_os in windows*) AC_GECODE_MSVC_SWITCHES ;; *) dnl check whether we want to use visibility attributes with gcc AC_GECODE_GCC_VISIBILITY dnl general compiler flags AC_GECODE_UNIX_PATHS AC_GECODE_GCC_GENERAL_SWITCHES if test "${enable_debug:-no}" = "no"; then dnl compiler flags for an optimized build AC_GECODE_GCC_OPTIMIZED_SWITCHES else dnl compiler flags for a debug build AC_GECODE_GCC_DEBUG_SWITCHES fi ;; esac ;; microsoft) AC_GECODE_MSVC_SWITCHES ;; *) AC_MSG_ERROR(Gecode currently only supports the GNU and Microsoft compilers.) ;; esac dnl find out what parts the user wants to build AC_GECODE_DOC_SWITCHES dnl ------------------------------------------------------------------ dnl Enabling of non-variable contribs dnl @CONTRIBS@ dnl ------------------------------------------------------------------ dnl Definition of variable types dnl Include contributor's vtis dnl @VTIS@ AC_GECODE_VIS AC_GECODE_VTI(float, [float variable library (implies --enable-int-vars)], yes, [\$(top_srcdir)/gecode/float/var-imp/float.vis], [enable_int_vars="yes"; AC_SUBST(LINKFLOAT,[${LINKLIBDIR}${LINKPREFIX}${FLOAT}${DLL_ARCH}${LINKSUFFIX}]) ], [ AC_SUBST(LINKFLOAT,[]) ] ) AC_GECODE_VTI(set, [finite set library (implies --enable-int-vars)], yes, [\$(top_srcdir)/gecode/set/var-imp/set.vis], [enable_int_vars="yes"; AC_SUBST(LINKSET,[${LINKLIBDIR}${LINKPREFIX}${SET}${DLL_ARCH}${LINKSUFFIX}]) ], [ AC_SUBST(LINKSET,[]) ] ) AC_GECODE_VTI(int, finite domain library, yes, [\$(top_srcdir)/gecode/int/var-imp/int.vis \$(top_srcdir)/gecode/int/var-imp/bool.vis], [ AC_SUBST(LINKINT,[${LINKLIBDIR}${LINKPREFIX}${INT}${DLL_ARCH}${LINKSUFFIX}]) ], [ AC_SUBST(LINKINT,[]) ]) dnl End of definition of variable types dnl ------------------------------------------------------------------ AC_GECODE_MPFR AC_GECODE_QT AC_GECODE_GIST AC_GECODE_FLEXBISON AC_FUNC_MMAP AC_GECODE_ENABLE_MODULE(driver, yes, [build script commandline driver library], [enable_search="yes"; enable_int="yes"; ]) AC_GECODE_ENABLE_MODULE(flatzinc, yes, [build FlatZinc interpreter], [enable_search="yes"; enable_driver="yes"; enable_minimodel="yes"; ]) AC_GECODE_ENABLE_MODULE(driver, yes, [build script commandline driver library], [enable_search="yes"; enable_int="yes"; ]) AC_GECODE_ENABLE_MODULE(examples, yes, [build examples for the enabled variable types], [enable_search="yes"; enable_driver="yes"; enable_minimodel="yes"; ]) AC_GECODE_ENABLE_MODULE(minimodel, yes, [build modeling support library for the enabled variable types]) AC_GECODE_ENABLE_MODULE(search, yes, [build search engines]) dnl Configure contributions AC_CONFIG_SUBDIRS() dnl @SUBDIRS@ AC_SUBST(VERSION, ${PACKAGE_VERSION}) AC_SUBST(DLLFLAGS, ${DLLFLAGS}) AC_SUBST(GLDFLAGS, ${GLDFLAGS}) AC_SUBST(ALLVIS, ${ac_gecode_vis}) VERSION_DASHES=`echo $PACKAGE_VERSION | sed -e s/\\\\./-/g` ARR=($(echo $PACKAGE_VERSION | sed 's/\./ /g')) changequote(,) PACKAGE_VERSION_NUMBER=$(expr $(expr $(expr ${ARR[0]} "*" 100000) + $(expr ${ARR[1]} "*" 100)) + ${ARR[2]}) changequote([,]) AC_DEFINE_UNQUOTED(GECODE_VERSION, "${PACKAGE_VERSION}", [Gecode version]) AC_DEFINE_UNQUOTED(GECODE_LIBRARY_VERSION, "${VERSION_DASHES}", [Gecode version]) AC_DEFINE_UNQUOTED(GECODE_VERSION_NUMBER, ${PACKAGE_VERSION_NUMBER}, [Gecode version]) AC_DEFINE_UNQUOTED(GECODE_FLATZINC_VERSION, "${GECODE_FLATZINC_VERSION}", [Supported version of FlatZinc] ) ac_gecode_library_architecture=-${VERSION_DASHES}${ac_gecode_library_architecture} if test "$ac_gecode_compiler_vendor" == "microsoft" \ -o \( "$ac_gecode_compiler_vendor" == "intel" \ -a "$host_os" == "windows" \) ; then AC_SUBST(DLL_ARCH,[${ac_gecode_library_architecture}]) else AC_SUBST(DLL_ARCH,[""]) fi AC_CONFIG_FILES([Makefile]) if test "${host_os}" = "windows"; then AC_SUBST(BATCHFILE, ".bat") AC_CONFIG_FILES([tools/flatzinc/mzn-gecode.bat:tools/flatzinc/mzn-gecode.bat.in],[chmod +x tools/flatzinc/mzn-gecode.bat]) else AC_SUBST(BATCHFILE, "") AC_CONFIG_FILES([tools/flatzinc/mzn-gecode:tools/flatzinc/mzn-gecode.in],[chmod +x tools/flatzinc/mzn-gecode]) fi AC_CONFIG_FILES([doxygen.conf:doxygen/doxygen.conf.in]) AC_CONFIG_FILES([doxygen.hh:doxygen/doxygen.hh.in]) AC_OUTPUT gecode-4.2.1/configure.ac.in0000644000175000010010000002421212173473547014772 0ustar schulteNonednl dnl Main authors: dnl Guido Tack dnl dnl Copyright: dnl Guido Tack, 2004, 2005 dnl dnl Last modified: dnl $Date: 2013-07-23 14:30:31 +0200 (Tue, 23 Jul 2013) $ dnl by $Author: schulte $ dnl $Revision: 13938 $ dnl dnl This file is part of Gecode, the generic constraint dnl development environment: dnl http://www.gecode.org dnl dnl Permission is hereby granted, free of charge, to any person obtaining dnl a copy of this software and associated documentation files (the dnl "Software"), to deal in the Software without restriction, including dnl without limitation the rights to use, copy, modify, merge, publish, dnl distribute, sublicense, and/or sell copies of the Software, and to dnl permit persons to whom the Software is furnished to do so, subject to dnl the following conditions: dnl dnl The above copyright notice and this permission notice shall be dnl included in all copies or substantial portions of the Software. dnl dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, dnl EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND dnl NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE dnl LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION dnl OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION dnl WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. dnl dnl AC_REVISION([$Id: configure.ac.in 13938 2013-07-23 12:30:31Z schulte $]) AC_PREREQ(2.53) AC_INIT(GECODE, 4.2.1, users@gecode.org) AC_CONFIG_HEADERS([gecode/support/config.hpp]) AC_CONFIG_SRCDIR(gecode/kernel.hh) ac_gecode_soversion=36 AC_SUBST(GECODE_SOVERSION, ${ac_gecode_soversion}) ac_gecode_flatzincversion=1.6 AC_SUBST(GECODE_FLATZINC_VERSION, ${ac_gecode_flatzincversion}) # checks for programs : ${CXXFLAGS=""} dnl we do not want autoconf's default : ${CFLAGS=""} dnl we do not want autoconf's default : ${DLLFLAGS=""} dnl we do not want autoconf's default : ${GLDFLAGS=""} dnl we do not want autoconf's default dnl include Gecode specific macros m4_include([gecode.m4]) dnl determine the operating system AC_GECODE_GET_OS if test "${CXX}x" = "x" -a "${CC}x" = "x" -a "${host_os}" = "windows"; then CC=cl CXX=cl fi AC_PROG_CXX AC_PROG_CC AC_LANG(C++) AC_PROG_RANLIB dnl check whether we have certain programs we need AC_CHECK_PROG(PROG_DIFF, diff, [ok]) if test "${PROG_DIFF}x" = "x"; then AC_MSG_ERROR([In order to compile Gecode, you need the diff tool.]) fi AC_CHECK_PROG(PROG_TAR, tar, [ok]) if test "${PROG_TAR}x" = "x"; then AC_MSG_ERROR([In order to compile Gecode, you need the tar tool.]) fi AC_CHECK_PROG(PROG_MAKE, make, [ok]) if test "${PROG_MAKE}x" = "x"; then AC_MSG_ERROR([In order to compile Gecode, you need the make tool.]) fi AC_CHECK_PROG(PROG_SED, sed, [ok]) if test "${PROG_SED}x" = "x"; then AC_MSG_ERROR([In order to compile Gecode, you need the sed tool.]) fi AC_CHECK_PROG(PROG_PERL, perl, [ok]) if test "${PROG_PERL}x" = "x"; then AC_MSG_ERROR([In order to compile Gecode, you need perl.]) fi dnl determine which compiler we are using AC_CXX_COMPILER_VENDOR(ac_gecode_compiler_vendor) case $ac_gecode_compiler_vendor in gnu) AC_CHECK_GCC_VERSION(4,2) ;; intel) ;; microsoft) AC_CHECK_MSVC_VERSION(1400,2005) ;; *) ;; esac AC_GECODE_RESOURCE dnl check whether we can use GNU hash_map AC_CHECK_HEADER([ext/hash_map], [AC_DEFINE([GECODE_HAS_GNU_HASH_MAP],[], [Whether GNU hash_map is available])]) dnl check whether we want to build universal binaries on Mac OS X AC_GECODE_UNIVERSAL dnl check whether the user wants a prefix or suffixes for the libraries AC_GECODE_USER_SUFFIX dnl check whether we want to build a framework bundle on Mac OS X AC_GECODE_FRAMEWORK dnl check whether we want to build static libraries AC_GECODE_STATICLIBS dnl check whether we want to have assertions and debugging options AC_GECODE_DEBUG dnl check whether we want to have peak heap size tracking AC_GECODE_PEAKHEAP dnl check whether to optimize for code size AC_GECODE_CODESIZE dnl check whether we want to have support for finding memory leaks AC_GECODE_LEAK_DEBUG dnl check whether we want audit code in our build AC_GECODE_AUDIT dnl check whether we want to produce code suitable for profiling AC_GECODE_PROFILE dnl check whether we want to produce code instrumented for gcov AC_GECODE_GCOV dnl check platform specific behaviour of arithmetic AC_GECODE_CHECK_ARITH dnl checking for thread support AC_GECODE_THREADS dnl checking for timer to use AC_GECODE_TIMER case $ac_gecode_compiler_vendor in gnu) dnl general compiler flags AC_GECODE_UNIX_PATHS AC_GECODE_GCC_GENERAL_SWITCHES dnl check whether we want to use visibility attributes with gcc AC_GECODE_GCC_VISIBILITY if test "${enable_debug:-no}" = "no" -a "${enable_gcov:-no}" = "no"; then dnl compiler flags for an optimized build AC_GECODE_GCC_OPTIMIZED_SWITCHES dnl compiler flags for optimize float computings dnl AC_GECODE_CHECK_COMPILERFLAG([-ffast-math]) dnl ffast-math implies:-fno-math-errno -funsafe-math-optimizations -ffinite-math-only -fno-rounding-math -fno-signaling-nans -fcx-limited-range dnl but -funsafe-math-optimizations break IEEE float comptability, so we have to avoid it AC_GECODE_CHECK_COMPILERFLAG([-fno-math-errno]) AC_GECODE_CHECK_COMPILERFLAG([-ffinite-math-only]) AC_GECODE_CHECK_COMPILERFLAG([-fno-rounding-math]) AC_GECODE_CHECK_COMPILERFLAG([-fno-signaling-nans]) AC_GECODE_CHECK_COMPILERFLAG([-fcx-limited-range]) AC_GECODE_CHECK_COMPILERFLAG([-mthreads]) else if test "${enable_debug:-no}" = "yes"; then dnl compiler flags for a debug build AC_GECODE_GCC_DEBUG_SWITCHES fi fi AC_GECODE_CHECK_COMPILERFLAG([-Qunused-arguments]) ;; intel) dnl flags for creating dlls case $host_os in windows*) AC_GECODE_MSVC_SWITCHES ;; *) dnl check whether we want to use visibility attributes with gcc AC_GECODE_GCC_VISIBILITY dnl general compiler flags AC_GECODE_UNIX_PATHS AC_GECODE_GCC_GENERAL_SWITCHES if test "${enable_debug:-no}" = "no"; then dnl compiler flags for an optimized build AC_GECODE_GCC_OPTIMIZED_SWITCHES else dnl compiler flags for a debug build AC_GECODE_GCC_DEBUG_SWITCHES fi ;; esac ;; microsoft) AC_GECODE_MSVC_SWITCHES ;; *) AC_MSG_ERROR(Gecode currently only supports the GNU and Microsoft compilers.) ;; esac dnl find out what parts the user wants to build AC_GECODE_DOC_SWITCHES dnl ------------------------------------------------------------------ dnl Enabling of non-variable contribs dnl @CONTRIBS@ dnl ------------------------------------------------------------------ dnl Definition of variable types dnl Include contributor's vtis dnl @VTIS@ AC_GECODE_VIS AC_GECODE_VTI(float, [float variable library (implies --enable-int-vars)], yes, [\$(top_srcdir)/gecode/float/var-imp/float.vis], [enable_int_vars="yes"; AC_SUBST(LINKFLOAT,[${LINKLIBDIR}${LINKPREFIX}${FLOAT}${DLL_ARCH}${LINKSUFFIX}]) ], [ AC_SUBST(LINKFLOAT,[]) ] ) AC_GECODE_VTI(set, [finite set library (implies --enable-int-vars)], yes, [\$(top_srcdir)/gecode/set/var-imp/set.vis], [enable_int_vars="yes"; AC_SUBST(LINKSET,[${LINKLIBDIR}${LINKPREFIX}${SET}${DLL_ARCH}${LINKSUFFIX}]) ], [ AC_SUBST(LINKSET,[]) ] ) AC_GECODE_VTI(int, finite domain library, yes, [\$(top_srcdir)/gecode/int/var-imp/int.vis \$(top_srcdir)/gecode/int/var-imp/bool.vis], [ AC_SUBST(LINKINT,[${LINKLIBDIR}${LINKPREFIX}${INT}${DLL_ARCH}${LINKSUFFIX}]) ], [ AC_SUBST(LINKINT,[]) ]) dnl End of definition of variable types dnl ------------------------------------------------------------------ AC_GECODE_MPFR AC_GECODE_QT AC_GECODE_GIST AC_GECODE_FLEXBISON AC_FUNC_MMAP AC_GECODE_ENABLE_MODULE(driver, yes, [build script commandline driver library], [enable_search="yes"; enable_int="yes"; ]) AC_GECODE_ENABLE_MODULE(flatzinc, yes, [build FlatZinc interpreter], [enable_search="yes"; enable_driver="yes"; enable_minimodel="yes"; ]) AC_GECODE_ENABLE_MODULE(driver, yes, [build script commandline driver library], [enable_search="yes"; enable_int="yes"; ]) AC_GECODE_ENABLE_MODULE(examples, yes, [build examples for the enabled variable types], [enable_search="yes"; enable_driver="yes"; enable_minimodel="yes"; ]) AC_GECODE_ENABLE_MODULE(minimodel, yes, [build modeling support library for the enabled variable types]) AC_GECODE_ENABLE_MODULE(search, yes, [build search engines]) dnl Configure contributions AC_CONFIG_SUBDIRS() dnl @SUBDIRS@ AC_SUBST(VERSION, ${PACKAGE_VERSION}) AC_SUBST(DLLFLAGS, ${DLLFLAGS}) AC_SUBST(GLDFLAGS, ${GLDFLAGS}) AC_SUBST(ALLVIS, ${ac_gecode_vis}) VERSION_DASHES=`echo $PACKAGE_VERSION | sed -e s/\\\\./-/g` ARR=($(echo $PACKAGE_VERSION | sed 's/\./ /g')) changequote(,) PACKAGE_VERSION_NUMBER=$(expr $(expr $(expr ${ARR[0]} "*" 100000) + $(expr ${ARR[1]} "*" 100)) + ${ARR[2]}) changequote([,]) AC_DEFINE_UNQUOTED(GECODE_VERSION, "${PACKAGE_VERSION}", [Gecode version]) AC_DEFINE_UNQUOTED(GECODE_LIBRARY_VERSION, "${VERSION_DASHES}", [Gecode version]) AC_DEFINE_UNQUOTED(GECODE_VERSION_NUMBER, ${PACKAGE_VERSION_NUMBER}, [Gecode version]) AC_DEFINE_UNQUOTED(GECODE_FLATZINC_VERSION, "${GECODE_FLATZINC_VERSION}", [Supported version of FlatZinc] ) ac_gecode_library_architecture=-${VERSION_DASHES}${ac_gecode_library_architecture} if test "$ac_gecode_compiler_vendor" == "microsoft" \ -o \( "$ac_gecode_compiler_vendor" == "intel" \ -a "$host_os" == "windows" \) ; then AC_SUBST(DLL_ARCH,[${ac_gecode_library_architecture}]) else AC_SUBST(DLL_ARCH,[""]) fi AC_CONFIG_FILES([Makefile]) if test "${host_os}" = "windows"; then AC_SUBST(BATCHFILE, ".bat") AC_CONFIG_FILES([tools/flatzinc/mzn-gecode.bat:tools/flatzinc/mzn-gecode.bat.in],[chmod +x tools/flatzinc/mzn-gecode.bat]) else AC_SUBST(BATCHFILE, "") AC_CONFIG_FILES([tools/flatzinc/mzn-gecode:tools/flatzinc/mzn-gecode.in],[chmod +x tools/flatzinc/mzn-gecode]) fi AC_CONFIG_FILES([doxygen.conf:doxygen/doxygen.conf.in]) AC_CONFIG_FILES([doxygen.hh:doxygen/doxygen.hh.in]) AC_OUTPUT gecode-4.2.1/contribs/0000755000175000010010000000000012236131650013703 5ustar schulteNonegecode-4.2.1/contribs/gelato/0000755000175000010010000000000012236131650015156 5ustar schulteNonegecode-4.2.1/contribs/qecode/0000755000175000010010000000000012236131650015143 5ustar schulteNonegecode-4.2.1/contribs/qecode/AbstractWorker.hh0000755000175000010010000000326411422534155020434 0ustar schulteNone /**** , [ Worker.hh ], Copyright (c) 2010 Universite de Caen Basse Normandie - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #ifndef __QECODE_ABSTRACT_WORKER__ #define __QECODE_ABSTRACT_WORKER__ #include "qecode.hh" #include #include "gecode/support.hh" using namespace Gecode::Support; class QECODE_VTABLE_EXPORT AQWorker : public Runnable { public: QECODE_EXPORT virtual void stopAndReturn()=0; QECODE_EXPORT virtual void stopAndForget()=0; QECODE_EXPORT virtual vector workPosition()=0; QECODE_EXPORT virtual bool mustStop()=0; QECODE_EXPORT virtual void wake()=0; // QECODE_EXPORT Strategy solve(); }; #endif gecode-4.2.1/contribs/qecode/clean0000755000175000010010000000007111177677044016170 0ustar schulteNonerm -rf *.o rm -rf lib* rm -f Makefile rm -f Makefile.in gecode-4.2.1/contribs/qecode/configure0000755000175000010010000024401012234137156017060 0ustar schulteNone#! /bin/sh # From configure.ac Revision. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for QECODE 1.2. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: jeremie.vautard@univ-orleans.fr about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='QECODE' PACKAGE_TARNAME='qecode' PACKAGE_VERSION='1.2' PACKAGE_STRING='QECODE 1.2' PACKAGE_BUGREPORT='jeremie.vautard@univ-orleans.fr' PACKAGE_URL='' ac_unique_file="qecode.hh" ac_subst_vars='LTLIBOBJS LIBOBJS QECODE target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking ' ac_precious_vars='build_alias host_alias target_alias' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures QECODE 1.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/qecode] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of QECODE 1.2:";; esac cat <<\_ACEOF Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF QECODE configure 1.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by QECODE $as_me 1.2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu QECODE="qecode" ../../config.status --file Makefile.in:Makefile.in.in ac_config_commands="$ac_config_commands Makefile.in" ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by QECODE $as_me 1.2, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ QECODE config.status 1.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile.in") CONFIG_COMMANDS="$CONFIG_COMMANDS Makefile.in" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gecode-4.2.1/contribs/qecode/configure.ac0000644000175000010010000000341411203234604017427 0ustar schulteNonednl dnl Author: dnl Jeremie Vautard dnl dnl Copyright: dnl UniversitÂŽ d'Orleans, 2005 dnl dnl Largely inspired from the map configure.ac file by GrÂŽgoire Dooms dnl ***********************************************************[configure.ac] dnl Copyright (c) 2007, Universite d'Orleans - Jeremie Vautard. dnl dnl Permission is hereby granted, free of charge, to any person obtaining a copy dnl of this software and associated documentation files (the "Software"), to deal dnl in the Software without restriction, including without limitation the rights dnl to use, copy, modify, merge, publish, distribute, sublicense, and/or sell dnl copies of the Software, and to permit persons to whom the Software is dnl furnished to do so, subject to the following conditions: dnl dnl The above copyright notice and this permission notice shall be included in dnl all copies or substantial portions of the Software. dnl dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR dnl IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, dnl FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE dnl AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER dnl LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, dnl OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN dnl THE SOFTWARE. dnl ************************************************************************* AC_REVISION([$Revision$]) AC_PREREQ(2.53) AC_INIT(QECODE, 1.2, jeremie.vautard@univ-orleans.fr) AC_CONFIG_SRCDIR(qecode.hh) dnl the names of the generated dlls AC_SUBST(QECODE, "qecode") ../../config.status --file Makefile.in:Makefile.in.in AC_CONFIG_COMMANDS([Makefile.in]) AC_CONFIG_FILES([Makefile]) AC_OUTPUT gecode-4.2.1/contribs/qecode/Doxyfile0000644000175000010010000002310011422534155016650 0ustar schulteNone# Doxyfile 1.5.2 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = qecode PROJECT_NUMBER = 2.1.0 OUTPUT_DIRECTORY = ./doc CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = /Applications/ STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 9 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES SHOW_DIRECTORIES = NO FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = . INPUT_ENCODING = UTF-8 FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.d \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.dox \ *.py RECURSIVE = YES EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXCLUDE_SYMBOLS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES REFERENCES_LINK_SOURCE = YES USE_HTAGS = NO VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = YES COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO MSCGEN_PATH = /Applications/Doxygen.app/Contents/Resources/ HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO CALLER_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = png DOT_PATH = /Applications/Doxygen.app/Contents/Resources/ DOTFILE_DIRS = DOT_GRAPH_MAX_NODES = 50 DOT_TRANSPARENT = NO DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gecode-4.2.1/contribs/qecode/examples/0000755000175000010010000000000012236131650016761 5ustar schulteNonegecode-4.2.1/contribs/qecode/examples/COMPILING0000644000175000010010000000205012070355242020223 0ustar schulteNoneTo compile the examples, you must add the qecode folder and the gecode folder (i.e. .. and ../../.. from this examples folder) to your include and library paths. These examples have to been linked against the gecodeint, gecodekernel, gecodeminimodel, gecodesupport, and gecodeqecode libraries. If you built the dynamic version of the gecode/qecode libraries, you will also have to add these folders to the dynamic libraries search path. Example (with dynamic libs) : For Linux, using gcc : $ g++ stress_test.cpp -I.. -I../../.. -L.. -L../../.. -lgecodeqecode -lgecodeminimodel -lgecodesearch -lgecodeint -lgecodekernel -lgecodesupport -lpthread -o stress_test $ export LD_LIBRARY_PATH="..:../../.." # only if using shared libraries $ ./stress_test For MacOS, using gcc : $ g++ stress_test.cpp -I.. -I../../.. -L.. -L../../.. -lgecodeqecode -lgecodeminimodel -lgecodesearch -lgecodeint -lgecodekernel -lgecodesupport -lpthread -o stress_test $ export DYLD_LIBRARY_PATH="..:../../.." # only if using shared libraries $ ./stress_test gecode-4.2.1/contribs/qecode/examples/MatrixGame.cpp0000644000175000010010000001215012070355242021523 0ustar schulteNone/**** , [ MatrixGame.cpp ], Copyright (c) 2007 Universite d'Orleans - Arnaud Lallouet Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #include /* for srand, rand et RAND_MAX */ #include /* for time */ #include /* for pow */ #include #include #include #include "qsolver_qcsp.hh" #include "QCOPPlus.hh" #define UNIVERSAL true #define EXISTENTIAL false // The Matrix game consists in a square boolean matrix of size 2^depth. First player cuts it vertically in two parts and removes one half, // while secodn player do the same, but cutting the matrix horizontally. The game ends when there are only one cell left in the matrix. // If this last cell has value 1, the first player wins. If it has value 0, the second player wins. // The present model of this game is pure QBF, that QeCode can handle (though not as fast as QBF solvers...) using namespace MiniModel; int main (int argc, char * const argv[]) { int depth = 5; // Size of the matrix is 2^depth. Larger values may take long to solve... int nbDecisionVar = 2*depth; int nbScope = nbDecisionVar+1; bool* qtScopes = new bool[nbScope]; for (int i=0;i=0; i--) access[i]=access[i+2]*2; // debug for (int i=0; i #include #include "QCOPPlus.hh" #include "qsolver_qcop.hh" #include using namespace std; using namespace Gecode; using namespace Gecode::Int; void printStr(Strategy s,int depth) { StrategyNode plop = s.getTag(); for (int glou=0;glou #include #include "QCOPPlus.hh" #include "qsolver_qcop.hh" #include using namespace std; using namespace Gecode; using namespace Gecode::Int; void printStr(Strategy s,int depth) { StrategyNode plop = s.getTag(); for (int glou=0;glou /////////////////////////////////////////////////////////////////////////////////////////// // This is a model of the nim-fibonacci game. We have a N matches set. First player may // // take between 1 and N-1 matches. Then, each player may take at most twice the number of// // matches taken by the last player. Take the last match to win ! // /////////////////////////////////////////////////////////////////////////////////////////// int main() { for (int N = 10; N<=22;N++) // Initial number of matches { clock_t start, finish; start=clock(); int* scopeSize = new int[N+2]; bool* qtScope = new bool[N+2]; for (int i=0;i using namespace std; using namespace Gecode; using namespace Gecode::Int; // This function prints a winning strategy. void printStr(Strategy s,int depth=0) { StrategyNode plop = s.getTag(); for (int glou=0;glou using namespace std; // This is a set of tiny problems which are used to dtect errors in QeCode. // This set is likely to progressively enlarge... int main() { unsigned long int nodes; unsigned long int steps; // Ax in 1..3 [] -> x=1 int sc1[] = {1}; bool q1[] = {QECODE_UNIVERSAL}; Qcop test1(1,q1,sc1); test1.QIntVar(0,1,3); IntVarArgs b1(1); b1[0] = test1.var(0); branch(*(test1.space()),b1,INT_VAR_SIZE_MIN(),INT_VAL_MIN()); test1.nextScope(); rel(*(test1.space()),test1.var(0) == 1); test1.makeStructure(); QCOP_solver s1(&test1); nodes=0; Strategy ret1=s1.solve(nodes); cout<<"Problem 1 : result = "<<(ret1.isFalse()?"FALSE":"TRUE")<<", sould be FALSE."< x=2 int sc3[] = {1}; bool q3[] = {QECODE_UNIVERSAL}; Qcop test3(1,q3,sc3); test3.QIntVar(0,1,3); rel(*(test3.space()),test3.var(0) == 1); IntVarArgs b3(1); b3[0] = test3.var(0); branch(*(test3.space()),b3,INT_VAR_SIZE_MIN(),INT_VAL_MIN()); test3.nextScope(); rel(*(test3.space()),test3.var(0) == 2); test3.makeStructure();; QCOP_solver s3(&test3); nodes=0; steps=0; Strategy ret3=s3.solve(nodes); cout<<"Problem 3 : result = "<<(ret3.isFalse()?"FALSE":"TRUE")<<", sould be FALSE."< Ey in 1..3 [x=2] -> y=1 int sc5[] = {1,1}; bool q5[] = {QECODE_UNIVERSAL,QECODE_EXISTENTIAL}; Qcop test5(2,q5,sc5); test5.QIntVar(0,1,3); test5.QIntVar(1,1,3); rel(*(test5.space()),test5.var(0) == 1); IntVarArgs b5(1); b5[0] = test5.var(0); branch(*(test5.space()),b5,INT_VAR_SIZE_MIN(),INT_VAL_MIN()); test5.nextScope(); rel(*(test5.space()),test5.var(0) == 2); IntVarArgs b52(2); b52[0] = test5.var(0); b52[1] = test5.var(1); branch(*(test5.space()),b52,INT_VAR_SIZE_MIN(),INT_VAL_MIN()); test5.nextScope(); rel(*(test5.space()),test5.var(1) == 1); test5.makeStructure(); QCOP_solver s5(&test5); nodes=0; steps=0; Strategy ret5=s5.solve(nodes); cout<<"Problem 5 : result = "<<(ret5.isFalse()?"FALSE":"TRUE")<<", sould be FALSE."< Ey in 1..3 [x=1] -> x=2 int sc6[] = {1,1}; bool q6[] = {QECODE_UNIVERSAL,QECODE_EXISTENTIAL}; Qcop test6(2,q6,sc6); test6.QIntVar(0,1,3); test6.QIntVar(1,1,3); rel(*(test6.space()),test6.var(0) == 1); IntVarArgs b6(1); b6[0] = test6.var(0); branch(*(test6.space()),b6,INT_VAR_SIZE_MIN(),INT_VAL_MIN()); test6.nextScope(); rel(*(test6.space()),test6.var(0) == 1); IntVarArgs b62(2); b62[0] = test6.var(0); b62[1] = test6.var(1); branch(*(test6.space()),b62,INT_VAR_SIZE_MIN(),INT_VAL_MIN()); test6.nextScope(); rel(*(test6.space()),test6.var(0) == 2); test6.makeStructure(); QCOP_solver s6(&test6); nodes=0; steps=0; Strategy ret6=s6.solve(nodes); cout<<"Problem 6 : result = "<<(ret6.isFalse()?"FALSE":"TRUE")<<", sould be FALSE."< y=0 int sc7[] = {1,1}; bool q7[] = {QECODE_EXISTENTIAL,QECODE_UNIVERSAL}; Qcop test7(2,q7,sc7); test7.QIntVar(0,1,3); test7.QIntVar(1,0,3); IntVarArgs b7(1); b7[0] = test7.var(0); branch(*(test7.space()),b7,INT_VAR_SIZE_MIN(),INT_VAL_MIN()); test7.nextScope(); rel(*(test7.space()),test7.var(1) <= 2); IntVarArgs b72(2); b72[0] = test7.var(0); b72[1] = test7.var(1); branch(*(test7.space()),b72,INT_VAR_SIZE_MIN(),INT_VAL_MIN()); test7.nextScope(); rel(*(test7.space()),test7.var(1) == 0); test7.makeStructure(); QCOP_solver s7(&test7); nodes=0; steps=0; Strategy ret7=s7.solve(nodes); cout<<"Problem 7 : result = "<<(ret7.isFalse()?"FALSE":"TRUE")<<", sould be FALSE."< y=0 int sc8[] = {1,1}; bool q8[] = {QECODE_EXISTENTIAL,QECODE_UNIVERSAL}; Qcop test8(2,q8,sc8); test8.QIntVar(0,1,3); test8.QIntVar(1,0,3); IntVarArgs b8(1); b8[0] = test8.var(0); branch(*(test8.space()),b8,INT_VAR_SIZE_MIN(),INT_VAL_MIN()); test8.nextScope(); rel(*(test8.space()),test8.var(1) == 0); IntVarArgs b82(2); b82[0] = test8.var(0); b82[1] = test8.var(1); branch(*(test8.space()),b82,INT_VAR_SIZE_MIN(),INT_VAL_MIN()); test8.nextScope(); rel(*(test8.space()),test8.var(1) == 0); test8.makeStructure(); QCOP_solver s8(&test8); nodes=0; steps=0; Strategy ret8=s8.solve(nodes); cout<<"Problem 8 : result = "<<(ret8.isFalse()?"FALSE":"TRUE")<<", sould be TRUE."<failed()) return; IntView xv(x); IntSetRanges ris(is); GECODE_ME_FAIL(home,xv.minus_r(home,ris)); } void myAntidom_bool(Space* home, BoolVar x, const IntSet& is, IntConLevel) { if (home->failed()) return; BoolView xv(x); IntSetRanges ris(is); GECODE_ME_FAIL(home,xv.minus_r(home,ris)); } /* void myDom_int(Space* home, IntVar x, const IntSet& is, IntConLevel) { if (home->failed()) return; IntView xv(x); IntSetRanges ris(is); GECODE_ME_FAIL(home,xv.inter_r(home,ris)); } void myDom_bool(Space* home, BoolVar x, const IntSet& is, IntConLevel) { if (home->failed()) return; BoolView xv(x); IntSetRanges ris(is); GECODE_ME_FAIL(home,xv.inter_r(home,ris)); } */ #endif gecode-4.2.1/contribs/qecode/myspace.cc0000755000175000010010000000707411422534155017131 0ustar schulteNone/*****************************************************************[myspace.cc] Copyright (c) 2007, Universite d'Orleans - Jeremie Vautard, Marco Benedetti, Arnaud Lallouet. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "./myspace.hh" #include using namespace std; MySpace::MySpace(unsigned int nv) : Space() { // cout <<"Space with "<(v[i]); break; case VTYPE_BOOL : delete static_cast(v[i]); break; default : cout<<"Unsupported variable type"<(ms.v[i]))); (static_cast(v[i]))->update(*this,share,*(static_cast(ms.v[i]))); break; case VTYPE_BOOL : v[i] = new BoolVar(*(static_cast(ms.v[i]))); (static_cast(v[i]))->update(*this,share,*(static_cast(ms.v[i]))); break; default: cout<<"Unsupported variable type"<(v[i])); cpt++; } } return ret; } BoolVarArgs MySpace::getBoolVars(unsigned int idMax) { int cpt=0; int i=0; if (n(v[i])); cpt++; } } return ret; } gecode-4.2.1/contribs/qecode/myspace.hh0000755000175000010010000000564711422534155017147 0ustar schulteNone/*****************************************************************[myspace.hh] Copyright (c) 2007, Universite d'Orleans - Jeremie Vautard, Marco Benedetti, Arnaud Lallouet. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *****************************************************************************/ #ifndef __QECODE_MYSPACE__ #define __QECODE_MYSPACE__ #include "qecode.hh" #include #include "gecode/minimodel.hh" #include "vartype.hh" using namespace Gecode; using namespace Gecode::Int; /** \brief A simple extension of Gecode::Space class * * A simple extension of the Space class from Gecode, in order to have access to the variables it contains. */ class QECODE_VTABLE_EXPORT MySpace : public Space { protected : unsigned int n; public: /** \brief This array contains all the variables this space contains. */ void** v; /** \brief This array indicates the type of each variable */ VarType* type_of_v; /** \brief Constructor of a space with a fixed number of variables * * Builds a space which will contain nv variables (the variables themselves are however not declared). * @param nv the number of variable the space must contain. */ QECODE_EXPORT MySpace(unsigned int nv); QECODE_EXPORT int nbVars() {return n;} QECODE_EXPORT MySpace(bool share,MySpace& ms); QECODE_EXPORT virtual MySpace* copy(bool share); QECODE_EXPORT virtual ~MySpace(); QECODE_EXPORT int getValue(unsigned int i); ///< returns the value of variable i. If boolean : 0 or 1 (false / true). /** \brief Returns the integer variables before idMax * * Returns an IntVarArgs containing all the integer variables of index inferior than parameter idMax */ QECODE_EXPORT IntVarArgs getIntVars(unsigned int idMax); /** \brief Returns the boolean variables before idMax * * Returns a BoolVarArgs containing all the boolean variables of index inferior than parameter idMax */ QECODE_EXPORT BoolVarArgs getBoolVars(unsigned int idMax); }; #endif gecode-4.2.1/contribs/qecode/OptVar.cc0000644000175000010010000000655411023525701016674 0ustar schulteNone/**** , [ OptVar.cc ], Copyright (c) 2008 Universite d'Orleans - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #include "OptVar.hh" ExistOptVar::ExistOptVar(int var,int scope) { varId = var; scopeId=scope; } int ExistOptVar::getVal(Strategy s) { // cout<<"getval on existoptvar "< scopeId) {cout<<"EOV "< values; values.clear(); if (s.isFalse()) {cout<<"UOV Try to get opt value on FALSE"<eval(values); if (s.isDummy()) { for (int i=0;igetVal(s.getChild(i))); } return fct->eval(values); } if (s.scope() == (scopeId-1)) { for (int i=0;igetVal(s.getChild(i))); } return fct->eval(values); } if (s.scope() < (scopeId-1) ) { if (s.quantifier()) {cout<<"UOV universal scope too soon"< scope-1 -> too far away cout<<"UOV try to get aggregate on a substrategy not containing required scope"< /** \brief Abstract class for an Aggregator * * An aggregator is defined as a function Multiset_of_int -> int. From an implementation * point of view, this multiset is a vector of int. */ class QECODE_VTABLE_EXPORT Aggregator { public: virtual int eval(vector values)=0; virtual ~Aggregator() {} }; /** \brief Sum aggregator * * This aggregator computes the sum of all elements of the multiset */ class QECODE_VTABLE_EXPORT AggregatorSum : public Aggregator{ public: QECODE_EXPORT virtual int eval(vector values) { int cpt=0; for (int i=0;i values) { int size=values.size(); if (size == 0) return 0; int cpt=0; for (int i=0;invar = nv; for (int i=0;iv[var] = new IntVar(*rules[i],min,max); rules[i]->type_of_v[var] = VTYPE_INT; } goal->v[var] = new IntVar(*goal,min,max); goal->type_of_v[var] = VTYPE_INT; varInitialised[var]=true; type_of_v[var]=VTYPE_INT; } void Qcop::QIntVar(int var,IntSet dom) { if (varInitialised[var]) { cout<<"Variable "<v[var] = new IntVar(*rules[i],dom); rules[i]->type_of_v[var] = VTYPE_INT; } goal->v[var] = new IntVar(*goal,dom); goal->type_of_v[var] = VTYPE_INT; varInitialised[var]=true; type_of_v[var]=VTYPE_INT; } void Qcop::QBoolVar(int var) { if (varInitialised[var]) { cout<<"Variable "<v[var] = new BoolVar(*rules[i],0,1); rules[i]->type_of_v[var]=VTYPE_BOOL; } goal->v[var] = new BoolVar(*goal,0,1); goal->type_of_v[var]=VTYPE_BOOL; varInitialised[var]=true; type_of_v[var]=VTYPE_BOOL; } MySpace* Qcop::space() { if (currentDeclareSpace(space()->v[n])); } BoolVar Qcop::bvar(int n) { if (!varInitialised[n]) { cout<<"Variable "<(space()->v[n])); } int Qcop::nextScope() { if (currentDeclareSpace == -1) return -1; currentDeclareSpace++; if (currentDeclareSpace>nbSpaces) return -1; return currentDeclareSpace; } void Qcop::makeStructure() { for (unsigned int i=0;inbSpaces;i++) { if (rules[i]->status() == SS_FAILED) { cout<<"MakeStructure : rule space "<status() == SS_FAILED) { cout<<"MakeStructure : goal space is already failed."<getScope() < scope) {cout<<"aggregated variable out of aggregator scope"<getScope();i++) // Universelle entre aggregateur et variable aggrŽgŽe if (Quantifiers[i]) {cout<<"Universal scope between variable and aggregator"<getScope() < scope) {cout<<"optvar out of optimizing scope"<getScope();i++) { if (Quantifiers[i]) // universelle entre variable et dŽcideur { cout<<"universal scope between variable and optimizing scope"<nbSpaces) { cout<<"I return NULL coz of bad scope value (<0)"<status() == SS_FAILED) { cout<<"I return NULL coz goal is failed"<(goal->clone()); } if (rules[scope]->status() == SS_FAILED) { cout<<"I return NULL coz scope "<(rules[scope]->clone())); } MySpace* Qcop::getGoal() { if (goal->status() == SS_FAILED) return NULL; return static_cast(goal->clone()); } int Qcop::getOptType(int scope) { if (Quantifiers[scope]) {cout<<"Try to get OptType on universal scope"<(optim[scope].vars[0]); } Qcop* Qcop::clone() { bool* qt = new bool[nbSpaces]; int* nvv = new int[nbSpaces]; MySpace** zerulz = new MySpace*[nbSpaces]; Opts* opop = new Opts[nbSpaces]; int* nbvbs = new int[nbSpaces]; for (unsigned int i=0;i < nbSpaces;i++) { qt[i] = this->Quantifiers[i]; nvv[i] = this->nvar[i]; zerulz[i] = static_cast(this->rules[i]->clone(false)); opop[i] = this->optim[i]; nbvbs[i] = this->nbVarBySpace[i]; } // void** v = new void*[this->n]; VarType* typeofv = new VarType[n]; int* wso = new int[n]; for (unsigned int i=0;itype_of_v[i]; wso[i] = this->whichSpaceOwns[i]; } Qcop* ret = new Qcop(); ret->nvar = nvv; ret->n = this->n; ret->nbSpaces = this->nbSpaces; ret->type_of_v = typeofv; ret->Quantifiers = qt; ret->rules = zerulz; ret->goal = static_cast(this->goal->clone(false)); ret->optim = opop; ret->nbVarBySpace = nbvbs; ret->whichSpaceOwns = wso; ret->varInitialised = this->varInitialised; currentDeclareSpace = this->currentDeclareSpace; return ret; }gecode-4.2.1/contribs/qecode/QCOPPlus.hh0000755000175000010010000001713711422534155017111 0ustar schulteNone/**** , [ QCOPPlus.hh ], Copyright (c) 2009 Universite d'Orleans - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #ifndef __QECODE_QCOP__ #define __QECODE_QCOP__ #include "myspace.hh" #include "vartype.hh" #include "OptVar.hh" #include using namespace std; using namespace Gecode; class QECODE_VTABLE_EXPORT Qcop { private: struct Opts { vector vars; // Several Optvars in universal scopes, one in existential ones int opt_type; // Used in existential scopes : 0 for ANY, 1 for MIN, 2 for MAX. }; int* nvar; int n; int nbSpaces; // void** v; VarType* type_of_v; bool* Quantifiers; MySpace** rules; MySpace* goal; Opts* optim; int* nbVarBySpace; int* whichSpaceOwns; bool* varInitialised; int currentDeclareSpace; Qcop() {} public: forceinline QECODE_EXPORT int nv() {return n;} /** \brief Default constructor for a restricted-quantified space * * This is the first step for building a QCSP+/QCOP+ problem. The prefix is defined here. * @param ns The number of scopes in the prefix. * @param quant Array of booleans which contains the quantifier of every scope (true for universal, false for existential). * @param nv Array of integer which contains the number of variables by scope. */ QECODE_EXPORT Qcop(int ns, bool* quant,int* nv); QECODE_EXPORT ~Qcop(); /** \brief Defines an integer variable in the quantified space * * Defines an integer variable in the quantifies space using a fully declared domain. * @param var Number of the variable to be defined. * @param dom The initial domain of the variable. */ QECODE_EXPORT void QIntVar(int var,int min,int max); /** \brief Defines an integer variable in the quantified space * * Defines an integer variable in the quantifies space using a fully declared domain. * @param var Number of the variable to be defined. * @param dom The initial domain of the variable. */ QECODE_EXPORT void QIntVar(int var,IntSet dom); /** \brief Defines a boolean variable in the quantified space * * Defines a boolean variable with a full initial domain in the quantified space. * @param var Number of the variable to be defined. */ QECODE_EXPORT void QBoolVar(int var); /** \brief Returns the current declarating space * * Return the space we are currently declarating constraints in. nextScope() is used to set the nextspace as the current one. */ QECODE_EXPORT MySpace* space(); /** \brief Returns an integer variable from the space we are currently declaring * * Returns an integer variable from the cpace we are currently declaring. Will abort if the variable is not integer. * @param n The number of the variable to return. */ QECODE_EXPORT IntVar var(int n); /** \brief Returns a boolean variable from the space we are currently declaring * * Returns a boolean variable from the space we are currently declaring. Will abort if the variable is not boolean. * @param n The number of the variable to return. */ QECODE_EXPORT BoolVar bvar(int n); /** \brief Switch to the next space for constraint declaration * * Switches to the next space for constraint declaration. var, bvar and space methods will now refer to the next rule space (or to the goal space if the current space was the last rule one). * Returns the new space number, or -1 if it was called while there was no next space to declare constraints in. */ QECODE_EXPORT int nextScope(); /** \brief Finalizes the object construction * * Finalizes the restricted-quantified space construction. Must be invoked once all the variable and all the constraints have been declared, and before the search is performed on this space. * calling this method is not mandatory, although it is recommanded to besure that the problem have been well built. * For the existential scopes on which an optimization condition have not been defined yet, this method will post a "Any" optimization condition (i.e. do not optimize). */ QECODE_EXPORT void makeStructure(); /** \brief returns an aggregate of the problem * * Creates an aggregate at a given universal scope. This aggregate is an optimization variable that an existential scope can use for optimizing. * @param scope the scope where this aggregate will be defined. Must be an unversal scope * @param opt The optimization variable we want to aggregate. There must not be any universal scope between an agregate and thisoptimization variable. * @param agg The aggregator function that will be used for this aggregate. */ QECODE_EXPORT OptVar* getAggregate(int scope, OptVar* opt, Aggregator* agg); /** returns an existential optimization variable * * Creates an optimization variable that will have the value of an existential variable defined in the problem. * @param var the number of the existential variable that must be considered */ QECODE_EXPORT OptVar* getExistential(int var); /** set an optimization condition on an existential scope * * set an optimization condition on a given existential scope of the problem. An optimizaiton condition is composed of an optimization variable (aggregate or existential variable), and of an * optimization type. * @param scope the scope on which the optimization condition is posted. Must be existential. * @param optType the optimization type of the condision we post. 0 is for ANY, 1 is for MIN, 2 is for MAX. * @param var the optimization variable to be minimized/maximized */ QECODE_EXPORT void optimize(int scope, int optType, OptVar* var); // QECODE_EXPORT void print(); QECODE_EXPORT forceinline bool qt_of_var(int v) { return Quantifiers[whichSpaceOwns[v]];} ///< returns uantifier of variable 'v' QECODE_EXPORT forceinline bool quantification(int scope) {return Quantifiers[scope];} ///< returns quantifier of scope 'scope' QECODE_EXPORT int spaces(); ///< returns the number of scopes of the problem QECODE_EXPORT forceinline int nbVarInScope(int scope) {return nbVarBySpace[scope];}///< returns the number of variables present in scope 'scope' QECODE_EXPORT MySpace* getSpace(int scope);///< returns a copy of the Gecode::Space corresponding to the 'scope'-th restricted quantifier of the problem QECODE_EXPORT MySpace* getGoal(); QECODE_EXPORT int getOptType(int scope); ///< returns the optimization type of the 'scope'-th scope of the problem QECODE_EXPORT OptVar* getOptVar(int scope);///< returns the optimization variable of the 'scope'-th scope of the problem QECODE_EXPORT Qcop* clone(); ///< makes a copy of the quantified problem QECODE_EXPORT forceinline int whoOwns(int var) {return whichSpaceOwns[var];} }; #endif gecode-4.2.1/contribs/qecode/QCSPPlusUnblockable.cc0000755000175000010010000001561311177677044021256 0ustar schulteNone/**** , [ QCSPPlusUnblockable.cc ], Copyright (c) 2009 Universite d'Orleans - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #include "QCSPPlusUnblockable.hh" QcspUnblockable::QcspUnblockable(int ns,bool* quant,int* nv) { n=0; for (int i=0;i[nbSpaces]; bvars = new vector[nbSpaces]; } QcspUnblockable::~QcspUnblockable() { delete arul; delete goal; } int QcspUnblockable::spaces() { return nbSpaces; } void QcspUnblockable::QIntVar(int var,int min,int max) { if (varInitialised[var]) { cout<<"Variable "<v[var] = new IntVar(*arul,dom); arul->type_of_v[var] = VTYPE_INT; goal->v[var] = new IntVar(*goal,dom); goal->type_of_v[var] = VTYPE_INT; varInitialised[var]=true; type_of_v[var]=VTYPE_INT; } void QcspUnblockable::QBoolVar(int var) { if (varInitialised[var]) { cout<<"Variable "<v[var] = new BoolVar(*arul,0,1); arul->type_of_v[var]=VTYPE_BOOL; goal->v[var] = new BoolVar(*goal,0,1); goal->type_of_v[var]=VTYPE_BOOL; varInitialised[var]=true; type_of_v[var]=VTYPE_BOOL; } MySpace* QcspUnblockable::space() { if (currentDeclareSpace(space()->v[n])); } BoolVar QcspUnblockable::bvar(int n) { if (!varInitialised[n]) { cout<<"Variable "<(space()->v[n])); } int QcspUnblockable::nextScope() { if (currentDeclareSpace == -1) return -1; currentDeclareSpace++; if (currentDeclareSpace>nbSpaces) return -1; return currentDeclareSpace; } void QcspUnblockable::makeStructure() { for (unsigned int i=0;inbSpaces) { cout<<"I return NULL coz of bad scope value (<0)"<status() == SS_FAILED) { cout<<"I return NULL coz goal is failed"<(goal->clone()); } if (arul->status() == SS_FAILED) { cout<<"I return NULL coz scope "<(arul->clone())); IntVarArgs iva(vars[scope].size()); BoolVarArgs bva(bvars[scope].size()); // cout << "sizes : " <(ret->v[idx]) ); } for (int i=0;i(ret->v[idx]) ); } br->branch(ret,iva,bva); return ret; } MySpace* QcspUnblockable::getGoal() { if (goal->status() == SS_FAILED) return NULL; return static_cast(goal->clone()); } void QcspUnblockable::branch(UnblockableBranching* b) { br=b; } gecode-4.2.1/contribs/qecode/QCSPPlusUnblockable.hh0000755000175000010010000001423111177677044021263 0ustar schulteNone/**** , [ QCSPPlusUnblockable.hh ], Copyright (c) 2009 Universite d'Orleans - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #ifndef __QECODE_UNBLOCKABLE__ #define __QECODE_UNBLOCKABLE__ #include #include #include "qecode.hh" #include "vartype.hh" #include "UnblockableBranching.hh" #include "myspace.hh" using namespace std; using namespace Gecode; class QECODE_VTABLE_EXPORT QcspUnblockable { private : int n; int nbSpaces; void** v; VarType* type_of_v; int* whichSpaceOwns; unsigned int currentDeclareSpace; bool* Quantifiers; MySpace* goal; int* nbVarBySpace; bool* varInitialised; UnblockableBranching* br; vector* vars; vector* bvars; MySpace* arul; public: QECODE_EXPORT int nv() {return n;} /** \brief Default constructor for a restricted-quantified space * * This is the first step for building a QCSP+/QCOP+ problem. The prefix is defined here. * @param ns The number of scopes in the prefix. * @param quant Array of booleans which contains the quantifier of every scope (true for universal, false for existential). * @param nv Array of integer which contains the number of variables by scope. */ QECODE_EXPORT QcspUnblockable(int ns, bool* quant,int* nv); QECODE_EXPORT ~QcspUnblockable(); /** \brief Defines an integer variable in the quantified space * * Defines an integer variable in the quantifies space using a fully declared domain. * @param var Number of the variable to be defined. * @param dom The initial domain of the variable. */ QECODE_EXPORT void QIntVar(int var,int min,int max); /** \brief Defines an integer variable in the quantified space * * Defines an integer variable in the quantifies space using a fully declared domain. * @param var Number of the variable to be defined. * @param dom The initial domain of the variable. */ QECODE_EXPORT void QIntVar(int var,IntSet dom); /** \brief Defines a boolean variable in the quantified space * * Defines a boolean variable with a full initial domain in the quantified space. * @param var Number of the variable to be defined. */ QECODE_EXPORT void QBoolVar(int var); /** \brief Returns the current declarating space * * Return the space we are currently declarating constraints in. nextScope() is used to set the nextspace as the current one. */ QECODE_EXPORT MySpace* space(); /** \brief Returns an integer variable from the space we are currently declaring * * Returns an integer variable from the cpace we are currently declaring. Will abort if the variable is not integer. * @param n The number of the variable to return. */ QECODE_EXPORT IntVar var(int n); /** \brief Returns a boolean variable from the space we are currently declaring * * Returns a boolean variable from the space we are currently declaring. Will abort if the variable is not boolean. * @param n The number of the variable to return. */ QECODE_EXPORT BoolVar bvar(int n); /** \brief Switch to the next space for constraint declaration * * Switches to the next space for constraint declaration. var, bvar and space methods will now refer to the next rule space (or to the goal space if the current space was the last rule one). * Returns the new space number, or -1 if it was called while there was no next space to declare constraints in. */ QECODE_EXPORT int nextScope(); /** \brief Finalizes the object construction * * Finalizes the restricted-quantified space construction. Must be invoked once all the variable and all the constraints have been declared, and before the search is performed on this space. * calling this method is not mandatory, although it is recommanded to besure that the problem have been well built. * For the existential scopes on which an optimization condition have not been defined yet, this method will post a "Any" optimization condition (i.e. do not optimize). */ QECODE_EXPORT void makeStructure(); QECODE_EXPORT bool qt_of_var(int v); ///< returns uantifier of variable 'v' QECODE_EXPORT bool quantification(int scope) {return Quantifiers[scope];} ///< returns quantifier of scope 'scope' QECODE_EXPORT int spaces(); ///< returns the number of scopes of the problem QECODE_EXPORT int nbVarInScope(int scope) {return nbVarBySpace[scope];}///< returns the number of variables present in scope 'scope' QECODE_EXPORT MySpace* getSpace(int scope);///< returns a copy of the Gecode::Space corresponding to the scope-th restricted quantifier of the problem QECODE_EXPORT MySpace* getGoal(); /** \brief sets the branching heuristic * * Declares the branching heuristic that will be used to solve this problem. */ QECODE_EXPORT void branch(UnblockableBranching* b); }; #endif gecode-4.2.1/contribs/qecode/qecode.hh0000644000175000010010000000347411177677044016753 0ustar schulteNone/**** , [ qecode.hh ], Copyright (c) 2007 Universite d'Orleans - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #ifndef __QECODE_HH__ #define __QECODE_HH__ #include "gecode/kernel.hh" #if !defined(GECODE_STATIC_LIBS) && \ (defined(__CYGWIN__) || defined(__MINGW32__) || defined(_MSC_VER)) #define QECODE_VTABLE_EXPORT #ifdef GECODE_BUILD_QECODE #define QECODE_EXPORT __declspec( dllexport ) #else #define QECODE_EXPORT __declspec( dllimport ) #endif #else #ifdef GECODE_GCC_HAS_CLASS_VISIBILITY #define QECODE_VTABLE_EXPORT __attribute__ ((visibility("default"))) #define QECODE_EXPORT __attribute__ ((visibility("default"))) #else #define QECODE_VTABLE_EXPORT #define QECODE_EXPORT #endif #endif #define QECODE_EXISTENTIAL false #define QECODE_UNIVERSAL true #endif gecode-4.2.1/contribs/qecode/qsolver_parallel.cc0000644000175000010010000000332011422534155021022 0ustar schulteNone/************************************************************ qsolver_parallel.cc Copyright (c) 2010 Universite d'Orleans - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #include "qsolver_parallel.hh" QCSP_Parallel_Solver::QCSP_Parallel_Solver(Qcop* sp,WorkComparator* c,unsigned int nbWorkers) : wm(sp,c) { workers = new QWorker*[nbWorkers]; nw = nbWorkers; for (unsigned int i=0;i #include #include "Strategy.hh" #include "qecode.hh" class QECODE_VTABLE_EXPORT QCSP_Parallel_Solver { private : WorkManager wm; QWorker** workers; unsigned int nw; public : QECODE_EXPORT QCSP_Parallel_Solver(Qcop* sp,WorkComparator* c,unsigned int nbWorkers); QECODE_EXPORT Strategy solve(); };gecode-4.2.1/contribs/qecode/qsolver_qcop.cc0000644000175000010010000002643411422534155020203 0ustar schulteNone/**** , [ qsolver_qcop.cc ], Copyright (c) 2010 Universite de Caen Basse Normandie - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #include "qsolver_qcop.hh" #include QCOP_solver::QCOP_solver(Qcop* sp) { this->sp = sp; nbRanges=new int; } Strategy QCOP_solver::solve(unsigned long int& nodes) { vector plop; plop.clear(); return rSolve(sp,0,plop,nodes); } Strategy QCOP_solver::rSolve(Qcop* qs,int scope, vector assignments, unsigned long int& nodes) { nodes++; // cout<<"rSolve for scope "<spaces()) { // cout<<"First case"<getGoal(); if (g == NULL) {/*cout<<"the goal was null"<nbVars();i++) { switch (g->type_of_v[i]) { case VTYPE_INT : rel(*g,*(static_cast(g->v[i])) == assignments[i]); break; case VTYPE_BOOL : rel(*g,*(static_cast(g->v[i])) == assignments[i]); break; default : cout<<"1Unknown variable type"<status() == SS_FAILED) { // cout<<"goal failed after assignments"<getSpace(scope); if (espace == NULL) cout<<"I caught a NULL for scope "<type_of_v[i]) { case VTYPE_INT : rel(*espace,*(static_cast(espace->v[i])) == assignments[i]); break; case VTYPE_BOOL : rel(*espace,*(static_cast(espace->v[i])) == assignments[i]); break; default : cout<<"2Unknown variable type"<quantification(scope)) { // cout<<"universal"<status() == SS_FAILED) { // cout<<"the scope is failed"< solutions(espace); MySpace* sol = solutions.next(); if (sol == NULL) { // cout<<"first sol is null"< assign; for (int i = 0; inbVars();i++) { switch (sol->type_of_v[i]) { case VTYPE_INT : assign.push_back( (static_cast(sol->v[i]))->val() ); break; case VTYPE_BOOL : assign.push_back( (static_cast(sol->v[i]))->val() ); break; default : cout<<"3Unknown variable type"<nbVarInScope(scope-1)) ); int vmax = (qs->nbVarInScope(scope))-1; vector zevalues; for (int i = vmin; i<=vmax;i++) { switch (sol->type_of_v[i]) { case VTYPE_INT : zevalues.push_back( (static_cast(sol->v[i]))->val() ); break; case VTYPE_BOOL : zevalues.push_back( (static_cast(sol->v[i]))->val() ); break; default : cout<<"4Unknown variable type"<status()) == SS_FAILED) { // cout<<"the Espace is failed"< solutions(espace); MySpace* sol =solutions.next(); if (sol == NULL) { // cout<<"the first sol is null"<getOptVar(scope); int opttype = qs->getOptType(scope); Strategy retour(StrategyNode::SFalse()); int score= ( (opttype == 1) ? INT_MAX : INT_MIN ); while (sol != NULL) { // cout<<"une solution"< assign; for (int i = 0; inbVars();i++) { switch (sol->type_of_v[i]) { case VTYPE_INT : assign.push_back( (static_cast(sol->v[i]))->val() ); break; case VTYPE_BOOL : assign.push_back( (static_cast(sol->v[i]))->val() ); break; default : cout<<"5Unknown variable type"<nbVarInScope(scope-1) ); int vmax = qs->nbVarInScope(scope)-1; vector zevalues; for (int i = vmin; i<=vmax;i++) { switch (sol->type_of_v[i]) { case VTYPE_INT : zevalues.push_back( (static_cast(sol->v[i]))->val() ); break; case VTYPE_BOOL : zevalues.push_back( (static_cast(sol->v[i]))->val() ); break; default : cout<<"6unknown Variable type"<getVal(candidate); // cout<<"score of candidate is "< score) { retour=candidate; score=score_of_candidate; } break; default : cout<<"Unknown opt type : "< #include #include "gecode/minimodel.hh" #include "gecode/search.hh" #include "Strategy.hh" #include "qecode.hh" using namespace Gecode; /** General QCSP+ / QCOP+ Solver. * This class is the search engine for Qcop objects. */ class QECODE_VTABLE_EXPORT QCOP_solver { private: int n; Qcop* sp; int* nbRanges; Strategy rSolve(Qcop* qs,int scope,vector assignments,unsigned long int& nodes); public: /** Public constructor. @param sp The problem to solve */ QECODE_EXPORT QCOP_solver(Qcop* sp); /** Solves the problem and returns a corresponding winning strategy. @param nodes A reference that is increased by the number of nodes encountered in the search tree. */ QECODE_EXPORT Strategy solve(unsigned long int& nodes); }; #endif gecode-4.2.1/contribs/qecode/qsolver_qcsp.cc0000644000175000010010000001237212234137156020205 0ustar schulteNone/**** , [ QCSP_Solver.cc ], Copyright (c) 2008 Universite d'Orleans - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #include "qsolver_qcsp.hh" #include inline vector getTheValues(MySpace* sol,int vmin,int vmax){ vector zevalues; // cout< (sol->nbVars())) cout<<"getTheValues mal appele"<type_of_v[i]) { case VTYPE_INT : zevalues.push_back( (static_cast(sol->v[i]))->val() ); break; case VTYPE_BOOL : zevalues.push_back( (static_cast(sol->v[i]))->val() ); break; default : cout<<"4Unknown variable type"<sp = sp; nbRanges=new int; } Strategy QCSP_Solver::solve(unsigned long int& nodes, unsigned int limit) { this->limit=limit; MySpace* espace=sp->getSpace(0); Options o; Engine* solutions = new WorkerToEngine(espace,/*sizeof(MySpace),*/o); return rSolve(sp,0,solutions,nodes); } Strategy QCSP_Solver::rSolve(Qcop* qs,int scope,Engine* L, unsigned long int& nodes) { nodes++; MySpace* sol = static_cast(L->next()); Strategy ret=Strategy::Dummy(); bool LwasEmpty = true; while ((sol != NULL) ) { LwasEmpty=false; vector assignments = getTheValues(sol,0,sol->nbVars()-1); Strategy result; if (scope == (qs->spaces() - 1) ) { // last scope reached. Verify the goal... MySpace* g = qs->getGoal(); for (int i=0;inbVars();i++) { switch (g->type_of_v[i]) { case VTYPE_INT : rel(*g,*(static_cast(g->v[i])) == assignments[i]); break; case VTYPE_BOOL : rel(*g,*(static_cast(g->v[i])) == assignments[i]); break; default : cout<<"Unknown variable type"< solutions(g); MySpace* goalsol = solutions.next(); if (goalsol == NULL) { delete g; result = Strategy::SFalse(); } else { int vmin = ( (scope==0)? 0 : (qs->nbVarInScope(scope-1)) ); int vmax = (qs->nbVarInScope(scope))-1; vector zevalues=getTheValues(sol,vmin,vmax); result=Strategy(qs->quantification(scope),vmin,vmax,scope,zevalues); result.attach(Strategy::STrue()); delete g; // delete sol; delete goalsol; } } else { // This is not the last scope... MySpace* espace = qs->getSpace(scope+1); for (int i=0;itype_of_v[i]) { case VTYPE_INT : rel(*espace,*(static_cast(espace->v[i])) == assignments[i]); break; case VTYPE_BOOL : rel(*espace,*(static_cast(espace->v[i])) == assignments[i]); break; default : cout<<"Unknown variable type"<(espace,/*sizeof(MySpace),*/o); delete espace; result=rSolve(qs,scope+1,solutions,nodes); } int vmin = ( (scope == 0) ? 0 : (qs->nbVarInScope(scope-1)) ); int vmax = (qs->nbVarInScope(scope))-1; vector zevalues=getTheValues(sol,vmin,vmax); delete sol; if (qs->quantification(scope)) { // current scope is universal if (result.isFalse()) // one branch fails { delete L; return Strategy::SFalse(); } else { Strategy toAttach(true,vmin,vmax,scope,zevalues); toAttach.attach(result); ret.attach(toAttach); } } else { //current scope is existential if (!result.isFalse()) { // result not the truivilally false strategy... delete L; if (scope >= limit) return Strategy::STrue(); ret = Strategy(qs->quantification(scope),vmin,vmax,scope,zevalues); ret.attach(result); return ret; // we return it immediately } } sol = static_cast(L->next()); } delete L; if (scope>limit) ret = Strategy::STrue(); if (qs->quantification(scope)) //universal scope return (LwasEmpty ? Strategy::STrue() : ret); else return Strategy::SFalse(); } gecode-4.2.1/contribs/qecode/qsolver_qcsp.hh0000644000175000010010000000450012070355242020205 0ustar schulteNone/**** , [ qsolver.hh ], Copyright (c) 2010 Universite de Caen-Basse Normandie - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #ifndef __QECODE_QSOLVER_QCSP__ #define __QECODE_QSOLVER_QCSP__ #include "QCOPPlus.hh" #include #include #include "gecode/minimodel.hh" #include "gecode/search.hh" #include "gecode/search/support.hh" #include "gecode/search/sequential/dfs.hh" #include #include "Strategy.hh" #include "qecode.hh" using namespace std; using namespace Gecode::Support; using namespace Gecode::Search; using namespace Gecode::Search::Sequential; /** General QCSP+ / QCOP+ Solver. * This class is the search engine for Qcop objects. */ class QECODE_VTABLE_EXPORT QCSP_Solver { private: unsigned int limit; int n; Qcop* sp; int* nbRanges; Strategy rSolve(Qcop* qs,int scope,Engine* L,unsigned long int& nodes); public: /** Public constructor. @param sp The problem to solve */ QECODE_EXPORT QCSP_Solver(Qcop* sp); /** Solves the problem and returns a corresponding winning strategy. @param nodes A reference that is increased by the number of nodes encountered in the search tree. */ QECODE_EXPORT Strategy solve(unsigned long int& nodes,unsigned int limit=INT_MAX); }; #endif gecode-4.2.1/contribs/qecode/qsolver_unblockable.cc0000755000175000010010000004255511422534155021527 0ustar schulteNone/**** , [ QSolverUnblockable.cc ], Copyright (c) 2008 Universite d'Orleans - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #include "qsolver_unblockable.hh" #include QSolverUnblockable::QSolverUnblockable(QcspUnblockable* sp) { this->sp = sp; nbRanges=new int; } Strategy QSolverUnblockable::solve(unsigned long int& nodes) { vector plop; plop.clear(); return rSolve(sp,0,plop,nodes); } Strategy QSolverUnblockable::rSolve(QcspUnblockable* qs,int scope, vector assignments, unsigned long int& nodes) { nodes++; //cout<<"rSolve for scope "<getGoal(); if (g == NULL) {return Strategy(StrategyNode::SFalse());} for (int i=0;itype_of_v[i]) { case VTYPE_INT : rel(*g,*(static_cast(g->v[i])) == assignments[i]); break; case VTYPE_BOOL : rel(*g,*(static_cast(g->v[i])) == assignments[i]); break; default : cout<<"1Unknown variable type"<status() == SS_FAILED) { delete g; return Strategy(StrategyNode::SFalse()); } delete g; if (scope == qs->spaces()) { return Strategy(StrategyNode::STrue()); } ///////////////////////////////////////////////////////////////////////////////////////// // Second case : we are in the middle of the problem... // ///////////////////////////////////////////////////////////////////////////////////////// else { MySpace* espace = qs->getSpace(scope); if (espace == NULL) cout<<"I caught a NULL for scope "<type_of_v[i]) { case VTYPE_INT : rel(*espace,*(static_cast(espace->v[i])) == assignments[i]); break; case VTYPE_BOOL : rel(*espace,*(static_cast(espace->v[i])) == assignments[i]); break; default : cout<<"2Unknown variable type"<quantification(scope)) { if (espace->status() == SS_FAILED) { delete espace; return Strategy(StrategyNode::STrue()); } DFS solutions(espace); MySpace* sol = solutions.next(); if (sol == NULL) { delete espace; return Strategy(StrategyNode::STrue()); } Strategy retour = StrategyNode::Dummy(); while (sol != NULL) { vector assign; for (int i = 0; inbVarInScope(scope);i++) { switch (sol->type_of_v[i]) { case VTYPE_INT : assign.push_back( (static_cast(sol->v[i]))->val() ); break; case VTYPE_BOOL : assign.push_back( (static_cast(sol->v[i]))->val() ); break; default : cout<<"3Unknown variable type"<nbVarInScope(scope-1)) ); int vmax = (qs->nbVarInScope(scope))-1; vector zevalues; for (int i = vmin; i<=vmax;i++) { switch (sol->type_of_v[i]) { case VTYPE_INT : zevalues.push_back( (static_cast(sol->v[i]))->val() ); break; case VTYPE_BOOL : zevalues.push_back( (static_cast(sol->v[i]))->val() ); break; default : cout<<"4Unknown variable type"<status()) == SS_FAILED) { delete espace; return Strategy(StrategyNode::SFalse()); } DFS solutions(espace); MySpace* sol =solutions.next(); if (sol == NULL) { delete espace; return Strategy(StrategyNode::SFalse()); } while (sol != NULL) { vector assign; for (int i = 0; inbVarInScope(scope);i++) { // cout << "i = "<type_of_v[i]) { case VTYPE_INT : assign.push_back( (static_cast(sol->v[i]))->val() ); break; case VTYPE_BOOL : assign.push_back( (static_cast(sol->v[i]))->val() ); break; default : cout<<"5Unknown variable type"<nbVarInScope(scope-1) ); int vmax = qs->nbVarInScope(scope)-1; vector zevalues; for (int i = vmin; i<=vmax;i++) { switch (sol->type_of_v[i]) { case VTYPE_INT : zevalues.push_back( (static_cast(sol->v[i]))->val() ); break; case VTYPE_BOOL : zevalues.push_back( (static_cast(sol->v[i]))->val() ); break; default : cout<<"6unknown Variable type"<sp = sp; nbRanges=new int; } Strategy QSolverUnblockable2::solve(unsigned long int& nodes) { vector plop; plop.clear(); return rSolve(sp,0,plop,nodes); } Strategy QSolverUnblockable2::rSolve(Qcop* qs,int scope, vector assignments, unsigned long int& nodes) { nodes++; //cout<<"rSolve for scope "<getGoal(); if (g == NULL) {return Strategy(StrategyNode::SFalse());} for (int i=0;itype_of_v[i]) { case VTYPE_INT : rel(*g,*(static_cast(g->v[i])) == assignments[i]); break; case VTYPE_BOOL : rel(*g,*(static_cast(g->v[i])) == assignments[i]); break; default : cout<<"1Unknown variable type"<status() == SS_FAILED) { delete g; return Strategy(StrategyNode::SFalse()); } delete g; if (scope == qs->spaces()) { return Strategy(StrategyNode::STrue()); } ///////////////////////////////////////////////////////////////////////////////////////// // Second case : we are in the middle of the problem... // ///////////////////////////////////////////////////////////////////////////////////////// else { MySpace* espace = qs->getSpace(scope); if (espace == NULL) cout<<"I caught a NULL for scope "<type_of_v[i]) { case VTYPE_INT : rel(*espace,*(static_cast(espace->v[i])) == assignments[i]); break; case VTYPE_BOOL : rel(*espace,*(static_cast(espace->v[i])) == assignments[i]); break; default : cout<<"2Unknown variable type"<quantification(scope)) { if (espace->status() == SS_FAILED) { delete espace; return Strategy(StrategyNode::STrue()); } DFS solutions(espace); MySpace* sol = solutions.next(); if (sol == NULL) { delete espace; return Strategy(StrategyNode::STrue()); } Strategy retour = StrategyNode::Dummy(); while (sol != NULL) { vector assign; for (int i = 0; inbVarInScope(scope);i++) { switch (sol->type_of_v[i]) { case VTYPE_INT : assign.push_back( (static_cast(sol->v[i]))->val() ); break; case VTYPE_BOOL : assign.push_back( (static_cast(sol->v[i]))->val() ); break; default : cout<<"3Unknown variable type"<nbVarInScope(scope-1)) ); int vmax = (qs->nbVarInScope(scope))-1; vector zevalues; for (int i = vmin; i<=vmax;i++) { switch (sol->type_of_v[i]) { case VTYPE_INT : zevalues.push_back( (static_cast(sol->v[i]))->val() ); break; case VTYPE_BOOL : zevalues.push_back( (static_cast(sol->v[i]))->val() ); break; default : cout<<"4Unknown variable type"<status()) == SS_FAILED) { delete espace; return Strategy(StrategyNode::SFalse()); } DFS solutions(espace); MySpace* sol =solutions.next(); if (sol == NULL) { delete espace; return Strategy(StrategyNode::SFalse()); } while (sol != NULL) { vector assign; for (int i = 0; inbVarInScope(scope);i++) { // cout << "i = "<type_of_v[i]) { case VTYPE_INT : assign.push_back( (static_cast(sol->v[i]))->val() ); break; case VTYPE_BOOL : assign.push_back( (static_cast(sol->v[i]))->val() ); break; default : cout<<"5Unknown variable type"<nbVarInScope(scope-1) ); int vmax = qs->nbVarInScope(scope)-1; vector zevalues; for (int i = vmin; i<=vmax;i++) { switch (sol->type_of_v[i]) { case VTYPE_INT : zevalues.push_back( (static_cast(sol->v[i]))->val() ); break; case VTYPE_BOOL : zevalues.push_back( (static_cast(sol->v[i]))->val() ); break; default : cout<<"6unknown Variable type"< #include #include "gecode/minimodel.hh" #include "gecode/search.hh" #include "Strategy.hh" #include "qecode.hh" using namespace Gecode; /** Unblockable QCSP+ Solver. * This class is the search engine for unblockable QCSP+ defined with the qpecial QcspUnblockable class. */ class QECODE_VTABLE_EXPORT QSolverUnblockable { private: int n; QcspUnblockable* sp; int* nbRanges; Strategy rSolve(QcspUnblockable* qs,int scope,vector assignments,unsigned long int& nodes); public: /** Public constructor. @param sp The problem to solve */ QECODE_EXPORT QSolverUnblockable(QcspUnblockable* sp); /** Solves the problem and returns a corresponding winning strategy. @param nodes A reference that is increased by the number of nodes encountered in the search tree. */ QECODE_EXPORT Strategy solve(unsigned long int& nodes); }; /** Unblockable QCSP+ Solver. * This class is the search engine for unblockable QCSP+ defined with the general Qcop class. */ class QECODE_VTABLE_EXPORT QSolverUnblockable2 { private: int n; Qcop* sp; int* nbRanges; Strategy rSolve(Qcop* qs,int scope,vector assignments,unsigned long int& nodes); public: /** Public constructor. @param sp The problem to solve */ QECODE_EXPORT QSolverUnblockable2(Qcop* sp); /** Solves the problem and returns a corresponding winning strategy. WARNING : Defined optimization conditions and aggregates are NOT taken into account. @param nodes A reference that is increased by the number of nodes encountered in the search tree. */ QECODE_EXPORT Strategy solve(unsigned long int& nodes); }; #endif gecode-4.2.1/contribs/qecode/README0000644000175000010010000000071211203501645016021 0ustar schulteNoneQeCode is a quantified constraint satisfaction problems (QCSP) solver based on Gecode. It can also solve QCSP+, an extension of QCSP where quantifiers can be restricted and QCOP+, a quantified optimizaion problem formalism which scopes multi-level programming problems. QeCode have been developped at Universite d'Orleans by Jeremie Vautard, Arnaud Lallouet and Marco Benedetti. More info is available on http://www.univ-orleans.fr/lifo/software/qecode/ gecode-4.2.1/contribs/qecode/shortdesc.ac0000644000175000010010000000004711023525701017444 0ustar schulteNoneQecode - A quantified constraint solvergecode-4.2.1/contribs/qecode/Strategy.cc0000644000175000010010000001410611422534155017261 0ustar schulteNone/**** , [ bobocheTree.cc ], Copyright (c) 2008 Universite d'Orleans - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #include "Strategy.hh" StrategyImp::StrategyImp() { cout<<"Default constructor of StrategyImp should not be called !"<todosUpdate(i); } StrategyImp::StrategyImp(StrategyNode tag) { // cout<<"Strategy imp constructor"<::iterator i = nodes.begin();i != nodes.end();i++) { if (((*i).imp->father) == this) { (*i).imp->father = NULL; } } } Strategy::Strategy() { // cout<<"strategy default"<imp = imp; this->imp->pointers++; } Strategy::Strategy(bool qt,int VMin, int VMax, int scope, vector values) { // cout<<"strategy with values"<pointers)++; } Strategy& Strategy::operator = (const Strategy& rvalue) { // cout<<"Strategy = "<pointers)--; if ( (imp->pointers) == 0) { // cout<<"no more references for the imp. Delete"<pointers)++; return *this; } Strategy::~Strategy() { // cout<<"strategy destructor"<pointers)--; if ( (imp->pointers) == 0) { // cout<<"no more references for the imp. Delete"<zetag; } Strategy Strategy::getFather() { if (hasFather()) return Strategy(imp->father); return Dummy(); } bool Strategy::hasFather() { if (imp->father != NULL) { for (int i=0;i< imp->father->nodes.size();i++) { if ((imp->father->nodes[i].imp) == imp) return true; } } return false; } Strategy Strategy::getChild(int i) { if (i<0 || i>=degree() ) {cout<<"Child "<nodes[i]; } Strategy Strategy::getSubStrategy(vector position) { if (position.empty()) return *this; int deg = degree(); if (deg == 0) { cout<<"Did not find substrategy"<attach(child.getChild(i)); } } else { imp->nodes.push_back(child); todosUpdate(child.imp->todos); (child.imp)->father = this->imp; } } void Strategy::detach(Strategy son) { vector::iterator it = imp->nodes.begin(); while (it != (imp->nodes.end()) && ( (*it).id() != son.id())) { it++;} if ( it != imp->nodes.end()) { todosUpdate(0-((*it).imp->todos)); (*it).imp->father=NULL; imp->nodes.erase(it); } } void Strategy::detach(unsigned int i) { if (imp->nodes.size() < i) return; vector::iterator it = imp->nodes.begin()+i; todosUpdate(0-((*it).imp->todos)); (*it).imp->father=NULL; imp->nodes.erase(it); } Strategy Strategy::STrue() { Strategy ret(StrategyNode::STrue()); return ret; } Strategy Strategy::SFalse() { Strategy ret(StrategyNode::SFalse()); return ret; } Strategy Strategy::Dummy() { Strategy ret(StrategyNode::Dummy()); return ret; } Strategy Strategy::Stodo() { Strategy ret(StrategyNode::Todo()); ret.imp->todos=1; return ret; } vector Strategy::getPosition() { vector ret; Strategy asc = *this; while (!asc.isDummy()) { // cout<<"GetPosition adding "< ret2; ret2.reserve(ret.size() + asc.values().size() +1); for (int i=0;idegree());i++) { if ( (((imp->nodes[i]).imp)->father) != imp) { ret++; cout<< (((imp->nodes[i]).imp)->father) << " should be " << imp < #include #include #include "StrategyNode.hh" #include "qecode.hh" using namespace std; class Strategy; class StrategyImp { friend class Strategy; private: unsigned int pointers; // number of Strategy objects pointing to this StrategyNode zetag; // Node information vector nodes; // children of this node unsigned int todos; // number of todo nodes recursively present in the children StrategyImp* father; void todosUpdate(int i); StrategyImp(); public: StrategyImp(StrategyNode tag); ~StrategyImp(); }; /** \brief Strategy of a QCSP+ problem * * This class represents a solution of a QCSP+. Basically it consists in the tree-representation of the winning strategy. * 3 spacial cases exists : the trivially true strategy, the trivially false strategy (used for the UNSAT answer), * and the "Dummy" node, used to link together each tree of a strategy which first player is universal (such a strategy is not a tree but a forest) */ class QECODE_VTABLE_EXPORT Strategy { friend class StrategyImp; private: StrategyImp* imp; void todosUpdate(int i) {imp->todosUpdate(i);} Strategy(StrategyImp* imp); public: QECODE_EXPORT Strategy(); ///< default constructor QECODE_EXPORT Strategy(StrategyNode tag); ///< builds a strategy on a given strategy node (deprecated) /* \brief builds a one node (sub)strategy * * this method builds a one-node strategy that will typically be attached as child of another strategy. A strategy node embeds informations about quantification, * scope and values of variables that must be provided * @param qt quantifier of the scope this node represents * @param VMin index of the first variable of the scope this node represents * @param VMax index of the last variable of the scope this node represents * @param values values taken by the variables between VMin and VMax in this part of the strategy */ QECODE_EXPORT Strategy(bool qt,int VMin, int VMax, int scope,vector values); QECODE_EXPORT Strategy(const Strategy& tree); ///< copy constructor QECODE_EXPORT Strategy& operator = (const Strategy& rvalue); QECODE_EXPORT ~Strategy(); QECODE_EXPORT StrategyNode getTag();///< DEPRECATED returns the StrategyNode object corresponding to the root of this strategy QECODE_EXPORT forceinline unsigned int degree() {return imp->nodes.size();}///< returns this strategy's number of children QECODE_EXPORT Strategy getChild(int i); ///< returns the i-th child of this strategy QECODE_EXPORT Strategy getFather(); QECODE_EXPORT bool hasFather(); QECODE_EXPORT Strategy getSubStrategy(vector position); ///< returns the substrategy at given position, dummy if does not exists QECODE_EXPORT void attach(Strategy child);///< attach the strategy given in parameter as a child of the current strategy QECODE_EXPORT void detach(unsigned int i); ///< detach the i-th child of this strategy (provided it exists) QECODE_EXPORT void detach(Strategy son); QECODE_EXPORT forceinline bool isFalse() {return imp->zetag.isFalse();} ///< returns wether this strategy represents the UNSAT answer QECODE_EXPORT forceinline bool isTrue() {return imp->zetag.isTrue();} ///< returns wether this strategy is trivially true QECODE_EXPORT forceinline bool isComplete() {return ((imp->todos) == 0);} ///< returns wether this is a complete sub-strategy (without todo nodes) QECODE_EXPORT forceinline bool isDummy() {return imp->zetag.isDummy();} ///< returns wether this strategy is a set of QECODE_EXPORT forceinline bool isTodo() {return imp->zetag.isTodo();} ///< return wether this strategy is a "ToDo" marker or not QECODE_EXPORT static Strategy STrue(); ///< returns the trivially true strategy QECODE_EXPORT static Strategy SFalse(); ///< returns the trivially false strategy QECODE_EXPORT static Strategy Dummy(); ///< returns a "dummy" node QECODE_EXPORT static Strategy Stodo(); ///< returns a "todo" node QECODE_EXPORT forceinline bool quantifier() {return imp->zetag.quantifier;} ///< returns the quantifier of the root (true for universal, false for existential) QECODE_EXPORT forceinline int VMin() {return imp->zetag.Vmin;} ///< returns the index of the first variable of the scope of the root QECODE_EXPORT forceinline int VMax() {return imp->zetag.Vmax;} ///< returns the index of the last variable of the scope of the root QECODE_EXPORT forceinline int scope() {return imp->zetag.scope;} ///< returns the scope of the root QECODE_EXPORT forceinline vector values() {return imp->zetag.valeurs;} ///< returns the values taken by the variables of the scope of the root in this (sub)strategy QECODE_EXPORT forceinline int value(int var) {return imp->zetag.valeurs[var];} QECODE_EXPORT forceinline void* id() {return imp;} ///< Return an identifier for this strategy (this identifier is shared among multiples instances of this strategy) QECODE_EXPORT vector getPosition(); QECODE_EXPORT forceinline int nbTodos() {return imp->todos;} QECODE_EXPORT int checkIntegrity(); }; #endif gecode-4.2.1/contribs/qecode/StrategyNode.cc0000644000175000010010000000347011422534155020071 0ustar schulteNone/**** , [ StrategyNode.cc ], Copyright (c) 2008 Universite d'Orleans - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #include "StrategyNode.hh" StrategyNode::StrategyNode() { type=0; quantifier=true; Vmin=-1; Vmax=-1; scope=-1; } StrategyNode::StrategyNode(int typ,bool qt,int min, int max, int sco) { type=typ; quantifier=qt; Vmin=min; Vmax=max; scope=sco; } /* StrategyNode::StrategyNode(const StrategyNode& st) { cout<<"Strategynode copy constructor"< using namespace std; class QECODE_VTABLE_EXPORT StrategyNode { public: int type; // 0 = dummy, 1 = empty, 2 = normal, 3 = Todo. bool quantifier; int Vmin; int Vmax; int scope; vector valeurs; QECODE_EXPORT StrategyNode(); QECODE_EXPORT StrategyNode(int type,bool qt,int Vmin, int Vmax, int scope); QECODE_EXPORT ~StrategyNode(); QECODE_EXPORT static StrategyNode STrue() { return StrategyNode(1,true,-1,-1,-1);} QECODE_EXPORT static StrategyNode SFalse() { return StrategyNode(1,false,-1,-1,-1);} QECODE_EXPORT static StrategyNode Dummy() { return StrategyNode(0,true,-1,-1,-1);} QECODE_EXPORT static StrategyNode Todo() { return StrategyNode(3,false,-1,-1,-1);} QECODE_EXPORT forceinline bool isFalse() { return ( (type==1) && (quantifier == false) );} QECODE_EXPORT forceinline bool isTrue() { return ( (type==1) && (quantifier == true) );} QECODE_EXPORT forceinline bool isDummy() { return (type==0);} QECODE_EXPORT forceinline bool isTodo() { return (type==3);} }; #endif gecode-4.2.1/contribs/qecode/UnblockableBranching.hh0000755000175000010010000000267411177677044021554 0ustar schulteNone/**** , [ UnblockableBranching.hh ], Copyright (c) 2009 Universite d'Orleans - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #ifndef __QECODE_UNBLOCKABLE_BRANCHING__ #define __QECODE_UNBLOCKABLE_BRANCHING__ #include "myspace.hh" class UnblockableBranching { public: virtual ~UnblockableBranching() {} virtual void branch(MySpace* s,IntVarArgs ivars, BoolVarArgs bvars)=0; }; #endif gecode-4.2.1/contribs/qecode/UnblockableViewValBranching.cc0000755000175000010010000000427411177677044023036 0ustar schulteNone/**** , [ UnblockableViewValBranching.cc ], Copyright (c) 2009 Universite d'Orleans - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #include "UnblockableViewValBranching.hh" #include using namespace std; UnblockableViewValBranching::UnblockableViewValBranching(IntVarBranch vrb,IntValBranch vlb,bool booleans_before) { ivrb=vrb; bvrb=vrb; ivlb=vlb; bvlb=vlb; before=booleans_before; } UnblockableViewValBranching::UnblockableViewValBranching(IntVarBranch Ivrb,IntValBranch Ivlb,IntVarBranch Bvrb,IntValBranch Bvlb,bool booleans_before) { ivrb=Ivrb; ivlb=Ivlb; bvrb=Bvrb; bvlb=Bvlb; before=booleans_before; } void UnblockableViewValBranching::branch(MySpace* s,IntVarArgs ivars, BoolVarArgs bvars) { if (before) { if (bvars.size() != 0) { Gecode::branch(*s,bvars,bvrb,bvlb); } if (ivars.size() != 0) { Gecode::branch(*s,ivars,ivrb,ivlb); } } else { if (ivars.size() != 0) { Gecode::branch(*s,ivars,ivrb,ivlb); } if (bvars.size() != 0) { Gecode::branch(*s,bvars,bvrb,bvlb); } } } gecode-4.2.1/contribs/qecode/UnblockableViewValBranching.hh0000755000175000010010000000365111177677044023046 0ustar schulteNone/**** , [ UnblockableViewValBranching.hh ], Copyright (c) 2009 Universite d'Orleans - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #ifndef __QECODE_UNBLOK_VIEWVAL_BRANCH__ #define __QECODE_UNBLOK_VIEWVAL_BRANCH__ #include "qecode.hh" #include "gecode/minimodel.hh" #include "qecode.hh" #include "UnblockableBranching.hh" class QECODE_VTABLE_EXPORT UnblockableViewValBranching : public UnblockableBranching { private : IntVarBranch ivrb; IntVarBranch bvrb; IntValBranch ivlb; IntValBranch bvlb; bool before; public : QECODE_EXPORT UnblockableViewValBranching(IntVarBranch vrb,IntValBranch vlb,bool booleans_before); QECODE_EXPORT UnblockableViewValBranching(IntVarBranch Ivrb,IntValBranch Ivlb,IntVarBranch Bvrb,IntValBranch Bvlb,bool booleans_before); QECODE_EXPORT virtual void branch(MySpace* s,IntVarArgs ivars, BoolVarArgs bvars); }; #endif gecode-4.2.1/contribs/qecode/vartype.hh0000644000175000010010000000242111177677044017174 0ustar schulteNone/**** qecode2, [ vartype.hh ], Copyright (c) 2007 Universite d'Orleans - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #ifndef QECODE_VARTYPE #define QECODE_VARTYPE enum VarType { VTYPE_INT, VTYPE_BOOL }; #endif gecode-4.2.1/contribs/qecode/Work.cc0000644000175000010010000000323011422534155016375 0ustar schulteNone/************************************************************ Work.cc Copyright (c) 2010 Universite de Caen Basse Normandie - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #include "Work.hh" QWork::QWork(int scope,vector root,Gecode::Search::Engine* todo){ this->theRoot = root; this->remaining = todo; this->scope = scope; this->wait = this->stop = false; } QWork::~QWork() {} QWork QWork::Wait() { QWork ret; ret.wait=true; ret.stop=false; ret.remaining=NULL; return ret; } QWork QWork::Stop() { QWork ret; ret.wait=false; ret.stop=true; ret.remaining=NULL; return ret; } gecode-4.2.1/contribs/qecode/Work.hh0000644000175000010010000000465411422534155016422 0ustar schulteNone/************************************************************ Work.hh Copyright (c) 2010 Universite de Caen Basse Normandie - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #ifndef __QECODE_QWORK__ #define __QECODE_QWORK__ #include #include "Strategy.hh" #include "qecode.hh" #include "gecode/support.hh" #include "gecode/search.hh" #include "gecode/search/support.hh" #include "gecode/search/sequential/dfs.hh" using namespace std; using namespace Gecode; using namespace Gecode::Support; class QECODE_VTABLE_EXPORT QWork { private: bool wait; bool stop; vector theRoot; Gecode::Search::Engine* remaining; int scope; public: QECODE_EXPORT QWork(){wait=stop=0; remaining=NULL; scope=-1;} ///< creates a dummy work. Don't try to solve it. QECODE_EXPORT QWork(int scope,vector root,Gecode::Search::Engine* todo); QECODE_EXPORT ~QWork(); QECODE_EXPORT static QWork Wait(); QECODE_EXPORT static QWork Stop(); QECODE_EXPORT forceinline bool isWait() {return wait;} QECODE_EXPORT forceinline bool isStop() {return stop;} QECODE_EXPORT forceinline Gecode::Search::Engine* getRemaining() {return this->remaining;} QECODE_EXPORT vector root() { vector ret=this->theRoot; return ret; } QECODE_EXPORT forceinline int getScope() {return this->scope;} QECODE_EXPORT forceinline void clean() {if (!wait && !stop) delete remaining;} }; #endif gecode-4.2.1/contribs/qecode/WorkComparators.hh0000644000175000010010000000310611422534155020624 0ustar schulteNone/* * WorkComparators.hh * * * Created by Jérémie Vautard on 31/03/10. * Copyright 2010 Université d'Orléans. All rights reserved. * */ #include "WorkManager.hh" #include "QCOPPlus.hh" class BidonComparator : public WorkComparator { public : virtual bool cmp(QWork a,QWork b) { return false; } }; class DeepFirstComparator : public WorkComparator { public : virtual bool cmp(QWork a,QWork b) { if (a.root().size() > b.root().size()) return true; if (a.root().size() < b.root().size()) return false; return ((a.getRemaining()) < (b.getRemaining())); } }; class QuantifierThenDepthComparator : public WorkComparator { private : Qcop* problem; bool existsFirst; bool deepestFirst; public : QuantifierThenDepthComparator(Qcop* p,bool existsFirst,bool deepestFirst) { this->problem = p; this->existsFirst = existsFirst; this->deepestFirst = deepestFirst; } virtual bool cmp(QWork a,QWork b) { bool q1 = (problem->qt_of_var(a.root().size()) != existsFirst); bool q2 = (problem->qt_of_var(b.root().size()) != existsFirst); if (q1 && !q2) return true; if (!q1 && q2) return false; int d1 = a.root().size(); int d2 = b.root().size(); if ( (d1 < d2) != deepestFirst) return true; return false; } }; class DepthComparator : public WorkComparator { private : bool deepestFirst; public : DepthComparator(bool deepestFirst) { this->deepestfirst = deepestFirst; } virtual bool cmp(QWork a,QWork b) { int d1 = a.root().size(); int d2 = b.root().size(); if ( (d1 < d2) != deepestFirst) return true; return false; } }; gecode-4.2.1/contribs/qecode/Worker.cc0000644000175000010010000002065012234137156016733 0ustar schulteNone/**** , [ Worker.cc ], Copyright (c) 2010 Universite de Caen Basse Normandie- Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #include "Worker.hh" inline vector getTheValues(MySpace* sol,int vmin,int vmax){ vector zevalues; // cout< (sol->nbVars())) cout<<"getTheValues mal appele"<type_of_v[i]) { case VTYPE_INT : zevalues.push_back( (static_cast(sol->v[i]))->val() ); break; case VTYPE_BOOL : zevalues.push_back( (static_cast(sol->v[i]))->val() ); break; default : cout<<"4Unknown variable type"< 0); } void QWorker::wake() { // cout<<"Awaking "< QWorker::workPosition() { // access.acquire(); // vector ret = currentWork.root(); // access.release(); return currentWork.root(); } void QWorker::run() { while(true) { access.acquire(); stopandforget=0; finished=false; todo.clear(); access.release(); // cout<<"QWorker "<getWork(this); // cout<<"QWorker "<returnWork(this,ret,todo,cur.root()); } else { // cout<<"QWorker "<::iterator i(todo.begin());i != todo.end();i++) { (*i).clean(); } todo.clear(); } } } } Strategy QWorker::solve() { return rsolve(currentWork.getScope(),currentWork.getRemaining()); } Strategy QWorker::rsolve(int scope,/*vector assignments,*/Engine* L) { access.acquire(); bool forget = (stopandforget==2); access.release(); if (forget) { delete L; return Strategy::Dummy(); } MySpace* sol = static_cast(L->next()); Strategy ret=Strategy::Dummy(); bool LwasEmpty = true; while ((sol != NULL) ) { LwasEmpty=false; vector assignments = getTheValues(sol,0,sol->nbVars()-1); Strategy result; if (scope == (problem->spaces() - 1) ) { // last scope reached. Verify the goal... MySpace* g = problem->getGoal(); for (int i=0;inbVars();i++) { switch (g->type_of_v[i]) { case VTYPE_INT : rel(*g,*(static_cast(g->v[i])) == assignments[i]); break; case VTYPE_BOOL : rel(*g,*(static_cast(g->v[i])) == assignments[i]); break; default : cout<<"Unknown variable type"< solutions(g); MySpace* goalsol = solutions.next(); if (goalsol == NULL) { delete g; delete L; result = Strategy::SFalse(); } else { int vmin = ( (scope==0)? 0 : (problem->nbVarInScope(scope-1)) ); int vmax = (problem->nbVarInScope(scope))-1; vector zevalues=getTheValues(sol,vmin,vmax); result=Strategy(problem->quantification(scope),vmin,vmax,scope,zevalues); result.attach(Strategy::STrue()); delete g; // delete sol; delete goalsol; } } else { // This is not the last scope... MySpace* espace = problem->getSpace(scope+1); for (int i=0;itype_of_v[i]) { case VTYPE_INT : rel(*espace,*(static_cast(espace->v[i])) == assignments[i]); break; case VTYPE_BOOL : rel(*espace,*(static_cast(espace->v[i])) == assignments[i]); break; default : cout<<"Unknown variable type"<(espace,/*sizeof(MySpace),*/o); delete espace; access.acquire(); forget=(stopandforget == 2); bool stop=(stopandforget==1); access.release(); if (forget) { delete sol; delete solutions; return Strategy::Dummy(); } if (stop) { vector root1; if (scope!=0) {root1= getTheValues(sol,0,problem->nbVarInScope(scope-1)-1);} QWork current(scope,root1,L); vector root2 = getTheValues(sol,0,problem->nbVarInScope(scope)-1); QWork onemore(scope+1,root2,solutions); todo.push_back(current); todo.push_back(onemore); int vmin = ( (scope==0)? 0 : (problem->nbVarInScope(scope-1)) ); int vmax = (problem->nbVarInScope(scope))-1; vector zevalues=getTheValues(sol,vmin,vmax); Strategy toAttach(problem->quantification(scope),vmin,vmax,scope,zevalues); toAttach.attach(Strategy::Stodo()); ret.attach(toAttach); ret.attach(Strategy::Stodo()); return ret; } result=rsolve(scope+1,solutions); } int vmin = ( (scope == 0) ? 0 : (problem->nbVarInScope(scope-1)) ); int vmax = (problem->nbVarInScope(scope))-1; vector zevalues=getTheValues(sol,vmin,vmax); delete sol; access.acquire(); forget=(stopandforget == 2); access.release(); if (forget) { delete L; return Strategy::Dummy(); } if (problem->quantification(scope)) { // current scope is universal if (result.isFalse()) // one branch fails { delete L; return Strategy::SFalse(); } else { Strategy toAttach(true,vmin,vmax,scope,zevalues); toAttach.attach(result); ret.attach(toAttach); } } else { //current scope is existential if (!result.isFalse()) { // result not the truivilally false strategy... if (result.isComplete()) { // ...and has no todo nodes. So... ret = Strategy(problem->quantification(scope),vmin,vmax,scope,zevalues); ret.attach(result); delete L; return ret; // we return it immediately } else { // If result is not false, but still has todo nodes... Strategy toAttach(problem->quantification(scope),vmin,vmax,scope,zevalues); toAttach.attach(result); // the node corresponding to the current scope iis added... ret.attach(toAttach); // and the corresponding strategy is attached to a Dummy node. Next loop in the outer while will need it... } } } sol = static_cast(L->next()); } delete L; if (problem->quantification(scope)) //universal scope return (LwasEmpty ? Strategy::STrue() : ret); else { if (ret.isComplete()) return Strategy::SFalse(); else return ret; } } gecode-4.2.1/contribs/qecode/Worker.hh0000755000175000010010000000466311422534155016754 0ustar schulteNone/**** , [ Worker.hh ], Copyright (c) 2010 Universite de Caen Basse Normandie - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #ifndef __QECODE_WORKER__ #define __QECODE_WORKER__ #include "qecode.hh" #include #include #include #include "QCOPPlus.hh" #include "myspace.hh" #include "Strategy.hh" #include "AbstractWorker.hh" #include "gecode/support.hh" #include "gecode/search.hh" #include "gecode/search/support.hh" #include "gecode/search/sequential/dfs.hh" #include "WorkManager.hh" using namespace Gecode::Support; using namespace Gecode::Search; using namespace Gecode::Search::Sequential; class QECODE_VTABLE_EXPORT QWorker : public AQWorker { private: WorkManager* wm; Gecode::Support::Event goToWork; Gecode::Support::Mutex access; int stopandforget; // 0 : continue, 1 : stop and return, 2 : stop and forget. Qcop* problem; QWork currentWork; list todo; bool finished; Strategy rsolve(int scope,/*vector assignments,*/Engine* L); public: QECODE_EXPORT QWorker(WorkManager* wm) {this->wm=wm; this->problem = wm->problem->clone();} QECODE_EXPORT ~QWorker(); QECODE_EXPORT virtual void run(); QECODE_EXPORT void stopAndReturn(); QECODE_EXPORT void stopAndForget(); QECODE_EXPORT vector workPosition(); QECODE_EXPORT bool mustStop(); QECODE_EXPORT void wake(); QECODE_EXPORT Strategy solve(); }; #endif gecode-4.2.1/contribs/qecode/WorkManager.cc0000644000175000010010000002551712234137156017706 0ustar schulteNone/************************************************************ WorkManager.cc Copyright (c) 2010 Universite d'Orleans - Jeremie Vautard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *************************************************************************/ #include "WorkManager.hh" bool isPrefix(vector prefix,vector a) { if (a.size() < prefix.size()) return false; else for (unsigned int i=0;i::iterator i = l.begin(); while (i != l.end() && cmp->cmp((*i),q)) i++; l.insert(i,q); } QWork WorkPool::pop() { QWork ret=l.front(); l.pop_front(); return ret; } void WorkPool::trash(vector prefix) { // cout<<" WPT called on "; //if (prefix.empty()) cout<<"empty"; //for (int i=0;i< prefix.size();i++) cout<::iterator i=l.begin(); while (!(i == l.end())) { // cout<<"| "; // cout.flush(); bool avance=true; vector root = (*i).root(); if (isPrefix(prefix,root)) { (*i).clean(); i=l.erase(i); avance = false; // cout<<"erased"; } if (avance) i++; } //cout<::iterator i=l.begin();i != l.end();i++) { //vector root = (*i).root(); //if (isPrefix(prefix,root)) { // cout<<" trashing "; // if (root.empty()) cout<<"empty"; // for (int j=0;j< root.size();j++) cout<stopAndReturn(); } WorkManager::WorkManager(Qcop* p,WorkComparator* c) : Todos(c) { problem=p; vector v; MySpace* espace=p->getSpace(0); Options o; Engine* solutions = new WorkerToEngine(espace,/*sizeof(MySpace),*/o); QWork first(0,v,solutions); Todos.push(first); finished=false; S = Strategy::Dummy(); S.attach(Strategy::Stodo()); } QWork WorkManager::getWork(AQWorker* worker) { // clock_t start = clock(); // cout< todo,vector position) { // If the worker is not among the actives ones, ignore his job. Else, withdraw it from the active workers // and process its result // clock_t start = clock(); // cout<::iterator i = actives.begin(); while (!(i == actives.end()) && !ok) { bool avance=true; if ((*i) == worker) { // cout<<"RW Worker found in actives. Deleting"<::iterator j = todo.begin();j != todo.end();j++) { (*j).clean(); } // cout<<"RW release"< checkPosition = father.getPosition(); // if (checkPosition.empty()) cout<<"empty"; // for (int i=0;i< checkPosition.size();i++) cout<::iterator j = todo.begin();j != todo.end();j++) { // cout<<"WM todo + 1"<wake(); } // cout<<"RW Adding work in Todos : "; // if ((*j).root().empty()) cout<<"empty"; // for (int i=0;i< (*j).root().size();i++) cout<<(*j).root()[i]<<" "; // cout<qt_of_var(position.size() + 1); if (myscope) { // if ret was a forall node, the father itself is false // cout<<"RW work is A -> father is false"<::iterator j = todo.begin();j != todo.end();j++) { (*j).clean(); } } // cout<<"RW release"< hihi = s.getPosition(); // if (hihi.empty()) cout<<"empty"; // for (int i=0;i< hihi.size();i++) cout< hihi = s.getPosition(); // if (hihi.empty()) cout<<"empty"; // for (int i=0;i< hihi.size();i++) cout< prefix) { // cout<<" TW called on "; // if (prefix.empty()) cout<<"empty"; // for (int i=0;i< prefix.size();i++) cout<::iterator i=actives.begin();i!=actives.end();i++) { if (isPrefix(prefix,(*i)->workPosition())) { // cout<<" TW stopping worker on"; // vector plop = (*i)->workPosition(); // if (plop.empty()) cout<<"empty"; // for (int j=0;j< plop.size();j++) cout<stopAndForget(); i=actives.erase(i); i--; } } } void WorkManager::printStatus() { mex.acquire(); cout<<(finished?"Problem solved":"Problem not solved")< #include #include #include #include "Strategy.hh" #include "qecode.hh" #include "AbstractWorker.hh" #include "Work.hh" #include "QCOPPlus.hh" #include "gecode/minimodel.hh" #include "gecode/support.hh" #include "gecode/search.hh" #include "gecode/search/support.hh" using namespace Gecode; using namespace std; using namespace Gecode::Support; using namespace Gecode::Search; class QECODE_VTABLE_EXPORT WorkComparator { public : virtual bool cmp(QWork a,QWork b)=0; }; class QECODE_VTABLE_EXPORT WorkPool { private: list l; WorkComparator* cmp; public: QECODE_EXPORT WorkPool(WorkComparator* a); QECODE_EXPORT void push(QWork q); QECODE_EXPORT QWork pop(); QECODE_EXPORT bool empty() {return l.empty();} QECODE_EXPORT QWork top() {return l.front();} QECODE_EXPORT int size() {return l.size();} QECODE_EXPORT void trash(vector prefix); }; class QECODE_VTABLE_EXPORT WorkManager { private: bool finished; Strategy S; WorkPool Todos; list actives; list idles; void getNewWorks(); void updateTrue(Strategy s); void updateFalse(Strategy s); void trashWorks(vector prefix); Strategy result; Gecode::Support::Mutex mex; // = PTHREAD_MUTEX_INITIALIZER; public: Qcop* problem; QECODE_EXPORT WorkManager(Qcop* p,WorkComparator* c); QECODE_EXPORT QWork getWork(AQWorker* worker); QECODE_EXPORT void returnWork(AQWorker* worker,Strategy ret,list todo,vector position); QECODE_EXPORT forceinline Strategy getResult() {return S;} QECODE_EXPORT forceinline bool isFinished() {mex.acquire();bool ret=finished;mex.release();return ret;} QECODE_EXPORT void printStatus(); }; #endif gecode-4.2.1/contribs/README0000644000175000010010000000174710360752741014602 0ustar schulteNone GECODE CONTRIBUTIONS ====================================================================== 1. External contributions This directory contains external contributions to the Gecode system. Please see our web pages for more information about the contributors: http://www.gecode.org/contributions.html 2. Installation The contributions are distributed together with Gecode to ease compilation and installation. They are not enabled by default. Please refer to the installation instructions in the individual subdirectories if you want to use these contributions. 3. License issues The external contributions may be distributed under a license that is different from the Gecode license. Please see the individual LICENSE files in the contributed subdirectories. 4. Bugs Please do not use the Gecode bugtracking system to report bugs in external contributions. If you find bugs in contributed code, please see the contributors' web pages for information on how to contact them. gecode-4.2.1/doxygen/0000755000175000010010000000000012236131711013533 5ustar schulteNonegecode-4.2.1/doxygen/doxygen.conf.in0000644000175000010010000014454311737561572016520 0ustar schulteNone# Doxyfile 1.4.2-20050421 # Main authors: # Christian Schulte # Guido Tack # # Copyright: # Christian Schulte, 2005 # Guido Tack, 2005 # # Last modified: # $Date: 2012-04-06 14:37:14 +0200 (Fri, 06 Apr 2012) $ by $Author: schulte $ # $Revision: 12717 $ # # This file is part of Gecode, the generic constraint # development environment: # http://www.gecode.org # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = Gecode # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = @VERSION@ # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = YES # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = YES # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = YES # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = YES # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = YES # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = NO # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the progam writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = "perl @top_srcdir@/misc/getrevision.perl" #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = NO # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = doxygen.log #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = . @top_srcdir@ # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = *.h \ *.c \ *.hh \ *.cpp \ *.hpp # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = gecode.framework # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = \ *.svn/* \ *moc_* \ *contribs/* \ *gecode/gist/standalone-example/* \ *gecode/third-party/* \ *gecode/flatzinc/exampleplugin/* \ *gecode/flatzinc/parser.tab.* *gecode/flatzinc/lexer.* # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = *.cpp # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 3 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = header.html # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = @top_srcdir@/misc/doxygen/footer.html # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = @top_srcdir@/misc/doxygen/stylesheet.css # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = GecodeReference.chm # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = hhc.exe # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = YES # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = YES # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = YES # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = amsmath # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = "GECODE_SET_EXPORT=" \ "GECODE_INT_EXPORT=" \ "GECODE_FLOAT_EXPORT=" \ "GECODE_KERNEL_EXPORT=" \ "GECODE_SEARCH_EXPORT=" \ "GECODE_MINIMODEL_EXPORT=" \ "GECODE_GRAPH_EXPORT=" \ "GECODE_SCHEDULING_EXPORT=" \ "GECODE_DRIVER_EXPORT=" \ "GECODE_GIST_EXPORT=" \ "GECODE_SUPPORT_EXPORT=" \ "GECODE_MSC_VIRTUAL=" \ "GECODE_HAS_INT_VARS=1" \ "GECODE_HAS_SET_VARS=1" \ "GECODE_HAS_FLOAT_VARS=1" \ "GECODE_THREADS_PTHREADS=1" \ "GECODE_HAS_THREADS=1" \ "GECODE_HAS_MPFR=1" \ "forceinline=inline" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = @GECODE_DOXYGEN_TAGFILE@ # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = NO # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = NO # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = NO # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = NO # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = YES # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = NO # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = NO # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that a graph may be further truncated if the graph's # image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH # and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), # the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO gecode-4.2.1/doxygen/doxygen.hh.in0000644000175000010010000004612012116410731016140 0ustar schulteNone/* * Main authors: * Christian Schulte * Guido Tack * * Copyright: * Christian Schulte, 2005 * Guido Tack, 2005 * * Last modified: * $Date: 2013-03-08 17:29:13 +0100 (Fri, 08 Mar 2013) $ by $Author: schulte $ * $Revision: 13486 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ /* * No code, just contains the group definitions of the * Doxygen-generated documentation */ #define GECODE_DOXYGEN_WORKAROUNDS 1 /** * \defgroup Task Functionality by programming task */ /** * \defgroup TaskModel Programming models * \ingroup Task */ /** * \defgroup TaskModelScript Setting up scripts * * Scripts (or models) are programmed by inheriting from the class * Gecode::Space. For many examples see \ref Example. * * \ingroup TaskModel */ /** * \defgroup TaskModelInt Using integer variables and constraints * \ingroup TaskModel */ /** * \defgroup TaskModelIntVars Integer variables * \ingroup TaskModelInt */ /** * \defgroup TaskModelSearch Search engines * * Defines search engines. All search engines support recomputation. * The behaviour of recomputation * is controlled by a passing a search option object (see the class * Gecode::Search::Options). * * Requires \code #include \endcode * \ingroup TaskModel */ /** * \defgroup TaskGist Gist: the Gecode Interactive Search Tool * \ingroup TaskModel */ /** * \defgroup TaskModelSet Using integer set variables and constraints * \ingroup TaskModel */ /** * \defgroup TaskModelSetVars Set variables * \ingroup TaskModelSet */ /** * \defgroup TaskModelFloat Using float variables and constraints * \ingroup TaskModel */ /** * \defgroup TaskModelFloatVars Float variables * \ingroup TaskModelSet */ /** * \defgroup TaskModelMiniModel Direct modeling support * \ingroup TaskModel */ /** * \defgroup TaskDriver Script commandline driver * \ingroup TaskModel */ /** * \defgroup TaskSearch Programming search engines * \ingroup Task */ /** * \defgroup TaskActor Programming actors * \ingroup Task */ /** * \defgroup TaskActorInt Programming integer actors * \ingroup TaskActor */ /** * \defgroup TaskActorSet Programming set actors * \ingroup TaskActor */ /** * \defgroup TaskActorFloat Programming float actors * \ingroup TaskActor */ /** * \defgroup TaskVar Programming variables * \ingroup Task */ /** * \defgroup TaskVarView Programming views for variables * \ingroup TaskVar */ /** * \defgroup TaskTest Testing * \ingroup Task */ /** * \defgroup Func Common functionality */ /** * \defgroup FuncMem Memory management * \ingroup Func */ /** * \defgroup FuncThrow Gecode exceptions * \ingroup Func */ /** * \defgroup FuncSupport Support algorithms and datastructures * * These are some common datastructures used in the implementation of * %Gecode. Maybe they can be also useful to others. * * In order to use them, one needs to include the appropriate header-file * as described in the class and function documentation. * \ingroup Func */ /** * \defgroup FuncIter Range and value iterators * * Both range and value iterators have a rather simple interface * for controlling iteration (which deviates from what you might be * used to from other iterators). * * The application operator (if \c i is an iterator, it is invoked by \c i() ) * tests whether an iterator has not yet reached * its end (in this case, \c true is returned). The prefix * increment operator (if \c i is an iterator, this is invoked as \c ++i) * moves the iterator to the next element (either next value or next range). * * Value iterators provide access to the value by the member function * \c val(). Range iterators provide access to the smallest, largest, and * width of the current range by \c min(), \c max(), and \c width() * respectively. * * Requires \code #include \endcode * \ingroup Func */ /** * \defgroup FuncIterRanges Range iterators * * A range iterator provides incremental access to a sequence of increasing * ranges. * * Requires \code #include \endcode * \ingroup FuncIter */ /** * \defgroup FuncIterRangesVirt Range iterators with virtual member functions * * A range iterator provides incremental access to a sequence of increasing * ranges. Iterators with virtual member functions have to be used when * they are combined dynamically, and the actual types hence cannot be * specified as template arguments. * * Requires \code #include \endcode * \ingroup FuncIterRanges */ /** * \defgroup FuncIterValues Value iterators * * A value iterator provides incremental access to a sequence of increasing * values. * * Requires \code #include \endcode * \ingroup FuncIter */ /** * \defgroup FuncIterValuesVirt Value iterators with virtual member functions * * A value iterator provides incremental access to a sequence of increasing * values. Iterators with virtual member functions have to be used when * they are combined dynamically, and the actual types hence cannot be * specified as template arguments. * * Requires \code #include \endcode * \ingroup FuncIterValues */ /** * \defgroup Other Other available functionality * */ /** * \defgroup FuncKernelProp Generic propagators * * This module contains a description of all predefined generic * propagators. * \ingroup Other */ /** * \defgroup FuncIntProp Integer propagators * * This module contains a description of all predefined integer * propagators. They can be reused, for example, for rewriting * newly defined integer propagators into already available * propagators. * \ingroup Other */ /** * \defgroup FuncSetProp Set propagators * * This module contains a description of all predefined finite set * propagators. They can be reused, for example, for rewriting * newly defined finite set propagators into already available * propagators. * \ingroup Other */ /** * \defgroup FuncFloatProp Float propagators * * This module contains a description of all predefined float * propagators. They can be reused, for example, for rewriting * newly defined float propagators into already available * propagators. * \ingroup Other */ /** * \defgroup Example Example scripts (models) * * All scripts are compiled into simple standalone programs. All * programs understand the several generic and problem-specific * commandline options. An overview of the options is available * by invoking the standalone programs with the -help * commandline option. * */ /* * Collect some definitions for which no reasonable place exists * */ /** * \namespace Gecode::Support * \brief %Support algorithms and datastructures */ /** * \namespace Gecode::Kernel * \brief %Kernel functionality */ /** * \namespace Gecode::Search * \brief %Search engines */ /** * \mainpage %Gecode Reference Documentation * * This document provides reference information about * %Gecode. * The documentation is structured into three major groups: * getting started, common programming tasks, and * available functionality. * * This document corresponds to %Gecode version @VERSION@, please consult * the changelog for \ref SectionChangeList "recent changes". * * \section SecStart Getting started * * For your fist steps with %Gecode, including detailed instructions on * installing the library and compiling against it, please refer to the * document Modeling and * Programming with Gecode. * * You may also want to have a look at our \ref PageNotation as well as * our \ref Example. * * \section SecByTask Programming tasks * * Documentation is available for the following tasks: * - \ref TaskModel * - \ref TaskSearch * - \ref TaskActor "Programming propagators and branchers" * - \ref TaskVar * - \ref TaskTest * * \section SecByFunc Available functionality * * The most important functionality is: * - \ref FuncMem * - \ref FuncThrow * * The complete functionality can be found \ref Func "here". * * The part \ref Other documents existing propagators, variable * implementations, and so on which serves as documentation of examples. * * \section SecIndex List and index content * * Additionally, the documentation also features the following parts: * - \ref PageLic * - \ref PageChange * * The following lists and indices are available * - \ref PageCodeStat * - List of all modules * - List of all classes including brief documentation * - List of all namespaces including brief documentation * - List of all files * - Class hierarchy * - Alphabetical class index * - Namespace members * - Class members * - File members */ /** * \page PageNotation Notational conventions * * Throughout this reference documentation we use some notational conventions * designed to keep the documentation concise yet understandable. Please * read the following carefully. * * \section NotationArray Array notation * * We allow ourselves to refer to the \f$i\f$-th element of an array \f$x\f$ * by \f$x_i\f$. The size of an array \f$x\f$ (either provided by a member * function \c %size() or clear from context) is denoted \f$|x|\f$. * * \section NotationHome The home space * * Many functions and member functions take an argument \a home of * type \c Space&. The home space serves as manager to many * operations used by variables, views, propagators, spaces, and so * on. It provides * services such as failure management, propagation control, * memory management, and so on. To keep the documentation concise * the home space is not documented for functions * and member functions. * * \section NotationShare Sharing in update and copy * * In member functions that either copy or update an object during * cloning, an argument \a share of type \c bool is available. This * Boolean value controls whether during cloning the data structure at * hand will be shared among the newly created cloned space and the original * or whether two independent copies are created. Some functions (such * as \c copy for spaces (Gecode::Space) or \c copy for propagators * (Gecode::Propagator) also feature this argument. Here it is used * to pass on the Boolean value to other datastructures used inside spaces * or propagators. * * The actual value the \a share argument has is defined by the search * engine: when a search engine uses the \a clone member function of * a space it decides whether sharing is to be used in the cloning of * the space or not. If the search engine is single-threaded, it will * use full sharing (\a share will be true). Only if the search engine * uses concurrency or parallelism with more than a single thread, * it will pass false as value. This means that by not sharing data structures * among spaces which are to be used in different threads, all parts of * %Gecode but the actual search engine do not need to provide concurrency * control. * * As examples for data structures which are sensitive to sharing, consider * Gecode::SharedArray, Gecode::IntSet, and Gecode::DFA. */ /** * \page PageHowToChange_2 How to Change from %Gecode 1.3.1 to %Gecode 2.0.x * As %Gecode 2.0.0 is a major revision of %Gecode, your programs that are written for %Gecode 1.3.1 are likely to require some modifications before they work again. All modifications are straightforward, though. This short summary shows how to adapt your models and linker invocation, for changes to propagator implementations, etc, please consult the changelog. \section SecChange2IntBool IntVar and BoolVar Boolean variables (BoolVar) are not any longer integer variables (IntVar). The same holds for variable arrays (BoolVarArray, IntVarArray). So, you can not mix Boolean and integer variables in the same array (use two different arrays) and you can not cast between them. If you want to link the value of a BoolVar to the value of an IntVar you have to use a \ref TaskModelIntChannel "channel constraint". Posting constraints remains unchanged, as all constraints offer two overloaded versions (one for IntVar, one for BoolVar). \section SecChange2Regular Regular constraint The regular constraint has been renamed to extensional (after all, it is an extensionally specified constraint). The old name is still available in the MiniModel module. If you want to use regular expressions, you have to add \code #include \endcode to your file as they moved to the MiniModel module. \section SecChange2Bool Boolean constraints In order to make the interface to Boolean constraints more regular and similar to set constraints, Boolean constraints are available as rel constraints. That is, instead of \code bool_and(home, x, y, z); \endcode you have to write \code rel(home, x, BOT_AND, y, z); \endcode Likewise, for arrays you have to write \code rel(home, BOT_AND, x, y); \endcode instead of \code bool_and(home, x, y); \endcode More information is available \ref TaskModelIntRelBool "here". \section SecChange2Branching Branching Values and types for selecting how to branch have been made uniform. Replace BVAL_* by INT_VAL_*, BVAR_* by INT_VAR_*, and so on. \section SecChange2GCC Global cardinality constraint The interface for the global cardinality constraint has been simplified. The constraint is now called count. Please check the documentation for \ref TaskModelIntCount "details". \section SecChange2Sorted Sortedness constraint The sortedness constraint has been renamed to sorted. \section SecChange2Linking Linking Some generic functionality has been put into its own library (\code libgecodesupport \endcode on Unix systems, \code GecodeSupport.dll \endcode on Windows). You have to link against this library now. */ /** * \page PageHowToChange_3 How to Change from %Gecode 2.2.2 to %Gecode 3.0.0 * As %Gecode 3.0.0 is a major revision, your programs that are written for %Gecode 2.2.2 are likely to require some modifications before they work again. All modifications are straightforward, though. This short summary shows how to adapt your models, for changes to propagator implementations, etc, please consult the changelog. \section SecChange3Param Passing parameters Now everything is passed as reference (Space, Propagator, ModEventDelta, Advisor, Branching, and BranchingDesc). The reason for this massive change is to be more C++ compliant and make the interfaces more consistent (at some places things were passed as references and at other places as pointers, for no obvious and explainable reason). Routines that create objects rather than pass them (such as copy, clone, or description) still return a pointer to an object (so that it can actually be deleted!). You will have to rewrite your models and other programs using %Gecode. For models this is easy enough: - Replace "(Space* home" by "(Space& home". - Replace "home->" by "home.". - Replace "(this" by "(*this". . That should do the trick for 99% of the models. For the other changes, just lookout for the changes in types and that "this" becomes "*this" now. \section SecChange3Set Set constrains Element and convexity constraints on set variables have a more uniform interface, and the match constrained has been renamed to channel. The values for variable and value selection for branching have been made consistent and extended. The following values have been renamed: - SET_VAR_MIN_CARD -> SET_VAR_SIZE_MIN - SET_VAR_MAX_CARD -> SET_VAR_SIZE_MAX - SET_VAR_MIN_UNKNOWN_ELEM -> SET_VAR_MIN_MIN - SET_VAR_MAX_UNKNOWN_ELEM -> SET_VAR_MAX_MAX - SET_VAL_MIN -> SET_VAL_MIN_INC - SET_VAL_MAX -> SET_VAL_MAX_INC . Tie-breaking and random selection is now supported. \section SecChange3Files Naming scheme for files All files with extension .cc have been renamed to .cpp, and .icc has become .hpp. This avoids conflicts as .icc is typically used for other file types. All include directives are now specified using <...> notation instead of "...", so that %Gecode headers do not clutter the include namespace of a client program. \section SecChange3 Constrain method for best solution search The constrain method used for best solution search must be virtual and takes an argument of type const Space& rather than Space* as argument. */ /** * \page PageHowToChange_4 How to Change from %Gecode 3.7.3 to %Gecode 4.0.0 * As %Gecode 4.0.0 is a major revision, your programs that are written for %Gecode 3.7.3 are likely to require some modifications before they work again. \section SecChange4NewBranch Changed branching parameters The pre-defined variable-value branchings have been extended considerably and hence some changes are required. In order to change, you have to add () to all variants of INT_VAR, INT_VAL, INT_ASSIGN, SET_VAR, SET_VAL, and SET_ASSIGN. For example, INT_VAR_MIN_MIN becomes the function call INT_VAR_MIN_MIN() and INT_VAL_MIN becomes the function call INT_VAL_MIN(). Some of these functions expect additional arguments and can take also optional arguments (this replaces the VarBranchOptions and ValBranchOptions). Please read MPG for details. \section SecChange4SizeBranch Branchings treat SIZE differently Variable selection for branching used the quotient of size divided by degree, accumulated failure count, or activity. Now the inverse is used. That is, for example, it is not any longer INT_VAR_SIZE_DEGREE_MIN() but INT_VAR_DEGREE_SIZE_MAX() (that is, largest degree divided by size). That looks like an annoying change but is in fact essential: the strategies using accumulated failure count and activity now could have run into division by zero issues. And just changing the implementation is not good enough because the values of these measures can now be exposed during tie-breaking. */ gecode-4.2.1/examples/0000755000175000010010000000000012236131715013700 5ustar schulteNonegecode-4.2.1/examples/all-interval.cpp0000755000175000010010000000762612166527420017020 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2006 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include using namespace Gecode; /** * \brief %Example: All-interval series * * An all-interval series of length \f$n\f$ is a sequence * \f[ * (x_0,x_1,\ldots,x_{n-1}) * \f] * where each \f$x_i\f$ is an integer between \f$0\f$ and \f$n-1\f$ * such that the following conditions hold: * - the \f$x_i\f$ are a permutation of \f$\{0,1,\ldots,n-1\}\f$ * (that is, they are pairwise distinct and take values from * \f$\{0,1,\ldots,n-1\}\f$). * - the differences between adjacent values \f$(d_1,d_2,\ldots,d_{n-1})\f$ * with \f$d_i=\operatorname{abs}(x_i-x_{i-1})\f$ form a permutation of * \f$\{1,2,\ldots,n-1\}\f$. * * See also problem 7 at http://www.csplib.org/. * * \ingroup Example */ class AllInterval : public Script { private: /// The numbers IntVarArray x; /// The differences IntVarArray d; public: /// Actual model AllInterval(const SizeOptions& opt) : x(*this, opt.size(), 0, opt.size()-1), d(*this, opt.size()-1, 1, opt.size()-1) { const int n = x.size(); // Set up variables for distance for (int i=0; i(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/alpha.cpp0000644000175000010010000001145112166527420015477 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2001 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** * \brief %Example: %Alpha puzzle * * Well-known cryptoarithmetic puzzle of unknown origin. * * \ingroup Example * */ class Alpha : public Script { protected: /// Alphabet has 26 letters static const int n = 26; /// Array for letters IntVarArray le; public: /// Branching to use for model enum { BRANCH_NONE, ///< Choose variable left to right BRANCH_INVERSE, ///< Choose variable right to left BRANCH_SIZE ///< Choose variable with smallest size }; /// Actual model Alpha(const Options& opt) : le(*this,n,1,n) { IntVar a(le[ 0]), b(le[ 1]), c(le[ 2]), e(le[ 4]), f(le[ 5]), g(le[ 6]), h(le[ 7]), i(le[ 8]), j(le[ 9]), k(le[10]), l(le[11]), m(le[12]), n(le[13]), o(le[14]), p(le[15]), q(le[16]), r(le[17]), s(le[18]), t(le[19]), u(le[20]), v(le[21]), w(le[22]), x(le[23]), y(le[24]), z(le[25]); rel(*this, b+a+l+l+e+t == 45, opt.icl()); rel(*this, c+e+l+l+o == 43, opt.icl()); rel(*this, c+o+n+c+e+r+t == 74, opt.icl()); rel(*this, f+l+u+t+e == 30, opt.icl()); rel(*this, f+u+g+u+e == 50, opt.icl()); rel(*this, g+l+e+e == 66, opt.icl()); rel(*this, j+a+z+z == 58, opt.icl()); rel(*this, l+y+r+e == 47, opt.icl()); rel(*this, o+b+o+e == 53, opt.icl()); rel(*this, o+p+e+r+a == 65, opt.icl()); rel(*this, p+o+l+k+a == 59, opt.icl()); rel(*this, q+u+a+r+t+e+t == 50, opt.icl()); rel(*this, s+a+x+o+p+h+o+n+e == 134, opt.icl()); rel(*this, s+c+a+l+e == 51, opt.icl()); rel(*this, s+o+l+o == 37, opt.icl()); rel(*this, s+o+n+g == 61, opt.icl()); rel(*this, s+o+p+r+a+n+o == 82, opt.icl()); rel(*this, t+h+e+m+e == 72, opt.icl()); rel(*this, v+i+o+l+i+n == 100, opt.icl()); rel(*this, w+a+l+t+z == 34, opt.icl()); distinct(*this, le, opt.icl()); switch (opt.branching()) { case BRANCH_NONE: branch(*this, le, INT_VAR_NONE(), INT_VAL_MIN()); break; case BRANCH_INVERSE: branch(*this, le.slice(le.size()-1,-1), INT_VAR_NONE(), INT_VAL_MIN()); break; case BRANCH_SIZE: branch(*this, le, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); break; } } /// Constructor for cloning \a s Alpha(bool share, Alpha& s) : Script(share,s) { le.update(*this, share, s.le); } /// Copy during cloning virtual Space* copy(bool share) { return new Alpha(share,*this); } /// Print solution virtual void print(std::ostream& os) const { os << "\t"; for (int i = 0; i < n; i++) { os << ((char) (i+'a')) << '=' << le[i] << ((i(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/archimedean-spiral.cpp0000644000175000010010000001007012166527420020136 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Vincent Barichard * * Copyright: * Vincent Barichard, 2012 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** * \brief %Example: Archimedean spiral * * The Archimedean Spiral is a spiral where all points * corresponding to the locations over time of a point moving * away from a fixed point with a constant speed along a line * which rotates with constant angular velocity. It is defined * by the polar equation: * \f[ r = a+b\theta \f] * * To get cartesian coordinates, it can be solved for \f$x\f$ * and \f$y\f$ in terms of \f$r\f$ and \f$\theta\f$. * By setting \f$a=1\f$ and \f$b=1\f$, it yields to the equation: * * \f[ r = \theta \f] with \f[ x=r\operatorname{cos}(\theta), * \quad y=r\operatorname{sin}(\theta) \f] * * The tuple \f$(r,\theta)\f$ is related to the position for * \f$x\f$ and \f$y\f$ on the curve. \f$r\f$ and \f$\theta\f$ * are positive numbers. * * To get reasonable interval starting * sizes, \f$x\f$ and * \f$y\f$ are restricted to \f$[-20;20]\f$. * * \ingroup Example */ class ArchimedeanSpiral : public Script { protected: /// The numbers FloatVarArray f; /// Minimum distance between two solutions FloatNum step; public: /// Actual model ArchimedeanSpiral(const Options&) : f(*this,4,-20,20), step(0.1) { // Post equation FloatVar theta = f[0]; FloatVar r = f[3]; FloatVar x = f[1]; FloatVar y = f[2]; rel(*this, theta >= 0); rel(*this, theta <= 6*FloatVal::pi()); rel(*this, r >= 0); rel(*this, r*cos(theta) == x); rel(*this, r*sin(theta) == y); rel(*this, r == theta); branch(*this,f[0],FLOAT_VAL_SPLIT_MIN()); } /// Constructor for cloning \a p ArchimedeanSpiral(bool share, ArchimedeanSpiral& p) : Script(share,p), step(p.step) { f.update(*this,share,p.f); } /// Copy during cloning virtual Space* copy(bool share) { return new ArchimedeanSpiral(share,*this); } /// Add constraint to current model to get next solution (not too close) virtual void constrain(const Space& _b) { const ArchimedeanSpiral& b = static_cast(_b); rel(*this, f[0] >= (b.f[0].max()+step)); } /// Print solution coordinates virtual void print(std::ostream& os) const { os << "XY " << f[1].med() << " " << f[2].med() << std::endl; } }; /** \brief Main-function * \relates ArchimedeanSpiral */ int main(int argc, char* argv[]) { Options opt("ArchimedeanSpiral"); opt.parse(argc,argv); opt.solutions(0); Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/bacp.cpp0000755000175000010010000003305512166527420015326 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * * Contributing authors: * Mikael Lagerkvist * * Copyright: * Guido Tack, 2006 * Mikael Lagerkvist, 2010 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include #include #include #include #include using namespace Gecode; /// A course \relates BACP class Course { public: const char* name; ///< Course name int credit; ///< Course credit }; /// A curriculum \relates BACP class Curriculum { public: /// Number of periods int p; /// Minimum academic load int a; /// Maximum academic load int b; /// Minimum amount of courses int c; /// Maximum amount of courses int d; /// Courses const Course *courses; /// Prerequisites const char **prereqs; }; namespace { extern const Curriculum curriculum[]; extern const unsigned int n_examples; } /** * \brief %Example: The balanced academic curriculum problem * * This is problem 030 from http://www.csplib.org/. * * A custom value selection from "A CP Approach to the Balanced * Academic Curriculum Problem", J.N. Monette, P. Schaus, S. Zampelli, * Y. Deville, and P. Dupont is available. * * \ingroup Example * */ class BACP : public IntMinimizeScript { protected: /// The curriculum to be scheduled const Curriculum curr; /// Academic load for each period IntVarArray l; /// Maximum academic load IntVar u; /// Number of courses assigned to a period IntVarArray q; /// Period to which a course is assigned IntVarArray x; public: /// Branching variants enum { BRANCHING_NAIVE, ///< Simple fail-first branching BRANCHING_LOAD, ///< Place based on minimum-load BRANCHING_LOAD_REV, ///< Place based on maximum-load }; /// Actual model BACP(const SizeOptions& opt) : curr(curriculum[opt.size()]) { std::map courseMap; // Map names to course numbers int maxCredit = 0; int numberOfCourses = 0; for (const Course* co=curr.courses; co->name != 0; co++) { courseMap[co->name] = numberOfCourses++; maxCredit += co->credit; } int p = curr.p; int a = curr.a; int b = curr.b; int c = curr.c; int d = curr.d; l = IntVarArray(*this, p, a, b); u = IntVar(*this, 0, maxCredit); q = IntVarArray(*this, p, c, d); x = IntVarArray(*this, numberOfCourses, 0, p-1); for (int j=0; j(home); IntVarValues values(x); int val = -1; int best = Int::Limits::max+1; while (values()) { if (b.l[values.val()].min() < best) { val = values.val(); best = b.l[val].min(); } ++values; } assert(val != -1); return val; } /// Value selection function for reverse load branching static int load_rev(const Space& home, IntVar x, int) { const BACP& b = static_cast(home); IntVarValues values(x); int val = -1; int best = Int::Limits::min-1; while (values()) { if (b.l[values.val()].min() > best) { val = values.val(); best = b.l[val].min(); } ++values; } assert(val != -1); return val; } /// Constructor for copying \a bacp BACP(bool share, BACP& bacp) : IntMinimizeScript(share,bacp), curr(bacp.curr) { l.update(*this, share, bacp.l); u.update(*this, share, bacp.u); x.update(*this, share, bacp.x); } /// Copy during cloning virtual Space* copy(bool share) { return new BACP(share,*this); } /// Return solution cost virtual IntVar cost(void) const { return u; } /// Print solution virtual void print(std::ostream& os) const { std::vector > period(curr.p); for (int i=x.size(); i--;) period[x[i].val()].push_back(i); os << "Solution with load " << u.val() << ":" << std::endl; for (int i=0; i::iterator v=period[i].begin(); v != period[i].end(); ++v) { os << curr.courses[*v].name << " "; } os << std::endl; } os << std::endl; } }; /** \brief Main-function * \relates BACP */ int main(int argc, char* argv[]) { SizeOptions opt("BACP"); opt.branching(BACP::BRANCHING_NAIVE); opt.branching(BACP::BRANCHING_NAIVE,"naive"); opt.branching(BACP::BRANCHING_LOAD,"load"); opt.branching(BACP::BRANCHING_LOAD_REV,"load-reverse"); opt.size(2); opt.solutions(0); opt.iterations(20); opt.parse(argc,argv); if (opt.size() >= n_examples) { std::cerr << "Error: size must be between 0 and " << n_examples - 1 << std::endl; return 1; } IntMinimizeScript::run(opt); return 0; } namespace { /** \name Parameters for balanced academic curriculum * \relates BACP * @{ */ /// Courses for first example const Course courses8[] = { {"dew100", 1}, {"fis100", 3}, {"hcw310", 1},{"iwg101", 2},{"mat190", 4},{"mat192", 4},{"dew101", 1}, {"fis101", 5},{"iwi131", 3},{"mat191", 4},{"mat193", 4},{"fis102", 5},{"hxwxx1", 1}, {"iei134", 3},{"iei141", 3},{"mat194", 4}, {"dewxx0", 1},{"hcw311", 1},{"iei132", 3},{"iei133", 3},{"iei142", 3},{"iei162", 3}, {"iwn170", 3},{"mat195", 3},{"hxwxx2", 1},{"iei231", 4},{"iei241", 4},{"iei271", 3},{"iei281", 3},{"iwn261", 3}, {"hfw120", 2},{"iei233", 4},{"iei238", 3},{"iei261", 3},{"iei272", 3},{"iei273", 3},{"iei161", 3},{"iei232", 3}, {"iei262", 3},{"iei274", 3},{"iwi365", 3},{"iwn270", 3},{"hrw130", 2},{"iei218", 3},{"iei219", 3},{"iei248", 3}, {0,0} }; /// Prerequisites for first example const char* prereqs8[] = { "dew101","dew100", "fis101","fis100", "fis101","mat192", "mat191","mat190", "mat193","mat190", "mat193","mat192", "fis102","fis101", "fis102","mat193", "iei134","iwi131", "iei141","iwi131", "mat194","mat191 ", "mat194","mat193", "dewxx0","dew101", "hcw311","hcw310", "iei132","iei134", "iei133","iei134", "iei142","iei141", "mat195","mat194", "iei231","iei134", "iei241","iei142", "iei271","iei162", "iei281","mat195", "iei233","iei231", "iei238","iei231", "iei261","iwn261", "iei272","iei271", "iei273","iei271", "iei273","iei271", "iei161","iwn261", "iei161","iwn261", "iei232","iei273", "iei232","iei273", "iei262","iwn261", "iei274","iei273", "iei274","iei273", "iei219","iei232", "iei248","iei233", "iei248","iei233", 0,0 }; /// Courses for second example const Course courses10[] = { {"dew100",1}, {"fis100",3}, {"hrwxx1",2}, {"iwg101",2}, {"mat021",5}, {"qui010",3}, {"dew101",1}, {"fis110",5}, {"hrwxx2",2}, {"iwi131",3}, {"mat022",5}, {"dewxx0",1}, {"fis120",4}, {"hcw310",1}, {"hrwxx3",2}, {"ili134",4}, {"ili151",3}, {"mat023",4}, {"hcw311",1}, {"ili135",4}, {"ili153",3}, {"ili260",3}, {"iwn261",3}, {"mat024",4}, {"fis130",4}, {"ili239",4}, {"ili245",4}, {"ili253",4}, {"fis140",4}, {"ili236",4}, {"ili243",4}, {"ili270",3}, {"ili280",4}, {"ici344",4}, {"ili263",3}, {"ili332",4}, {"ili355",4}, {"iwn170",3}, {"icdxx1",3}, {"ili362",3}, {"iwn270",3}, {"icdxx2",3}, {0,0} }; /// Prerequisites for second example const char* prereqs10[] = { "dew101","dew100", "fis110","fis100", "fis110","mat021", "mat022","mat021", "dewxx0","dew101", "fis120","fis110", "fis120","mat022", "ili134","iwi131", "ili151","iwi131", "mat023","mat022", "hcw311","hcw310", "ili135","ili134", "ili153","ili134", "ili153","ili151", "mat024","mat023", "fis130","fis110", "fis130","mat022", "ili239","ili135", "ili245","ili153", "ili253","ili153", "fis140","fis120", "fis140","fis130", "ili236","ili239", "ili243","ili245", "ili270","ili260", "ili270","iwn261", "ili280","mat024", "ici344","ili243", "ili263","ili260", "ili263","iwn261", "ili332","ili236", "ili355","ili153", "ili355","ili280", "ili362","ili263", 0,0 }; /// Courses for third example const Course courses12[] = { {"dew100",1}, {"fis100",3}, {"hcw310",1}, {"iwg101",2}, {"mat111",4}, {"mat121",4}, {"dew101",1}, {"fis110",5}, {"iwi131",3}, {"mat112",4}, {"mat122",4}, {"dewxx0",1}, {"fis120",4}, {"hcw311",1}, {"hxwxx1",1}, {"ili142",4}, {"mat113",4}, {"mat123",4}, {"fis130",4}, {"ili134",4}, {"ili151",3}, {"iwm185",3}, {"mat124",4}, {"fis140",4}, {"hxwxx2",1}, {"ile260",3}, {"ili260",3}, {"iwn170",3}, {"qui104",3}, {"ili231",3}, {"ili243",4}, {"ili252",4}, {"ili273",3}, {"mat210",4}, {"mat260",4}, {"ild208",3}, {"ili221",4}, {"ili274",3}, {"ili281",3}, {"iwn270",3}, {"mat270",4}, {"hrw150",2}, {"ili238",4}, {"ili242",3}, {"ili275",3}, {"ili355",4}, {"hrw110",2}, {"ici393",4}, {"ili237",4}, {"ili334",4}, {"ili363",3}, {"iwn261",3}, {"hrw100",2}, {"ici382",4}, {"ili331",4}, {"ili362",3}, {"ili381",3}, {"iln230",3}, {"ici313",2}, {"ici315",2}, {"ici332",3}, {"ici344",4}, {"icn336",3}, {"iwi365",3}, {"ici314",2}, {"ici367",2}, {0,0} }; /// Prerequisites for third example const char* prereqs12[] = { "dew101","dew100", "fis110","fis100", "fis110","mat121", "mat112","mat111", "mat122","mat111", "mat122","mat121", "dewxx0","dew101", "fis120","fis110", "fis120","mat122", "hcw311","hcw310", "ili142","iwi131", "mat113","mat112", "mat113","mat122", "mat123","mat112", "mat123","mat122", "fis130","fis110", "fis130","mat122", "ili134","iwi131", "ili151","mat112", "mat124","mat113", "mat124","mat123", "fis140","fis120", "fis140","fis130", "ile260","fis120", "ile260","mat124", "ili231","iwi131", "ili252","iwi131", "ili273","ili260", "mat210","mat113", "mat260","iwi131", "mat260","mat113", "mat260","mat123", "ili221","ili134", "ili221","ili231", "ili221","mat260", "ili274","ili273", "ili281","mat260", "mat270","iwi131", "mat270","mat113", "mat270","mat123", "ili238","ili134", "ili242","ili142", "ili275","ili274", "ili355","ili221", "hrw110","hrw150", "ici393","mat210", "ici393","mat260", "ili237","ili231", "ili237","ili252", "ili334","ili238", "ili363","ili273", "hrw100","hrw110", "ici382","ili334", "ili331","ili238", "ili331","ili274", "ili362","ili363", "ili381","ili281", "ili381","mat210", "iln230","iwn170", "ici313","ili331", "ici332","ici393", "ici332","ili331", "ici344","ili243", "icn336","ici393", "ici314","ici313", 0,0 }; /// The example specifications const Curriculum curriculum[]= { { 8, 10, 24, 2, 10, courses8, prereqs8 }, { 10, 10, 24, 2, 10, courses10, prereqs10 }, { 12, 10, 24, 2, 10, courses12, prereqs12 } }; /// The number of examples const unsigned int n_examples = sizeof(curriculum) / sizeof(Curriculum); //@} } // STATISTICS: example-any gecode-4.2.1/examples/bibd.cpp0000755000175000010010000001341612166527420015320 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2004 * * Bugfixes provided by: * Olof Sivertsson * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include using namespace Gecode; /** * \brief %Options for %BIBD problems * */ class BIBDOptions : public Options { public: int v, k, lambda; ///< Parameters to be given on command line int b, r; ///< Derived parameters /// Derive additional parameters void derive(void) { b = (v*(v-1)*lambda)/(k*(k-1)); r = (lambda*(v-1)) / (k-1); } /// Initialize options for example with name \a s BIBDOptions(const char* s, int v0, int k0, int lambda0) : Options(s), v(v0), k(k0), lambda(lambda0) { derive(); } /// Parse options from arguments \a argv (number is \a argc) void parse(int& argc, char* argv[]) { Options::parse(argc,argv); if (argc < 4) return; v = atoi(argv[1]); k = atoi(argv[2]); lambda = atoi(argv[3]); derive(); } /// Print help message virtual void help(void) { Options::help(); std::cerr << "\t(unsigned int) default: " << v << std::endl << "\t\tparameter v" << std::endl << "\t(unsigned int) default: " << k << std::endl << "\t\tparameter k" << std::endl << "\t(unsigned int) default: " << lambda << std::endl << "\t\tparameter lambda" << std::endl; } }; /** * \brief %Example: Balanced incomplete block design (%BIBD) * * See problem 28 at http://www.csplib.org/. * * \ingroup Example * */ class BIBD : public Script { protected: /// Options providing access to parameters const BIBDOptions& opt; /// Matrix of Boolean variables BoolVarArray _p; public: /// Symmetry breaking variants enum { SYMMETRY_NONE, ///< No symmetry breaking SYMMETRY_LEX, ///< Lex-constraints on rows/columns SYMMETRY_LDSB ///< LDSB on rows/columns }; /// Actual model BIBD(const BIBDOptions& o) : opt(o), _p(*this,opt.v*opt.b,0,1) { Matrix p(_p,opt.b,opt.v); // r ones per row for (int i=0; i intm(ints, opt.b, opt.v); if (opt.symmetry() == SYMMETRY_LDSB) { Symmetries s; s << rows_interchange(p); s << columns_interchange(p); branch(*this, _p, INT_VAR_NONE(), INT_VAL_MIN(), s); } else { if (opt.symmetry() == SYMMETRY_LEX) { for (int i=1; i p(_p,opt.b,opt.v); for (int i = 0; i(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/bin-packing.cpp0000644000175000010010000506725612166527420016617 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2010 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include using namespace Gecode; // Instance data namespace { // Instances extern const int* bpp[]; // Instance names extern const char* name[]; /// A wrapper class for instance data class Spec { protected: /// Raw instance data const int* data; /// Lower and upper bound int l, u; public: /// Whether a valid specification has been found bool valid(void) const { return data != NULL; } /// Return maximal capacity of a bin int capacity(void) const { return data[0]; } /// Return number of items int items(void) const { return data[1]; } /// Return size of item \a i int size(int i) const { return data[i+2]; } protected: /// Find instance by name \a s static const int* find(const char* s) { for (int i=0; name[i] != NULL; i++) if (!strcmp(s,name[i])) return bpp[i]; return NULL; } /// Compute lower bound int clower(void) const { /* * The lower bound is due to: S. Martello, P. Toth. Lower bounds * and reduction procedures for the bin packing problem. * Discrete and applied mathematics, 28(1):59-70, 1990. */ const int c = capacity(), n = items(); int l = 0; // Items in N1 are from 0 ... n1 - 1 int n1 = 0; // Items in N2 are from n1 ... n12 - 1, we count elements in N1 and N2 int n12 = 0; // Items in N3 are from n12 ... n3 - 1 int n3 = 0; // Free space in N2 int f2 = 0; // Total size of items in N3 int s3 = 0; // Initialize n12 and f2 for (; (n12 < n) && (size(n12) > c/2); n12++) f2 += c - size(n12); // Initialize n3 and s3 for (n3 = n12; n3 < n; n3++) s3 += size(n3); // Compute lower bounds for (int k=0; k<=c/2; k++) { // Make N1 larger by adding elements and N2 smaller for (; (n1 < n) && (size(n1) > c-k); n1++) f2 -= c - size(n1); assert(n1 <= n12); // Make N3 smaller by removing elements for (; (size(n3-1) < k) && (n3 > n12); n3--) s3 -= size(n3-1); // Overspill int o = (s3 > f2) ? ((s3 - f2 + c - 1) / c) : 0; l = std::max(l, n12 + o); } return l; } /// Compute upper bound int cupper(void) const { // Use a naive greedy algorithm const int c = capacity(), n = items(); int* f = new int[n]; for (int i=0; i load; /// Views for the bins ViewArray bin; /// Array of sizes (shared) IntSharedArray size; /// Next view to branch on mutable int item; /// %Choice class Choice : public Gecode::Choice { public: /// Item int item; /// Bins with same slack int* same; /// Number of bins with same slack int n_same; /** Initialize choice for brancher \a b, alternatives \a a, * item \a i and same bins \a s. */ Choice(const Brancher& b, unsigned int a, int i, int* s, int n_s) : Gecode::Choice(b,a), item(i), same(heap.alloc(n_s)), n_same(n_s) { for (int k=n_same; k--; ) same[k] = s[k]; } /// Report size occupied virtual size_t size(void) const { return sizeof(Choice) + sizeof(int) * n_same; } /// Archive into \a e virtual void archive(Archive& e) const { Gecode::Choice::archive(e); e << alternatives() << item << n_same; for (int i=n_same; i--;) e << same[i]; } /// Destructor virtual ~Choice(void) { heap.free(same,n_same); } }; public: /// Construct brancher CDBF(Home home, ViewArray& l, ViewArray& b, IntSharedArray& s) : Brancher(home), load(l), bin(b), size(s), item(0) { home.notice(*this,AP_DISPOSE); } /// Brancher post function static BrancherHandle post(Home home, ViewArray& l, ViewArray& b, IntSharedArray& s) { return *new (home) CDBF(home, l, b, s); } /// Copy constructor CDBF(Space& home, bool share, CDBF& cdbf) : Brancher(home, share, cdbf), item(cdbf.item) { load.update(home, share, cdbf.load); bin.update(home, share, cdbf.bin); size.update(home, share, cdbf.size); } /// Copy brancher virtual Actor* copy(Space& home, bool share) { return new (home) CDBF(home, share, *this); } /// Delete brancher and return its size virtual size_t dispose(Space& home) { home.ignore(*this,AP_DISPOSE); size.~IntSharedArray(); return sizeof(*this); } /// Check status of brancher, return true if alternatives left virtual bool status(const Space&) const { for (int i = item; i < bin.size(); i++) if (!bin[i].assigned()) { item = i; return true; } return false; } /// Return choice virtual Gecode::Choice* choice(Space& home) { assert(!bin[item].assigned()); int n = bin.size(), m = load.size(); Region region(home); // Free space in bins int* free = region.alloc(m); for (int j=m; j--; ) free[j] = load[j].max(); for (int i=n; i--; ) if (bin[i].assigned()) free[bin[i].val()] -= size[i]; // Equivalent bins with same free space int* same = region.alloc(m+1); unsigned int n_same = 0; unsigned int n_possible = 0; // Initialize such that failure is guaranteed (pack into bin -1) same[n_same++] = -1; // Find a best-fit bin for item int slack = INT_MAX; for (Int::ViewValues j(bin[item]); j(); ++j) if (size[item] <= free[j.val()]) { // Item still can fit into the bin n_possible++; if (free[j.val()] - size[item] < slack) { // A new, better fit slack = free[j.val()] - size[item]; same[0] = j.val(); n_same = 1; } else if (free[j.val()] - size[item] == slack) { // An equivalent bin, remember it same[n_same++] = j.val(); } } /* * Domination rules: * - if the item fits the bin exactly, just assign * - if all possible bins are equivalent, just assign * * Also catches failure: if no possible bin was found, commit * the item into bin -1. */ if ((slack == 0) || (n_same == n_possible) || (slack == INT_MAX)) return new Choice(*this, 1, item, same, 1); else return new Choice(*this, 2, item, same, n_same); } /// Return choice virtual const Gecode::Choice* choice(const Space& home, Archive& e) { int alt, item, n_same; e >> alt >> item >> n_same; Region re(home); int* same = re.alloc(n_same); for (int i=n_same; i--;) e >> same[i]; return new Choice(*this, alt, item, same, n_same); } /// Perform commit for choice \a _c and alternative \a a virtual ExecStatus commit(Space& home, const Gecode::Choice& _c, unsigned int a) { const Choice& c = static_cast(_c); // This catches also the case that the choice has a single aternative only if (a == 0) { GECODE_ME_CHECK(bin[c.item].eq(home, c.same[0])); } else { Iter::Values::Array same(c.same, c.n_same); GECODE_ME_CHECK(bin[c.item].minus_v(home, same)); for (int i = c.item+1; (i(_c); if (a == 0) { o << "bin[" << c.item << "] = " << c.same[0]; } else { o << "bin[" << c.item; for (int i = c.item+1; (i load(home, l); ViewArray bin(home, b); IntSharedArray size(s); return CDBF::post(home, load, bin, size); } /** * \brief %Example: Bin packing * * \ingroup Example * */ class BinPacking : public IntMinimizeScript { protected: /// Specification const Spec spec; /// Load for each bin IntVarArray load; /// Bin for each item IntVarArray bin; /// Number of bins IntVar bins; public: /// Model variants enum { MODEL_NAIVE, ///< Use naive model MODEL_PACKING ///< Use bin packing constraint }; /// Branching to use for model enum { BRANCH_NAIVE, ///< Use naive branching BRANCH_CDBF, ///< Use CDBF }; /// Actual model BinPacking(const InstanceOptions& opt) : spec(opt.instance()), load(*this, spec.upper(), 0, spec.capacity()), bin(*this, spec.items(), 0, spec.upper()-1), bins(*this, spec.lower(), spec.upper()) { // Number of items int n = bin.size(); // Number of bins int m = load.size(); // Size of all items int s = 0; for (int i=0; i x(_x, n, m); for (int i=0; i spec.capacity()); i++) rel(*this, bin[i] == i); // Check if the next item cannot fit to position i-1 if ((i < n) && (i < m) && (i > 0) && (spec.size(i-1) + spec.size(i) > spec.capacity())) rel(*this, bin[i] == i); } // All excess bins must be empty for (int j=spec.lower()+1; j <= spec.upper(); j++) rel(*this, (bins < j) == (load[j-1] == 0)); branch(*this, bins, INT_VAL_MIN()); switch (opt.branching()) { case BRANCH_NAIVE: branch(*this, bin, INT_VAR_NONE(), INT_VAL_MIN()); break; case BRANCH_CDBF: cdbf(*this, load, bin, sizes); break; } } /// Return cost virtual IntVar cost(void) const { return bins; } /// Constructor for cloning \a s BinPacking(bool share, BinPacking& s) : IntMinimizeScript(share,s), spec(s.spec) { load.update(*this, share, s.load); bin.update(*this, share, s.bin); bins.update(*this, share, s.bins); } /// Copy during cloning virtual Space* copy(bool share) { return new BinPacking(share,*this); } /// Print solution virtual void print(std::ostream& os) const { int n = bin.size(); int m = load.size(); os << "Bins used: " << bins << " (from " << m << " bins)." << std::endl; for (int j=0; j(opt); return 0; } namespace { /* * Instances taken from: * A. Scholl, R. Klein, and C. Jürgens: BISON: a fast hybrid procedure * for exactly solving the one-dimensional bin packing problem. * Computers & Operations Research 24 (1997) 627-645. * * The item size have been sorted for simplicty. * */ /* * Data set 1 * */ const int n1c1w1_a[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 99,99,96,96,92,92,91,88,87,86,85,76,74,72,69,67,67,62,61,56,52, 51,49,46,44,42,40,40,33,33,30,30,29,28,28,27,25,24,23,22,21,20, 17,14,13,11,10,7,7,3 }; const int n1c1w1_b[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,99,97,97,97,93,93,92,92,88,83,83,79,76,76,75,72,71,70,69, 67,66,63,62,62,61,61,51,50,44,44,43,43,40,39,37,37,30,23,20,19, 18,17,15,14,13,13,12,8,8 }; const int n1c1w1_c[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 92,89,87,84,82,82,81,75,73,71,67,67,63,59,57,56,52,49,48,47,46, 41,39,38,36,35,34,34,30,29,26,21,20,19,18,15,15,13,11,10,10,10, 9,8,8,7,6,6,6,3 }; const int n1c1w1_d[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,99,98,97,95,94,92,92,91,82,80,77,76,75,73,73,73,71,68,65, 65,63,63,63,60,59,53,45,44,40,31,25,24,24,24,23,22,21,21,15,14, 14,10,10,7,7,6,3,2,2 }; const int n1c1w1_e[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 91,88,88,87,87,86,86,85,85,84,83,80,79,78,77,70,70,68,67,66,59, 52,49,48,47,47,44,42,38,37,37,34,34,33,31,29,27,24,21,17,16,16, 15,14,8,6,5,4,2,2 }; const int n1c1w1_f[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 99,98,98,93,92,89,89,84,84,83,78,77,75,73,72,71,70,69,69,68,60, 60,57,56,54,50,49,49,45,37,36,35,30,30,27,26,26,25,24,21,20,19, 15,14,13,11,11,8,2,2 }; const int n1c1w1_g[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,99,98,98,98,91,90,87,84,84,78,77,72,71,70,69,69,64,63,58, 58,46,45,45,43,43,42,41,37,37,37,35,34,31,30,29,24,23,22,21,20, 17,12,11,10,9,7,6,5,4 }; const int n1c1w1_h[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 97,93,93,92,92,91,90,88,86,85,85,85,82,81,80,79,75,73,71,70,70, 67,66,64,62,62,61,54,48,48,47,46,44,41,40,39,34,29,24,24,21,18, 16,16,14,13,11,10,5,1 }; const int n1c1w1_i[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 95,92,87,87,85,84,83,79,77,77,75,73,69,68,65,63,63,62,61,58,57, 52,50,44,43,40,40,38,38,38,35,33,33,32,31,29,27,24,24,22,19,19, 18,16,14,11,6,4,3,2 }; const int n1c1w1_j[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 99,99,95,94,94,93,91,90,86,81,81,80,79,77,74,69,69,63,55,54,54, 53,52,50,44,40,39,38,37,36,36,36,36,34,31,31,26,25,23,22,18,17, 15,14,13,12,10,7,2,1 }; const int n1c1w1_k[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 96,91,91,89,87,85,84,83,82,79,78,77,77,75,75,70,68,66,64,62,62, 56,53,51,44,41,40,38,38,36,34,31,30,29,28,27,26,23,17,16,15,14, 14,12,11,10,8,8,4,2 }; const int n1c1w1_l[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 99,99,98,96,95,93,92,92,89,87,85,85,82,80,72,71,68,68,64,64,63, 61,59,59,57,57,57,55,55,52,52,51,49,48,47,47,40,39,38,37,29,28, 28,22,22,19,17,16,9,4 }; const int n1c1w1_m[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,100,99,97,94,93,91,90,89,88,87,87,86,86,79,77,72,71,70,69, 68,68,65,64,61,60,59,51,50,50,43,42,39,37,29,27,25,24,21,19,17, 16,13,13,8,6,6,3,2,1 }; const int n1c1w1_n[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 99,98,95,95,95,94,94,91,88,87,86,85,76,74,73,71,68,60,55,54,51, 45,42,40,39,39,36,34,33,32,32,31,31,30,29,26,26,23,21,21,21,19, 18,18,16,15,5,5,4,1 }; const int n1c1w1_o[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,99,98,97,97,94,92,91,91,90,88,87,85,81,81,80,79,72,70,67, 67,66,64,63,61,59,58,56,55,51,50,50,50,49,46,41,39,39,38,30,30, 24,22,21,20,19,14,8,7,5 }; const int n1c1w1_p[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 96,94,91,90,82,81,80,77,76,75,74,72,70,68,65,63,63,63,60,60,59, 58,57,55,51,47,46,36,36,34,32,32,30,30,28,28,27,26,24,24,19,19, 17,17,11,9,9,7,4,4 }; const int n1c1w1_q[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 97,92,90,85,83,83,82,81,77,76,74,73,71,67,67,67,67,63,63,62,59, 58,58,56,56,55,53,50,47,42,41,41,41,39,37,35,32,31,30,26,25,22, 20,17,16,15,13,13,10,5 }; const int n1c1w1_r[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 95,94,93,92,87,81,81,79,78,76,75,72,72,71,70,65,62,61,60,55,54, 54,51,49,46,45,38,38,37,36,36,36,32,31,28,27,26,25,24,24,21,20, 20,17,14,10,9,7,7,3 }; const int n1c1w1_s[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,99,99,97,96,95,87,87,87,86,84,82,80,80,80,76,75,74,71,68, 67,63,62,60,52,52,52,48,44,44,43,43,37,34,33,31,29,28,25,21,20, 17,16,13,11,9,6,5,4,3 }; const int n1c1w1_t[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,97,92,91,89,88,83,82,82,82,78,77,77,77,73,72,68,67,66,65, 64,62,60,60,57,53,50,48,46,42,40,40,38,37,37,31,30,29,28,21,20, 20,20,20,18,18,15,15,11,1 }; const int n1c1w2_a[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 96,93,86,86,85,83,80,80,80,79,77,68,67,64,64,63,60,57,55,54,54, 54,54,52,52,52,51,44,43,41,41,39,39,39,38,36,36,35,34,34,31,31, 29,29,28,24,23,22,22,20 }; const int n1c1w2_b[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 99,96,95,95,91,91,91,90,89,86,85,85,84,79,76,69,68,68,65,64,63, 58,58,54,53,52,50,49,48,48,45,45,43,42,36,35,33,31,31,30,30,30, 29,27,27,26,22,22,22,21 }; const int n1c1w2_c[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,99,98,97,94,93,91,89,89,89,85,85,84,83,81,81,78,73,73,73, 73,70,69,68,64,64,63,59,54,49,48,45,45,43,42,41,39,37,37,36,32, 30,26,26,25,24,24,23,21,21 }; const int n1c1w2_d[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 97,97,90,89,89,89,85,83,82,81,77,76,76,75,71,71,68,68,66,63,63, 63,62,61,61,59,58,54,53,50,50,50,46,43,40,36,36,33,32,31,31,31, 28,27,27,26,26,24,23,22 }; const int n1c1w2_e[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 99,96,94,94,90,90,90,90,87,86,85,85,84,84,84,84,84,83,81,81,79, 71,71,70,65,65,65,63,62,59,51,51,50,49,49,49,47,45,44,43,41,35, 35,33,31,27,23,23,22,22 }; const int n1c1w2_f[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 99,94,94,89,88,86,86,85,84,84,83,79,77,76,74,73,71,71,66,65,63, 62,60,54,53,50,49,48,48,48,48,43,41,40,40,39,38,35,34,32,31,29, 28,25,23,23,22,21,20,20 }; const int n1c1w2_g[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,99,94,91,90,88,86,85,85,83,82,80,79,77,73,71,71,71,67,65, 65,58,57,57,55,53,52,51,45,40,39,39,38,38,38,37,36,36,35,35,32, 29,28,27,27,27,24,23,21,20 }; const int n1c1w2_h[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,100,96,95,95,92,92,92,91,90,90,89,89,86,84,83,81,78,76,73, 73,73,71,71,67,66,61,60,59,57,54,54,44,42,42,38,36,33,31,31,28, 28,27,27,27,27,26,25,21,20 }; const int n1c1w2_i[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,100,98,97,96,94,93,93,85,85,84,83,83,83,82,79,76,76,76,75, 74,73,73,72,68,66,60,60,56,55,53,52,49,47,46,45,42,41,38,37,37, 37,36,32,31,31,31,28,24,21 }; const int n1c1w2_j[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,99,98,95,93,90,87,85,84,84,83,83,81,81,80,79,75,75,71,70, 68,67,63,63,62,62,61,58,56,51,51,50,49,48,48,42,40,39,37,37,36, 34,32,30,29,28,28,27,26,26 }; const int n1c1w2_k[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,99,98,97,97,96,95,94,92,89,89,87,85,77,76,73,71,69,68,68, 67,66,66,65,64,64,63,62,58,58,52,50,49,48,47,46,44,43,43,35,35, 32,29,26,26,25,25,23,20,20 }; const int n1c1w2_l[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 98,95,94,93,92,91,89,88,87,87,84,82,82,74,73,73,72,69,65,64,63, 63,62,62,60,59,57,54,54,52,48,47,46,44,43,41,35,33,30,30,30,29, 29,28,28,27,27,26,24,23 }; const int n1c1w2_m[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 99,95,90,89,89,85,82,80,80,79,79,79,77,74,70,70,66,65,65,64,57, 56,56,55,55,55,53,52,50,49,48,47,45,42,40,37,36,36,36,32,31,31, 31,31,30,28,28,25,22,20 }; const int n1c1w2_n[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 98,96,95,85,84,84,83,82,81,80,78,76,76,74,72,72,71,71,69,66,65, 64,64,62,61,60,56,53,52,52,49,48,47,45,43,43,42,40,40,40,39,37, 32,30,28,26,21,21,21,20 }; const int n1c1w2_o[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,100,100,96,95,93,86,82,82,80,79,75,73,71,71,70,69,69,68,63, 60,59,58,56,53,52,50,45,44,44,43,42,37,37,36,36,35,31,30,30,29, 28,28,27,27,22,21,21,20,20 }; const int n1c1w2_p[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,96,95,95,95,93,92,87,87,83,83,82,79,78,77,76,76,76,72,71, 69,69,68,64,63,60,57,55,54,54,51,50,46,42,41,40,40,38,38,37,31, 30,30,29,28,27,26,26,22,20 }; const int n1c1w2_q[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 97,96,96,93,93,93,91,88,86,86,85,85,85,82,81,78,75,74,71,71,69, 67,67,65,65,65,64,61,61,60,58,58,56,54,53,49,45,44,43,40,38,38, 38,34,33,31,30,26,23,23 }; const int n1c1w2_r[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 98,97,97,97,94,91,89,85,84,82,81,80,79,79,75,73,70,69,69,69,68, 68,68,66,61,55,54,52,52,51,51,49,49,48,47,47,47,45,44,37,37,36, 35,34,34,30,29,29,27,24 }; const int n1c1w2_s[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 99,99,98,96,95,93,92,91,91,91,88,86,84,84,84,80,80,79,78,77,76, 76,73,72,71,71,69,68,67,64,64,61,59,58,54,52,49,49,41,40,38,31, 31,29,28,27,27,27,22,20 }; const int n1c1w2_t[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,100,100,97,96,92,91,91,89,86,85,84,83,83,82,81,79,79,77,74, 74,73,73,70,68,67,67,65,63,62,62,55,55,52,50,47,45,44,44,44,44, 43,41,39,37,32,30,26,24,23 }; const int n1c1w4_a[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 99,95,93,92,91,89,89,88,88,85,84,84,84,80,80,79,77,76,72,69,65, 64,64,63,63,60,56,56,53,53,52,51,50,50,49,49,47,44,41,41,40,40, 40,35,35,34,32,31,31,30 }; const int n1c1w4_b[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,100,98,97,97,94,92,92,91,85,84,84,83,82,82,80,78,78,78,78, 75,74,73,72,71,70,70,68,66,65,65,54,50,50,50,49,49,49,47,44,44, 42,42,41,41,41,40,36,36,30 }; const int n1c1w4_c[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 94,92,89,88,88,87,86,84,82,82,81,79,77,77,77,76,73,72,70,69,68, 68,65,63,63,61,59,58,57,55,54,52,52,52,51,48,46,43,40,38,37,37, 36,35,35,35,34,34,34,33 }; const int n1c1w4_d[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,97,95,95,95,95,94,93,93,91,90,89,87,83,82,79,79,78,77,77, 74,71,69,68,68,65,65,64,61,58,55,55,54,53,53,51,51,49,46,44,42, 41,39,38,37,37,37,35,33,31 }; const int n1c1w4_e[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,99,94,92,92,92,89,88,85,83,83,80,79,79,79,79,77,74,74,73, 71,70,69,68,65,62,62,62,61,61,58,56,56,55,55,55,48,47,46,46,44, 43,43,43,40,40,36,35,32,30 }; const int n1c1w4_f[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 98,98,93,93,92,91,89,86,85,84,80,80,79,78,76,70,68,67,66,62,60, 59,59,58,58,53,52,52,50,50,49,48,48,48,47,45,43,41,41,40,40,40, 35,33,32,31,31,30,30,30 }; const int n1c1w4_g[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,100,100,99,97,95,95,95,93,93,91,90,87,87,86,85,85,84,84,84, 82,80,77,76,72,70,67,66,65,64,59,56,55,52,48,46,45,44,41,38,37, 35,35,34,34,33,33,32,32,31 }; const int n1c1w4_h[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,100,99,98,98,97,96,92,91,91,91,87,86,85,83,83,81,79,78,78, 75,75,75,74,73,73,70,66,66,65,64,64,63,62,61,60,59,56,55,54,46, 45,44,41,37,35,34,32,31,30 }; const int n1c1w4_i[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 95,92,91,91,90,88,87,87,86,86,85,81,79,76,76,76,72,72,69,65,63, 63,63,63,61,61,59,59,58,56,54,54,52,51,50,47,47,45,45,45,43,40, 40,36,35,35,34,32,32,31 }; const int n1c1w4_j[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 99,98,93,93,92,90,88,87,87,83,83,81,78,77,77,77,76,75,73,73,71, 68,66,64,63,63,63,62,60,59,58,54,53,52,52,51,49,47,47,42,42,41, 40,40,40,39,35,32,32,31 }; const int n1c1w4_k[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,98,95,94,94,94,93,92,87,85,85,84,83,82,81,78,78,75,73,72, 71,71,70,70,68,67,67,66,65,64,60,59,58,57,56,56,56,55,55,54,51, 49,46,45,43,43,43,37,36,35 }; const int n1c1w4_l[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,99,98,98,97,96,95,91,91,90,88,88,87,86,81,80,79,76,75,67, 66,65,65,64,60,59,59,58,57,57,55,53,53,50,49,49,49,46,44,43,42, 38,37,37,36,35,34,34,31,30 }; const int n1c1w4_m[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,99,99,94,93,92,91,89,88,88,87,80,79,77,75,74,73,71,71,71, 69,66,64,64,64,63,63,63,62,60,60,59,59,59,55,55,55,53,51,49,49, 48,46,46,45,42,42,34,33,31 }; const int n1c1w4_n[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 99,97,97,96,96,95,94,93,92,90,86,85,85,84,82,82,82,80,79,75,73, 72,72,71,70,69,69,68,68,66,65,63,61,60,57,55,53,49,48,47,44,41, 41,39,36,34,32,31,31,31 }; const int n1c1w4_o[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,90,89,89,89,87,84,81,80,77,77,77,74,71,71,71,67,66,65,63, 62,61,60,59,59,57,56,56,54,54,51,51,49,48,48,47,47,46,40,39,37, 36,36,35,34,34,33,32,31,30 }; const int n1c1w4_p[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 99,98,95,95,93,93,90,88,87,87,85,83,82,80,79,79,79,77,74,74,73, 73,72,71,70,66,63,61,61,61,60,60,59,57,55,54,51,48,45,43,42,39, 39,37,37,36,36,35,32,32 }; const int n1c1w4_q[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 95,94,92,91,91,91,90,89,89,84,84,82,79,74,74,74,70,69,68,67,63, 62,59,59,57,56,56,55,53,52,51,50,50,49,48,48,47,45,43,42,41,41, 41,40,38,35,35,32,31,30 }; const int n1c1w4_r[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 100,99,98,97,95,94,93,93,93,92,92,92,92,85,85,83,81,79,77,76, 75,73,71,70,70,69,66,63,60,60,59,59,58,58,57,49,48,47,45,42,41, 41,40,38,38,36,36,35,34,30 }; const int n1c1w4_s[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 99,99,98,97,97,94,94,93,91,90,87,87,86,85,85,81,80,78,78,77,76, 72,66,66,64,59,58,57,57,53,52,50,50,50,48,48,47,46,43,40,39,37, 37,36,36,35,33,32,30,30 }; const int n1c1w4_t[] = { 100, // Capacity 50, // Number of items // Size of items (sorted) 98,96,94,87,86,85,83,81,80,79,77,77,76,75,72,70,69,69,69,68,68, 68,68,67,67,66,65,65,63,62,60,60,60,59,58,56,53,53,52,52,50,50, 49,45,45,44,39,36,32,30 }; const int n1c2w1_a[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,97,96,92,89,88,88,87,83,75,75,72,71,70,69,66,63,62,62,61, 60,58,50,47,46,40,40,37,36,32,31,30,28,27,27,26,24,18,16,14,13, 12,10,10,10,8,7,5,4,2 }; const int n1c2w1_b[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 99,96,96,96,95,95,94,90,90,88,87,84,82,78,77,77,77,75,75,70,70, 69,68,56,54,53,53,50,50,49,48,47,45,38,36,35,34,28,25,21,19,18, 16,13,13,7,7,6,3,3 }; const int n1c2w1_c[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,97,96,92,89,86,83,83,82,79,77,76,73,73,70,69,69,61,60,60, 60,58,56,56,53,51,49,48,48,48,47,46,42,41,36,35,34,32,32,32,31, 22,17,12,12,6,6,5,3,2 }; const int n1c2w1_d[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 98,96,96,87,87,87,86,85,83,83,82,81,77,74,67,65,64,64,63,60,57, 57,56,55,50,49,46,43,43,42,37,33,31,31,27,27,26,25,23,23,19,18, 15,13,10,9,6,3,2,1 }; const int n1c2w1_e[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 94,92,89,89,87,82,82,81,80,80,78,71,70,67,66,63,58,52,50,48,46, 36,34,33,31,30,27,26,21,21,20,19,18,18,17,12,11,11,11,11,10,10, 7,7,7,6,5,5,4,3 }; const int n1c2w1_f[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 99,95,95,94,91,90,89,84,82,81,78,78,77,73,72,69,62,60,59,58,56, 56,52,52,51,48,48,47,47,45,43,42,38,32,32,31,28,28,28,26,23,21, 20,18,14,12,8,3,2,1 }; const int n1c2w1_g[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,100,99,96,96,95,94,90,88,84,81,79,76,70,67,65,60,60,57,57, 56,52,47,45,44,42,39,37,36,36,35,31,31,28,27,27,25,19,18,17,14, 14,12,9,9,9,9,3,2,1 }; const int n1c2w1_h[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 99,97,94,94,90,90,87,83,82,81,79,77,76,76,75,74,72,67,66,65,63, 59,59,55,51,50,50,49,47,41,41,39,38,38,37,37,35,34,33,33,21,20, 18,15,14,9,8,3,1,1 }; const int n1c2w1_i[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,100,89,89,89,89,88,87,81,78,78,77,76,75,74,73,70,70,69,66, 66,64,64,64,63,61,60,58,54,52,51,50,49,48,48,48,46,45,45,43,40, 39,35,34,33,24,9,4,4,1 }; const int n1c2w1_j[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 99,98,96,96,95,92,91,89,88,87,86,84,82,82,79,79,78,77,75,72,69, 66,64,63,61,60,56,55,54,54,49,49,48,44,44,44,41,41,39,27,23,22, 22,21,15,13,7,5,3,1 }; const int n1c2w1_k[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 97,96,96,94,94,91,88,87,85,81,81,77,74,74,74,71,69,68,68,66,65, 63,60,59,57,57,46,46,45,45,44,43,41,37,35,35,32,30,28,27,25,23, 23,19,18,16,14,14,10,8 }; const int n1c2w1_l[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 98,98,98,97,97,93,92,91,90,89,89,82,82,77,76,75,74,74,73,63,62, 62,61,60,56,51,49,49,47,47,45,44,43,42,39,37,33,33,32,28,25,21, 20,19,11,11,6,3,2,1 }; const int n1c2w1_m[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,99,98,98,95,93,92,89,80,80,78,77,77,73,72,71,71,71,70,70, 67,66,66,65,64,60,59,53,50,48,48,47,47,45,39,38,37,33,33,28,27, 19,15,14,14,12,9,9,9,1 }; const int n1c2w1_n[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 93,87,85,85,82,79,76,75,70,70,69,69,68,67,66,64,62,61,59,58,58, 57,56,56,55,53,53,49,45,45,43,42,40,30,30,24,24,22,22,21,20,18, 18,14,13,11,9,9,6,3 }; const int n1c2w1_o[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 99,86,83,83,78,76,68,59,58,58,54,53,53,51,51,48,47,45,43,40,37, 32,32,32,32,31,31,28,24,22,20,19,19,19,19,15,14,13,12,12,11,10, 10,10,10,6,5,4,2,1 }; const int n1c2w1_p[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 97,96,94,94,93,80,79,78,77,77,76,76,72,72,71,70,67,67,63,60,59, 55,54,52,51,49,48,47,46,43,34,32,28,27,27,26,25,23,22,20,17,14, 13,12,12,10,5,4,3,2 }; const int n1c2w1_q[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 98,96,95,91,91,90,88,87,83,83,77,74,73,72,72,70,70,67,66,66,63, 60,59,58,58,57,56,55,54,45,45,41,31,31,29,26,24,21,18,16,16,15, 14,14,9,9,8,8,6,2 }; const int n1c2w1_r[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,99,98,96,95,95,92,91,87,85,85,84,78,78,77,76,74,69,68,67, 65,64,62,55,52,45,43,41,40,38,33,29,27,27,26,24,24,24,23,22,22, 21,14,13,12,10,8,2,1,1 }; const int n1c2w1_s[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 97,93,92,90,87,83,82,82,80,80,78,78,72,71,68,67,63,62,60,59,56, 56,55,54,54,51,50,48,46,45,42,41,35,32,32,28,26,25,25,25,24,22, 21,21,14,12,10,9,9,7 }; const int n1c2w1_t[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,93,93,89,89,87,81,81,79,78,77,70,68,67,66,66,65,64,62,61, 60,57,53,53,52,52,52,48,44,44,43,43,42,41,39,39,37,35,34,30,30, 29,26,25,16,16,10,10,7,6 }; const int n1c2w2_a[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,97,97,95,93,87,87,86,82,82,78,76,76,75,74,71,68,66,65,63, 59,59,58,58,57,52,51,46,46,46,43,42,42,41,41,41,38,37,36,36,32, 32,31,30,27,25,22,22,22,21 }; const int n1c2w2_b[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,98,98,97,95,94,90,90,89,86,85,83,81,79,79,74,72,72,71,68, 67,65,64,64,62,59,58,56,55,55,54,51,51,50,47,46,45,44,43,40,36, 34,33,31,29,28,27,27,26,21 }; const int n1c2w2_c[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,98,97,95,93,91,90,87,85,83,83,81,81,79,76,74,74,73,73,71, 71,70,67,67,66,62,62,60,57,54,54,53,52,51,51,50,49,48,48,45,44, 44,40,36,34,32,31,27,26,20 }; const int n1c2w2_d[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 99,98,98,97,96,90,88,86,82,82,80,79,76,76,76,74,69,67,66,64,62, 59,55,52,51,51,50,49,44,43,41,41,41,41,41,37,35,33,32,32,31,31, 31,30,29,23,23,22,20,20 }; const int n1c2w2_e[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,99,99,99,99,98,98,94,93,92,92,89,89,89,84,83,80,80,78,77, 75,74,74,70,70,68,68,66,63,62,60,59,58,58,58,55,54,53,52,49,42, 41,36,35,35,31,26,23,22,20 }; const int n1c2w2_f[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,100,99,99,98,91,90,84,83,81,78,78,75,73,72,72,71,70,68,66, 62,59,58,58,57,54,53,53,51,51,51,51,48,45,45,42,42,39,37,37,35, 32,31,31,26,26,25,21,21,20 }; const int n1c2w2_g[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,97,94,93,93,91,89,89,86,85,85,82,81,80,80,80,80,79,77,75, 74,72,67,67,63,62,59,58,58,57,54,54,53,51,48,47,46,44,44,41,41, 39,36,35,33,32,32,29,28,24 }; const int n1c2w2_h[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 99,98,93,93,91,88,85,82,80,78,76,70,68,67,66,65,61,61,57,56,56, 53,52,52,52,51,48,47,46,44,43,43,43,41,41,41,37,37,36,36,35,33, 33,32,31,27,26,22,22,21 }; const int n1c2w2_i[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 96,92,92,91,91,90,89,88,83,83,81,79,77,76,76,71,70,68,68,66,63, 63,63,62,60,60,58,57,53,53,52,52,49,47,45,44,41,38,37,34,33,32, 31,29,27,26,25,23,21,21 }; const int n1c2w2_j[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,98,96,95,95,93,91,89,89,88,88,81,80,78,73,72,69,67,64,61, 60,54,52,52,51,50,50,49,49,47,46,44,43,42,41,40,40,39,36,33,33, 28,26,26,25,23,22,22,22,20 }; const int n1c2w2_k[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 97,97,95,91,91,89,85,85,82,82,81,75,74,73,70,70,70,69,68,67,67, 67,65,63,63,63,62,61,60,60,55,48,46,45,45,45,45,44,43,43,42,41, 39,37,36,30,28,22,22,22 }; const int n1c2w2_l[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 96,95,93,92,90,87,87,86,86,86,85,84,83,82,78,78,78,78,77,76,76, 72,72,71,70,68,65,65,62,59,58,51,42,42,40,38,38,36,34,34,33,32, 30,29,29,27,26,25,24,23 }; const int n1c2w2_m[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,99,99,99,97,95,95,94,93,92,92,88,86,86,86,84,79,78,78,77, 76,69,68,65,61,60,58,57,57,55,54,54,53,53,52,52,51,48,47,43,43, 40,39,38,36,34,33,28,27,25 }; const int n1c2w2_n[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 99,97,95,94,88,87,85,83,82,78,75,72,71,71,70,69,67,67,65,64,63, 62,59,59,58,58,58,58,58,54,53,53,52,49,49,48,45,45,44,43,43,42, 40,38,36,34,30,30,24,20 }; const int n1c2w2_o[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,99,98,96,94,90,89,88,88,86,84,81,81,80,79,79,78,76,72,72, 72,68,68,65,63,63,63,62,62,57,57,55,48,48,47,45,44,44,41,39,36, 33,31,30,28,26,25,24,22,20 }; const int n1c2w2_p[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 94,93,91,90,90,88,87,82,77,75,72,71,70,70,69,69,66,65,63,59,57, 56,53,51,48,48,48,47,44,44,43,42,41,40,39,38,37,36,36,32,31,31, 29,29,27,23,23,21,20,20 }; const int n1c2w2_q[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 96,96,91,90,89,86,86,84,83,83,82,82,82,82,79,75,73,72,71,69,68, 67,67,66,65,63,62,61,59,59,59,59,58,56,56,55,54,53,50,45,41,39, 35,33,29,25,24,21,20,20 }; const int n1c2w2_r[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 99,98,96,91,88,88,86,86,82,82,81,78,77,77,76,76,72,72,70,68,67, 64,61,60,59,56,55,49,48,47,47,46,44,43,43,42,40,40,39,38,35,34, 30,30,29,27,26,21,20,20 }; const int n1c2w2_s[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,94,94,92,91,87,87,85,82,78,76,75,72,72,72,69,61,61,61,61, 61,56,55,54,53,51,51,50,47,44,44,44,44,42,42,39,38,36,34,33,33, 32,31,30,29,28,26,25,23,23 }; const int n1c2w2_t[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,96,96,91,84,83,83,83,81,81,80,80,77,77,72,70,70,68,68,67, 65,64,63,62,60,59,58,51,51,50,49,47,47,47,46,45,43,43,41,38,37, 36,35,31,31,29,28,27,26,20 }; const int n1c2w4_a[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,99,97,97,96,96,95,92,92,90,90,88,87,87,85,84,83,82,81,79, 74,68,68,63,59,58,56,55,55,51,50,49,49,49,47,44,44,42,39,37,37, 34,34,34,33,33,31,30,30,30 }; const int n1c2w4_b[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 99,96,94,93,93,91,87,87,87,84,84,83,83,83,83,83,82,81,81,78,77, 77,77,76,67,65,61,61,59,58,53,53,50,49,48,47,47,46,46,44,43,42, 41,41,38,35,34,32,32,31 }; const int n1c2w4_c[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,100,99,96,96,93,91,90,90,87,84,83,80,80,80,75,74,72,72,71, 71,70,69,66,65,63,60,58,57,56,54,54,53,53,53,51,51,49,46,43,40, 39,38,37,37,34,33,33,31,31 }; const int n1c2w4_d[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 97,97,96,94,93,91,89,89,86,83,79,78,77,77,77,75,75,74,71,68,68, 67,65,63,61,61,58,57,56,54,48,46,44,43,41,41,40,38,36,36,35,35, 35,35,35,34,33,33,33,31 }; const int n1c2w4_e[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,99,99,97,97,96,96,96,93,93,91,84,83,81,79,78,77,74,71,67, 66,63,62,61,61,61,59,59,59,58,57,56,54,54,53,53,51,50,49,48,45, 45,45,40,40,39,39,34,32,30 }; const int n1c2w4_f[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 99,98,98,97,96,93,88,86,86,85,85,81,80,80,77,76,74,73,73,72,69, 69,67,66,66,65,64,63,63,62,60,59,59,59,54,54,51,49,49,46,43,43, 38,38,38,38,36,36,35,33 }; const int n1c2w4_g[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,99,99,97,95,93,91,91,90,90,88,88,87,86,82,80,79,75,70,69, 68,66,66,64,62,62,61,60,60,57,56,55,53,51,47,46,44,42,38,37,36, 36,36,36,35,35,32,32,31,31 }; const int n1c2w4_h[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 99,98,97,95,94,93,93,93,92,91,91,89,86,85,81,77,74,70,69,68,67, 66,66,65,63,62,61,60,59,58,57,57,56,56,52,50,49,48,47,43,43,43, 40,39,37,36,36,35,30,30 }; const int n1c2w4_i[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 97,92,91,88,87,86,85,85,84,84,84,83,80,80,79,78,76,76,76,76,75, 75,75,74,74,74,72,71,71,70,67,63,59,59,57,55,55,54,50,49,44,42, 40,38,37,35,31,31,30,30 }; const int n1c2w4_j[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,97,96,90,86,84,83,82,79,78,76,74,72,70,70,70,68,68,67,67, 66,66,66,65,64,64,63,63,62,59,57,57,57,55,54,54,51,49,48,47,43, 41,40,40,37,37,34,33,32,32 }; const int n1c2w4_k[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,100,100,99,98,93,91,89,88,87,84,82,80,80,78,78,77,77,77,76, 75,75,73,71,71,70,65,61,61,60,59,58,58,55,53,52,51,49,49,44,43, 42,40,40,40,39,38,38,32,32 }; const int n1c2w4_l[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 99,99,98,98,94,93,92,90,90,89,89,88,84,81,79,78,77,77,76,75,74, 72,72,70,69,66,64,63,60,57,57,56,54,52,47,45,43,43,43,41,40,39, 39,38,37,37,36,35,34,30 }; const int n1c2w4_m[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 99,99,99,97,95,94,92,91,90,90,90,90,88,83,79,78,78,76,76,70,68, 67,66,63,62,62,61,60,58,58,58,58,56,56,55,54,53,51,50,48,48,47, 42,37,37,37,36,32,31,30 }; const int n1c2w4_n[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 98,96,93,92,91,91,91,90,90,90,89,89,88,88,84,82,77,76,76,75,74, 73,72,69,69,66,65,59,59,58,57,56,54,53,52,52,51,51,49,48,47,47, 46,42,41,40,39,36,35,33 }; const int n1c2w4_o[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,97,94,93,91,91,86,84,83,78,78,78,77,77,77,77,75,74,74,73, 71,69,68,64,64,62,62,61,57,54,54,53,50,49,49,48,47,47,47,46,45, 45,44,44,42,40,39,35,35,35 }; const int n1c2w4_p[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 98,98,95,95,93,91,91,89,89,87,83,83,82,78,77,76,75,74,72,67,62, 61,59,57,55,55,54,52,50,49,49,48,47,47,45,45,44,44,43,43,42,40, 39,39,38,37,36,33,33,31 }; const int n1c2w4_q[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,98,98,98,91,90,90,88,87,87,87,86,86,83,82,81,80,80,76,73, 72,71,71,70,69,68,68,67,67,66,65,64,60,54,53,52,52,47,46,46,46, 41,40,37,37,36,36,35,34,33 }; const int n1c2w4_r[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 100,99,99,98,95,95,95,94,90,87,87,86,85,85,83,82,80,79,79,76, 73,73,72,71,70,69,69,68,68,66,65,63,63,62,58,57,56,55,54,53,52, 49,47,46,46,43,42,35,34,31 }; const int n1c2w4_s[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 98,98,93,93,93,92,92,92,92,90,89,86,86,85,85,84,83,83,83,81,81, 78,77,77,75,74,71,70,70,68,66,66,65,65,63,62,61,61,59,57,50,50, 49,49,47,44,40,32,31,30 }; const int n1c2w4_t[] = { 120, // Capacity 50, // Number of items // Size of items (sorted) 97,95,91,89,88,87,86,83,82,82,81,73,73,69,69,68,68,68,65,62,61, 60,60,60,58,58,58,56,55,54,54,52,51,51,51,49,49,47,45,44,43,42, 42,41,41,40,36,33,30,30 }; const int n1c3w1_a[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,100,96,94,90,88,87,85,83,81,80,80,77,74,65,62,62,62,61,59, 59,57,54,51,45,45,40,38,37,37,37,36,29,29,27,26,22,22,21,17,14, 14,8,7,6,5,5,3,3,1 }; const int n1c3w1_b[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 95,88,88,86,85,84,84,82,81,79,72,71,69,69,69,68,68,65,61,61,61, 61,60,58,57,57,53,44,43,36,29,29,27,23,23,22,21,17,14,14,14,13, 12,11,11,6,5,3,3,2 }; const int n1c3w1_c[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,99,95,94,87,85,85,83,81,81,80,80,77,76,75,74,73,73,72,66, 63,60,52,50,47,45,44,43,39,39,38,38,35,34,33,32,25,25,23,20,17, 15,15,14,12,11,10,10,8,8 }; const int n1c3w1_d[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 99,96,95,95,92,91,90,86,86,86,85,80,77,77,76,76,71,70,70,69,68, 64,64,61,60,60,56,55,53,52,50,48,44,41,40,38,38,37,35,21,19,14, 12,9,6,6,6,4,3,2 }; const int n1c3w1_e[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 99,97,97,96,95,89,88,83,81,81,79,77,76,75,74,61,55,51,50,50,48, 48,47,46,45,42,42,38,35,34,32,32,31,26,25,21,14,13,11,10,9,9, 9,8,8,7,5,5,5,1 }; const int n1c3w1_f[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,98,97,96,95,93,92,88,88,86,84,83,80,80,78,77,76,76,76,74, 73,70,69,68,65,64,63,62,62,61,60,60,53,51,51,42,41,28,26,23,22, 21,16,13,9,9,7,5,2,2 }; const int n1c3w1_g[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 97,92,91,91,88,86,85,84,79,76,75,67,66,65,62,61,61,58,54,54,50, 47,46,45,44,44,42,37,37,30,27,27,26,23,23,21,20,20,19,13,12,11, 10,9,9,6,5,5,5,1 }; const int n1c3w1_h[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 99,91,89,89,89,88,86,85,83,82,80,80,80,80,78,76,73,69,67,66,65, 65,64,64,60,60,57,56,56,52,51,45,43,42,42,38,37,32,32,32,29,28, 26,25,18,15,10,6,6,4 }; const int n1c3w1_i[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,98,97,95,87,87,87,84,80,77,76,73,71,66,66,62,61,60,60,60, 57,56,53,52,51,49,46,44,44,43,43,38,33,31,30,29,29,28,24,22,18, 17,16,16,16,15,12,8,3,2 }; const int n1c3w1_j[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 99,98,92,91,90,88,87,86,82,80,77,74,73,72,72,71,69,69,63,61,55, 54,53,50,48,48,48,37,37,37,34,33,32,29,26,22,19,17,15,14,10,9, 7,3,3,2,2,2,1,1 }; const int n1c3w1_k[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,96,95,94,94,92,92,90,86,84,77,73,66,66,59,56,56,56,55,54, 53,53,53,52,49,48,47,45,45,45,41,41,41,37,36,24,22,21,20,18,16, 15,14,14,13,12,10,8,4,1 }; const int n1c3w1_l[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 99,99,93,93,90,90,87,87,81,81,80,78,77,76,68,64,63,62,60,60,59, 58,53,52,52,47,45,44,44,42,39,39,36,35,29,29,28,26,25,18,9,7, 7,7,7,6,5,5,5,1 }; const int n1c3w1_m[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,100,99,94,90,88,88,86,86,84,84,80,77,73,70,69,69,66,66,61, 58,58,57,57,52,51,47,44,43,42,36,34,28,27,26,25,21,18,18,17,13, 12,12,12,11,9,8,7,4,4 }; const int n1c3w1_n[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 98,97,91,90,90,90,88,87,87,85,83,81,79,78,78,76,74,74,73,72,68, 66,64,63,61,57,56,56,56,55,55,48,48,46,44,44,39,37,35,35,34,32, 31,29,27,26,19,18,17,11 }; const int n1c3w1_o[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 96,96,96,94,94,87,86,84,84,83,82,82,80,77,75,57,57,56,55,54,52, 51,48,48,48,46,46,45,42,34,34,34,32,32,30,23,16,16,16,15,15,14, 12,10,6,6,3,1,1,1 }; const int n1c3w1_p[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 99,99,98,98,96,93,93,92,91,89,85,82,80,79,78,73,73,71,70,69,69, 61,61,55,54,52,47,47,46,43,43,42,41,38,36,35,34,28,27,25,24,21, 17,13,10,9,6,5,5,2 }; const int n1c3w1_q[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,100,100,100,98,96,95,93,90,89,86,86,85,85,84,81,79,78,74, 70,69,68,66,62,62,61,58,56,55,54,53,51,48,44,42,40,36,35,33,32, 31,24,23,23,18,13,12,4,4,2 }; const int n1c3w1_r[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,99,97,97,97,95,94,91,88,87,87,86,86,86,82,77,77,75,74,73, 72,71,70,65,63,62,60,59,56,56,51,50,50,49,49,47,47,46,36,29,23, 23,21,20,18,16,13,11,9,3 }; const int n1c3w1_s[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 95,90,88,87,86,83,79,78,76,75,71,70,70,68,64,63,63,61,59,58,57, 57,53,52,52,49,44,40,36,36,32,29,25,23,23,22,22,20,19,19,19,17, 16,11,11,7,6,5,3,2 }; const int n1c3w1_t[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 98,98,97,96,93,93,92,89,83,82,76,76,76,74,70,69,67,66,66,65,62, 60,58,56,56,55,55,54,53,51,49,47,42,35,31,31,26,22,22,22,18,17, 17,17,16,9,8,5,4,4 }; const int n1c3w2_a[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,96,94,93,91,91,91,88,84,83,80,78,78,76,75,74,72,72,70,65, 61,60,56,52,51,51,48,46,45,38,38,37,37,37,36,35,35,32,32,31,30, 29,29,28,27,27,23,23,22,21 }; const int n1c3w2_b[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 98,96,95,94,92,89,88,88,87,87,86,85,83,80,80,77,76,76,73,72,71, 69,69,69,57,57,53,50,45,45,44,44,43,42,37,36,36,35,35,34,33,31, 30,27,24,24,23,21,20,20 }; const int n1c3w2_c[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 98,98,96,95,94,93,92,91,89,88,88,88,86,83,83,82,80,79,78,76,76, 75,73,67,63,63,62,55,54,53,52,51,51,51,47,45,45,42,42,40,37,37, 36,36,29,29,25,24,20,20 }; const int n1c3w2_d[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,99,98,96,94,92,90,89,89,89,87,86,81,80,78,77,74,74,72,72, 63,62,60,60,55,55,54,53,50,50,46,46,45,42,42,41,38,35,34,33,33, 32,28,28,27,26,23,21,21,20 }; const int n1c3w2_e[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,100,99,96,95,94,92,92,90,89,89,84,82,80,80,79,74,74,72,71, 69,67,67,64,62,60,60,59,58,55,51,48,47,46,45,43,42,41,41,40,38, 34,33,32,27,26,24,24,23,20 }; const int n1c3w2_f[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,99,99,98,97,96,93,91,89,86,85,82,78,76,75,74,73,71,68,68, 66,65,65,64,63,63,63,63,63,62,60,59,56,55,55,53,51,50,48,45,43, 43,42,42,39,39,35,31,27,26 }; const int n1c3w2_g[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 98,98,98,96,93,93,92,91,90,90,87,87,86,85,83,82,81,78,78,75,75, 74,74,72,72,71,70,69,68,66,61,60,60,59,57,53,51,42,40,40,35,34, 34,31,30,30,24,22,21,20 }; const int n1c3w2_h[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 99,98,98,97,97,95,94,93,91,91,88,87,82,80,80,79,79,79,75,74,73, 72,71,69,68,66,63,63,61,60,58,58,55,54,53,53,52,50,46,45,44,42, 40,38,37,35,29,24,24,20 }; const int n1c3w2_i[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 96,95,91,89,87,86,85,81,78,78,68,67,66,66,65,62,61,60,60,59,58, 56,54,51,50,50,49,49,49,48,47,46,46,46,45,45,44,41,41,41,40,36, 35,34,33,32,31,27,26,26 }; const int n1c3w2_j[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 99,96,95,95,94,93,93,92,91,91,90,89,87,86,86,84,81,80,73,68,66, 64,62,61,61,59,59,56,55,54,49,48,48,47,46,45,45,43,42,41,41,40, 39,37,36,34,32,26,24,20 }; const int n1c3w2_k[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 95,94,93,93,91,89,89,89,88,85,82,82,78,78,77,76,73,73,73,70,70, 70,70,69,68,66,63,62,59,55,55,53,51,49,42,42,41,41,40,38,35,32, 31,30,30,28,28,24,23,23 }; const int n1c3w2_l[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 99,99,98,98,97,95,92,92,87,85,84,83,80,78,77,75,73,73,69,68,66, 63,63,63,59,57,56,56,53,53,51,50,50,48,48,46,46,44,43,42,39,37, 34,32,29,25,24,22,22,21 }; const int n1c3w2_m[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,99,96,94,92,91,91,89,85,84,81,81,79,79,78,77,76,75,74,73, 67,65,64,63,63,59,57,57,54,52,51,49,49,47,46,46,44,44,43,43,40, 38,34,33,32,31,30,29,25,22 }; const int n1c3w2_n[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 98,95,95,91,91,89,89,88,88,87,86,84,83,82,80,79,78,75,74,74,73, 72,72,70,70,68,68,67,65,59,58,58,57,55,54,53,51,42,41,39,37,36, 35,34,32,25,25,21,21,20 }; const int n1c3w2_o[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 99,99,96,93,88,83,82,80,79,79,77,77,75,75,73,73,72,71,71,71,71, 69,69,67,62,62,61,58,58,56,54,53,52,49,46,45,45,41,40,39,35,35, 34,33,31,27,27,26,22,21 }; const int n1c3w2_p[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 95,94,88,88,88,86,85,84,83,79,73,72,72,72,71,70,64,63,61,58,55, 53,53,52,51,51,51,48,48,46,45,40,39,38,36,36,35,33,32,28,25,24, 24,23,23,23,22,22,20,20 }; const int n1c3w2_q[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 96,91,87,86,84,83,83,83,81,80,79,74,72,70,70,67,62,61,60,59,58, 56,55,55,54,52,51,51,51,50,49,48,44,43,43,42,40,39,38,34,34,34, 33,32,31,31,29,29,22,21 }; const int n1c3w2_r[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,98,91,87,82,78,77,77,77,75,75,74,72,72,72,70,70,66,66,65, 63,63,62,59,57,56,55,53,52,51,49,48,47,46,46,44,44,42,36,35,34, 34,31,30,29,26,23,22,21,20 }; const int n1c3w2_s[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,99,97,96,96,95,94,91,90,88,85,83,83,81,79,79,78,77,77,74, 72,70,69,66,64,63,63,61,58,56,52,51,45,42,36,36,36,35,34,33,32, 32,31,30,28,25,24,21,21,20 }; const int n1c3w2_t[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,99,96,95,93,91,91,88,87,87,85,85,85,84,83,83,78,77,76,75, 74,70,67,65,63,63,62,60,60,58,56,55,55,54,52,50,49,49,45,42,29, 29,27,27,26,25,24,23,22,20 }; const int n1c3w4_a[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 97,95,92,91,90,90,86,85,85,82,82,81,80,79,78,76,71,70,69,67,63, 63,63,62,58,58,56,55,54,53,52,51,51,48,47,46,44,44,42,42,41,40, 39,39,37,35,34,32,31,31 }; const int n1c3w4_b[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,98,97,97,92,92,92,91,88,84,83,82,77,77,76,75,74,73,72,70, 70,67,66,65,63,62,62,62,62,58,57,57,54,53,52,52,50,46,45,43,42, 41,41,41,40,37,37,36,33,33 }; const int n1c3w4_c[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 99,99,95,94,92,91,90,87,86,84,83,82,82,81,81,81,80,80,78,78,78, 77,77,74,72,71,69,68,66,66,64,63,62,62,61,60,57,55,52,52,46,46, 45,45,42,39,39,38,35,32 }; const int n1c3w4_d[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,96,93,90,88,88,86,85,84,84,83,83,80,80,79,77,77,74,70,68, 67,64,61,61,58,58,58,56,54,54,53,51,49,48,47,45,45,44,43,41,41, 40,40,37,36,34,34,33,33,31 }; const int n1c3w4_e[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 98,97,96,95,95,94,93,93,93,93,91,90,87,87,80,80,80,77,72,71,68, 68,67,64,63,62,60,60,60,57,57,56,54,53,53,52,49,47,45,43,41,41, 39,38,38,37,37,36,35,31 }; const int n1c3w4_f[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 95,92,92,89,88,87,85,84,83,82,82,81,81,81,76,76,73,72,69,68,68, 67,65,65,63,63,61,61,57,56,54,54,54,52,50,50,49,47,46,40,40,39, 39,39,37,37,34,33,32,30 }; const int n1c3w4_g[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 99,99,97,97,96,92,90,88,87,87,87,86,86,85,85,83,81,79,78,77,77, 74,73,73,73,72,68,65,62,58,56,55,55,55,52,52,51,50,49,46,42,40, 39,38,37,36,36,33,31,31 }; const int n1c3w4_h[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,100,99,97,95,94,92,90,88,87,86,85,83,80,79,78,78,78,75,75, 74,73,71,70,69,67,65,64,59,58,57,57,55,54,54,52,51,50,49,48,46, 46,45,43,43,42,39,38,33,32 }; const int n1c3w4_i[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 99,98,95,89,88,88,87,87,87,87,86,84,84,83,78,77,74,74,73,73,73, 72,72,70,68,67,64,64,64,63,63,60,59,58,56,54,51,50,49,49,39,37, 37,36,36,36,34,34,31,30 }; const int n1c3w4_j[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,93,91,91,89,89,88,86,85,84,83,83,82,80,79,78,77,76,76,73, 72,68,68,63,63,61,60,60,58,57,57,56,54,53,52,50,48,47,47,45,41, 41,36,35,34,34,33,31,31,30 }; const int n1c3w4_k[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,97,96,94,94,93,90,89,89,86,85,84,83,83,83,82,80,78,75,74, 72,72,71,70,69,69,66,64,64,63,62,60,59,59,58,57,57,57,57,56,50, 50,47,44,43,41,37,36,35,33 }; const int n1c3w4_l[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,100,93,91,88,86,86,84,83,75,75,75,75,75,73,72,70,69,67,66, 66,65,61,58,56,55,55,54,52,51,51,51,50,47,45,44,42,42,41,40,39, 36,35,35,33,33,33,32,31,30 }; const int n1c3w4_m[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 99,98,97,95,90,87,87,85,85,83,80,80,76,71,71,70,69,68,67,66,65, 63,63,62,62,60,60,60,58,56,55,53,50,49,45,42,42,41,38,36,36,34, 34,33,32,32,31,31,31,30 }; const int n1c3w4_n[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,92,91,90,89,85,84,81,80,80,78,78,77,77,76,75,74,73,69,69, 68,68,67,67,65,64,63,63,61,60,56,54,54,51,49,45,43,42,39,39,39, 38,36,35,34,34,33,32,31,30 }; const int n1c3w4_o[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,100,96,96,94,94,93,85,83,82,82,81,80,79,76,76,76,72,72,72, 71,70,70,70,68,67,66,64,64,58,58,57,49,49,46,42,39,39,39,38,37, 37,36,35,33,32,32,30,30,30 }; const int n1c3w4_p[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,98,98,96,95,95,94,94,94,91,90,90,89,86,85,85,85,84,78,78, 77,76,75,73,72,72,70,70,69,69,68,68,66,60,59,55,50,50,48,48,47, 47,44,43,42,40,39,39,37,35 }; const int n1c3w4_q[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,99,98,97,97,95,92,92,91,90,89,88,87,84,84,83,82,80,80,78, 77,77,76,76,75,72,70,68,67,64,63,61,61,60,58,57,57,56,55,49,49, 48,40,40,37,35,32,31,31,30 }; const int n1c3w4_r[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 98,94,94,93,92,92,92,91,85,84,84,81,81,79,79,78,76,73,72,71,68, 68,67,67,65,63,61,60,60,59,59,58,57,56,55,48,47,46,45,43,40,40, 39,38,37,35,34,32,31,31 }; const int n1c3w4_s[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 99,98,97,95,95,93,93,92,89,80,80,79,79,77,76,75,74,74,73,71,71, 70,68,66,64,63,61,60,57,57,55,54,53,50,50,49,48,47,46,46,42,42, 39,38,38,37,37,34,32,31 }; const int n1c3w4_t[] = { 150, // Capacity 50, // Number of items // Size of items (sorted) 100,98,98,97,97,97,96,94,93,90,89,88,88,85,84,84,83,83,81,80, 78,76,75,73,73,71,71,70,69,66,65,64,64,63,60,60,57,56,54,54,53, 53,48,43,42,38,34,32,31,30 }; const int n2c1w1_a[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 99,97,95,95,94,92,91,89,86,86,85,84,80,80,80,80,80,79,76,76,75, 74,73,71,71,69,65,64,64,64,63,63,62,60,59,58,57,54,53,52,51,50, 48,48,48,46,44,43,43,43,43,42,41,40,40,39,38,38,38,38,37,37,37, 37,36,35,34,33,32,30,29,28,26,26,26,24,23,22,21,21,19,18,17,16, 16,15,14,13,12,12,11,9,9,8,8,7,6,6,5,1 }; const int n2c1w1_b[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,98,96,96,93,89,84,84,83,83,82,81,80,79,79,79,79, 78,77,76,75,74,71,71,70,69,69,68,67,67,66,62,56,55,54,53,51,50, 50,50,49,48,48,47,45,45,45,42,42,42,41,41,40,40,39,38,37,36,36, 34,34,33,32,32,31,29,28,28,28,26,24,24,22,22,22,21,18,18,17,17, 15,14,14,12,12,11,10,10,9,8,7,7,5,3,3,2,2 }; const int n2c1w1_c[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 98,97,94,92,91,91,90,89,86,85,84,83,82,81,78,76,75,73,73,72,72, 71,70,70,69,69,66,64,60,60,59,58,57,56,55,54,53,52,52,51,50,49, 49,48,47,47,45,43,43,43,42,42,42,42,40,39,39,36,35,34,34,34,33, 32,30,30,30,29,29,28,25,23,22,22,22,22,22,20,20,19,19,18,16,16, 16,15,15,15,13,12,12,10,9,8,6,5,4,4,2,2 }; const int n2c1w1_d[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 99,98,96,93,93,92,90,89,89,89,88,88,87,86,84,84,81,80,80,80,80, 78,78,77,75,73,72,70,69,68,65,65,64,63,63,63,62,61,60,58,58,58, 57,56,54,52,51,49,49,46,45,45,44,44,42,42,41,41,38,38,37,36,36, 34,34,31,30,30,28,27,26,25,24,24,24,23,22,21,21,18,17,17,16,14, 13,12,12,11,10,10,9,8,6,5,5,4,4,3,2,1 }; const int n2c1w1_e[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,96,95,95,95,93,93,92,92,92,91,90,89,89,89,87,87, 87,85,84,81,81,80,79,77,74,74,74,73,73,72,71,70,70,66,66,65,65, 65,64,63,63,63,63,63,61,57,56,54,52,52,51,49,48,46,44,44,44,42, 40,40,40,38,38,35,34,31,31,31,30,27,27,25,25,24,21,21,21,18,17, 17,16,16,16,15,15,11,11,9,9,9,8,5,5,5,3,1 }; const int n2c1w1_f[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,97,96,96,95,95,95,94,93,93,92,92,91,89,85,84,78,76, 76,76,76,75,73,73,70,70,69,67,67,66,63,62,60,60,60,58,56,55,53, 53,52,51,50,50,50,49,49,48,47,47,46,45,45,42,41,41,39,37,36,36, 35,34,34,30,30,29,29,28,28,26,26,23,22,22,22,22,21,21,21,19,18, 17,17,15,14,14,11,10,8,7,7,6,5,2,2,1,1,1 }; const int n2c1w1_g[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 99,96,93,93,93,92,92,91,90,89,88,88,88,87,87,86,84,84,82,81,80, 80,80,79,79,79,79,76,75,75,75,75,75,74,74,73,71,68,64,62,61,61, 61,60,58,58,58,58,57,57,57,55,54,53,52,51,51,51,50,50,47,45,44, 41,40,39,39,39,38,36,36,35,35,34,33,32,31,30,30,29,29,29,28,24, 22,21,19,19,18,10,9,8,8,7,6,5,5,4,3,2 }; const int n2c1w1_h[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 98,98,98,98,94,94,94,93,92,91,89,89,87,86,85,84,80,80,78,76,76, 75,73,73,72,71,71,71,70,69,67,65,64,64,62,62,62,62,59,56,55,55, 54,53,53,53,52,52,50,49,49,49,49,49,45,44,43,43,43,43,43,39,38, 38,38,37,37,36,36,34,34,33,29,29,29,28,27,27,27,25,22,22,19,17, 17,17,16,15,14,14,14,13,13,13,10,8,6,6,5,3 }; const int n2c1w1_i[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 99,98,97,96,95,95,94,94,94,90,88,86,86,86,86,85,85,85,85,85,83, 83,82,81,81,80,80,79,79,78,77,77,76,76,76,75,75,74,74,74,72,71, 69,67,67,66,66,65,65,63,61,61,59,59,57,57,56,56,55,54,53,49,48, 46,45,41,39,39,38,38,37,37,36,36,35,32,30,30,30,28,28,28,27,26, 26,25,24,23,22,22,17,17,13,11,10,10,6,3,2,1 }; const int n2c1w1_j[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,98,95,94,93,93,93,92,92,91,91,91,88,88,87,86,85,83, 81,81,81,80,80,80,79,77,77,77,76,75,73,71,71,71,70,69,68,67,66, 65,63,60,60,59,59,59,59,56,54,54,54,54,53,53,52,51,51,49,46,44, 44,43,42,42,41,41,41,39,35,34,34,32,32,31,30,29,28,27,22,22,21, 21,20,17,14,12,12,11,11,10,10,8,8,6,6,5,5,4 }; const int n2c1w1_k[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,99,98,97,97,97,97,97,92,91,91,91,88,86,86,85,84,84,83,81, 80,79,79,79,78,77,77,75,75,75,74,74,71,71,70,69,64,64,63,63,62, 62,61,61,56,56,56,56,55,53,53,52,52,51,49,48,46,44,44,43,43,42, 42,40,38,37,36,35,34,32,32,31,30,29,29,28,28,28,27,26,24,24,22, 20,20,18,17,16,16,14,13,13,12,11,10,8,6,4,2,1 }; const int n2c1w1_l[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,98,97,96,96,95,95,95,94,94,94,93,92,90,87,87,84,83,83, 83,81,80,77,77,77,77,75,74,74,73,72,71,71,71,70,70,70,69,69,67, 63,63,63,63,62,58,55,55,55,54,53,53,51,49,49,49,47,45,42,41,39, 38,35,34,29,28,28,28,28,27,27,26,26,25,25,25,24,24,23,21,19,17, 15,15,15,14,12,11,7,7,7,6,5,5,5,2,2,1,1 }; const int n2c1w1_m[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 97,96,95,94,90,88,88,87,86,85,84,84,82,81,81,80,80,80,79,79,78, 74,73,69,69,68,68,67,67,65,64,63,63,60,60,58,57,56,55,53,53,51, 51,51,47,47,46,46,45,41,41,39,38,37,37,37,37,35,34,33,33,33,33, 32,31,31,31,30,30,28,22,22,20,20,20,20,19,19,17,17,17,16,16,15, 13,13,12,12,10,10,9,8,8,8,5,5,5,4,4,1 }; const int n2c1w1_n[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,98,97,95,90,90,89,89,87,87,85,83,82,82,81,81,81,80,79,78, 77,76,74,73,72,70,70,68,67,64,63,63,60,60,58,58,57,57,55,54,54, 53,52,52,52,51,50,50,50,48,45,45,45,44,44,43,41,38,37,34,34,34, 33,32,32,31,30,30,30,30,26,25,24,23,20,19,19,19,18,17,16,15,13, 12,12,11,11,11,11,10,9,8,8,8,7,4,3,3,2,1 }; const int n2c1w1_o[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,98,97,95,94,92,92,92,91,90,89,89,88,88,88,87,85,84,83, 81,79,79,77,77,76,72,70,70,69,69,68,64,63,62,62,61,61,60,59,59, 58,57,55,52,52,51,47,47,46,43,43,42,37,36,35,35,35,35,34,32,32, 31,31,29,29,28,28,25,23,22,22,21,19,17,16,15,14,12,11,11,11,11, 11,11,10,8,8,7,6,5,5,4,4,3,3,2,2,1,1 }; const int n2c1w1_p[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 99,99,96,96,95,93,92,92,91,91,90,90,88,88,87,86,83,83,83,83,81, 81,80,80,78,78,76,76,74,73,72,72,70,69,69,68,67,66,58,57,56,55, 55,55,54,54,54,54,53,51,51,51,48,48,47,47,47,46,46,46,45,44,43, 43,43,42,41,40,40,35,34,31,29,26,24,24,23,23,22,22,22,21,20,18, 17,17,15,14,12,12,11,9,9,8,6,4,3,3,1,1 }; const int n2c1w1_q[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 99,98,97,97,96,94,94,94,93,90,84,82,81,78,76,76,75,75,73,70,70, 69,69,66,66,65,65,65,63,61,60,59,59,59,58,58,56,55,54,54,53,53, 50,50,50,48,48,47,46,45,45,45,45,41,41,40,39,39,36,36,35,35,34, 33,33,31,30,29,28,27,26,26,24,24,19,19,19,18,18,18,18,16,14,14, 13,12,11,11,10,10,10,7,7,6,6,6,4,3,1,1 }; const int n2c1w1_r[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,97,97,96,96,95,94,94,94,94,92,92,91,90,88,87,85,84, 84,83,82,81,80,78,75,74,72,72,71,70,69,69,68,65,64,64,62,61,61, 60,59,58,58,58,57,57,55,54,54,54,53,53,50,49,48,47,47,46,46,45, 45,44,43,42,40,36,36,35,34,34,33,32,31,30,30,26,26,25,24,23,23, 22,22,21,20,19,18,18,17,17,17,15,9,8,7,6,3,3 }; const int n2c1w1_s[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,99,96,96,95,94,94,93,91,89,89,88,81,80,75,74,73,72,69,69, 69,68,64,63,63,62,61,58,57,57,57,57,56,56,54,54,54,51,49,49,49, 48,48,48,48,48,48,47,47,47,44,43,43,41,40,40,39,38,38,36,35,33, 31,30,30,30,30,29,29,28,25,25,23,23,20,19,18,16,15,14,14,14,12, 12,11,10,9,9,8,8,8,7,7,7,5,4,4,3,2,2 }; const int n2c1w1_t[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,98,97,96,95,94,92,91,91,90,90,90,88,87,87,85,84,83, 81,78,76,74,71,71,70,68,68,66,66,65,64,63,63,62,62,61,59,59,59, 59,59,57,57,56,54,53,52,51,50,50,49,46,45,43,41,41,40,40,40,39, 36,35,34,33,33,32,32,32,30,30,29,29,29,28,27,27,27,23,21,21,20, 20,19,19,17,15,15,15,11,9,6,5,5,5,4,3,2,1 }; const int n2c1w2_a[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,99,99,98,96,95,95,94,93,93,92,90,90,89,86,86,85,85, 84,83,82,82,82,81,80,79,77,77,77,76,75,75,75,74,73,71,71,69,68, 67,67,67,65,63,63,60,57,56,56,55,55,54,54,54,53,53,51,51,47,46, 46,45,45,45,44,44,44,44,43,41,40,40,39,39,39,39,38,36,36,34,33, 33,32,32,31,30,29,28,26,25,24,24,23,22,22,22,21,20 }; const int n2c1w2_b[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 99,96,96,94,94,93,93,90,90,88,88,88,87,87,86,85,84,84,84,83,83, 83,82,81,81,80,80,77,75,75,75,74,73,69,69,67,67,66,66,65,65,64, 64,63,63,63,59,58,56,55,54,54,53,53,52,50,50,50,48,48,47,47,45, 43,42,42,42,41,41,41,40,39,38,38,34,34,32,32,32,31,31,30,30,29, 27,26,26,26,26,25,25,25,24,23,22,22,22,21,21,20 }; const int n2c1w2_c[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 98,96,95,95,94,94,92,91,89,88,86,85,84,84,83,83,82,82,81,80,80, 79,77,77,77,75,75,75,75,75,72,71,70,69,68,68,66,66,66,66,64,64, 64,64,63,62,62,61,59,58,58,58,57,56,56,56,56,55,55,54,54,53,51, 51,51,50,50,49,49,49,48,48,48,45,45,44,43,41,40,40,36,34,33,32, 32,32,29,27,27,27,27,25,25,25,24,23,23,21,21,20 }; const int n2c1w2_d[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,99,98,97,96,95,94,94,94,93,93,93,92,92,92,91,90,90,89,88, 88,87,86,85,85,85,84,83,83,83,79,78,78,78,77,77,77,76,74,74,73, 72,72,71,71,70,70,69,68,67,65,64,64,63,61,61,60,59,59,58,57,57, 56,55,55,55,54,54,54,54,52,52,51,51,49,46,46,46,45,44,43,41,40, 39,38,37,35,35,32,32,32,30,30,30,29,28,27,23,22,20 }; const int n2c1w2_e[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,98,97,96,95,94,94,91,90,90,90,89,89,89, 88,88,87,87,86,85,85,85,84,82,81,80,80,79,79,77,76,74,73,71,70, 69,68,68,67,67,66,65,65,65,62,62,62,59,59,59,57,57,55,55,54,51, 50,49,47,47,46,45,45,43,42,41,41,41,39,38,37,35,35,34,34,34,33, 32,31,30,29,29,27,26,26,25,24,24,24,21,21,21,20,20 }; const int n2c1w2_f[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,98,98,96,96,96,96,95,95,94,94,93,91,90,90,89,89, 89,88,88,86,85,83,83,83,83,81,81,79,79,78,78,78,77,76,75,75,72, 71,68,68,67,66,61,60,60,59,59,58,58,58,57,56,52,52,52,52,50,47, 47,47,44,43,43,43,41,41,41,40,39,38,36,36,32,32,32,31,29,29,29, 28,28,28,28,27,27,27,26,25,24,24,24,24,23,23,21,21 }; const int n2c1w2_g[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 99,99,99,99,97,97,95,94,92,92,92,91,91,90,90,90,89,88,87,87,86, 85,84,83,83,83,81,80,79,78,78,77,76,76,74,73,73,72,72,72,71,70, 70,70,68,68,67,67,65,65,65,64,64,64,64,63,63,63,63,61,60,59,58, 57,57,56,55,54,53,51,50,49,48,48,48,47,47,45,41,39,39,38,38,37, 36,35,29,28,27,26,26,24,22,22,22,22,22,21,20,20 }; const int n2c1w2_h[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,99,95,95,94,94,93,93,93,92,91,88,87,86,86,86,86,85,85,85, 84,84,84,83,82,81,79,78,77,76,76,76,76,75,75,73,72,71,71,69,69, 69,69,67,67,65,65,64,64,64,64,63,63,62,61,61,60,59,59,59,57,57, 56,56,55,55,54,53,51,49,47,45,45,43,43,43,42,42,42,38,37,36,36, 33,31,29,28,28,28,28,27,27,27,26,26,25,24,22,22,20 }; const int n2c1w2_i[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,99,98,97,97,96,95,95,93,93,93,93,91,91,90,89,89,89,89,89, 89,88,88,87,86,84,84,81,80,79,78,78,76,75,74,72,72,71,71,70,69, 69,66,66,63,63,62,62,61,60,59,59,57,57,55,55,55,54,54,54,53,53, 52,52,51,50,50,50,49,49,48,47,47,41,40,40,39,38,36,35,34,33,33, 32,31,31,31,31,30,30,28,27,24,23,23,22,21,20,20,20 }; const int n2c1w2_j[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 99,97,96,95,95,95,94,94,94,93,92,90,90,89,89,89,89,89,89,88,88, 86,86,85,85,85,84,84,83,82,82,80,79,78,78,78,77,77,77,76,75,75, 69,67,66,66,66,65,65,65,64,64,62,62,58,58,58,58,58,55,54,53,53, 51,50,50,50,49,49,46,45,42,42,42,41,40,39,39,37,37,37,37,35,33, 33,32,31,30,29,28,26,25,21,21,21,21,21,20,20,20 }; const int n2c1w2_k[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,99,98,97,95,95,93,92,91,91,91,91,90,89,89,88,88,86,85,85, 83,81,81,81,80,80,79,78,77,77,77,76,76,76,75,75,74,74,73,73,71, 71,70,70,69,69,69,67,67,67,67,66,65,63,63,63,63,62,62,62,61,57, 55,53,53,51,51,51,50,50,49,49,48,48,48,47,47,46,43,41,41,40,36, 36,36,36,35,35,33,32,32,31,31,29,28,28,25,25,23,21 }; const int n2c1w2_l[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,97,96,96,94,94,94,93,93,93,91,91,90,90,88,83,83,82,82,81, 81,80,78,78,78,76,75,75,74,72,72,71,70,70,70,70,70,67,65,64,64, 64,63,62,62,61,60,60,58,58,57,55,55,54,53,52,52,51,50,49,48,47, 47,47,46,45,45,45,44,43,42,42,41,41,40,39,38,38,36,36,35,35,35, 33,32,31,30,30,29,27,26,25,24,24,23,23,22,22,22,20 }; const int n2c1w2_m[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,98,97,97,97,96,95,95,95,95,94,92,92,91,91,90,90,89, 89,89,87,86,85,83,82,82,80,80,79,78,76,75,74,72,72,71,71,71,70, 66,65,63,63,63,63,62,61,60,60,60,60,59,57,55,55,55,53,52,51,46, 46,46,45,45,42,41,41,41,40,40,39,39,39,39,38,38,37,36,36,35,35, 35,35,34,34,31,30,29,29,28,27,27,27,27,26,26,22,22 }; const int n2c1w2_n[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,99,99,98,96,95,95,94,94,94,93,93,92,92,92,91,91,89, 86,86,85,85,83,82,81,81,80,78,77,77,75,74,74,73,70,70,69,69,68, 68,67,66,65,64,63,63,62,60,59,59,58,56,56,56,55,54,51,50,50,49, 48,47,47,46,46,46,44,44,43,42,39,39,38,38,37,37,34,34,32,32,31, 30,30,29,29,28,28,27,27,27,25,24,24,24,23,21,20,20 }; const int n2c1w2_o[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,98,98,98,98,97,96,95,95,94,93,92,90,90,89,88,88,88,87,87, 86,85,84,83,83,83,82,82,80,80,79,79,78,78,76,74,74,74,74,71,69, 68,68,67,67,66,64,64,64,64,62,62,61,60,60,55,55,53,53,50,49,49, 47,45,44,44,43,43,42,42,42,41,41,39,36,35,35,33,33,32,31,31,31, 31,30,30,29,28,25,25,23,23,22,22,21,21,21,20,20,20 }; const int n2c1w2_p[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 99,98,97,96,96,95,94,93,93,92,92,90,90,89,89,88,88,88,88,86,86, 85,83,82,82,80,80,80,79,79,77,77,77,76,76,76,74,73,73,71,71,70, 69,69,69,68,68,67,66,66,65,63,60,59,57,57,57,57,56,53,53,52,51, 51,51,51,50,47,46,45,44,44,44,43,42,42,39,39,38,38,38,37,36,36, 36,32,31,30,28,28,27,27,27,26,26,24,24,22,22,20 }; const int n2c1w2_q[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 97,97,97,96,96,95,94,94,94,90,89,86,85,84,83,79,78,78,78,77,77, 77,76,76,75,75,74,74,72,72,71,71,70,69,69,67,67,66,66,66,66,65, 65,64,63,63,62,62,61,60,59,59,57,56,56,55,53,53,52,52,51,51,51, 50,50,49,49,49,49,48,48,47,47,45,43,40,39,37,37,35,34,33,33,32, 32,31,30,29,28,28,28,27,27,27,25,24,24,23,23,22 }; const int n2c1w2_r[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,99,98,98,98,98,97,97,96,96,96,94,94,93,92,90,88,87,87,86, 86,85,85,85,85,85,84,84,83,83,83,83,80,79,79,78,77,77,76,75,75, 74,71,70,69,67,65,64,62,62,62,62,61,61,60,58,57,56,55,55,55,54, 54,53,52,51,49,49,47,46,45,44,44,43,43,41,41,40,39,37,34,32,32, 31,29,28,28,27,26,26,25,25,24,24,23,23,22,22,21,20 }; const int n2c1w2_s[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,98,98,97,96,94,94,93,93,91,90,90,90,89,89,87,87,86,86,86, 84,84,82,82,81,81,80,79,77,77,77,76,76,75,75,73,72,72,71,70,70, 70,70,67,64,62,62,59,59,59,58,58,58,55,55,54,54,53,53,53,51,51, 50,50,50,49,49,48,47,46,46,45,45,44,41,41,39,39,37,37,37,37,35, 34,34,34,33,33,33,32,31,29,27,25,25,24,23,22,20,20 }; const int n2c1w2_t[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,99,98,97,95,94,94,94,93,93,92,92,91,90,90,90,90,89, 89,87,86,85,83,82,80,80,79,79,78,78,78,77,75,72,71,70,70,67,65, 64,63,62,62,62,61,60,60,59,58,58,58,57,57,56,56,56,55,55,54,52, 51,49,49,48,47,46,46,46,46,46,44,44,43,42,42,39,37,36,36,35,34, 34,33,33,33,32,30,30,30,27,26,25,24,24,24,21,21,20 }; const int n2c1w4_a[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,99,97,96,96,96,94,94,94,93,93,93,92,91,90,90,90,89,89,88, 88,83,83,82,82,81,80,80,80,79,79,79,79,78,78,78,76,74,74,73,73, 71,70,69,69,68,67,67,66,65,64,63,63,63,62,59,58,58,57,56,56,56, 56,53,53,53,52,51,51,50,49,48,48,48,47,46,46,45,43,42,41,41,39, 39,39,38,38,38,38,38,37,37,37,36,36,33,32,32,31,31 }; const int n2c1w4_b[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,99,99,97,96,95,95,93,93,93,91,89,89,89,88,87,87,86, 85,85,84,83,81,80,80,79,79,78,78,78,77,75,75,73,73,73,72,71,71, 70,70,69,66,65,65,63,60,60,59,59,58,58,57,57,55,55,55,55,54,54, 53,53,52,51,50,50,49,49,49,48,45,45,45,45,44,44,43,43,41,41,40, 40,40,36,36,35,34,34,33,33,33,33,33,32,32,32,32,30 }; const int n2c1w4_c[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 99,97,97,96,96,94,93,93,92,92,91,90,90,90,88,87,87,86,86,86,85, 85,85,85,84,84,83,83,82,82,81,81,81,79,79,78,77,76,76,76,76,76, 74,74,73,71,71,70,70,69,69,67,67,66,65,65,65,63,62,62,61,60,60, 60,59,59,58,57,56,56,55,55,54,53,52,51,50,50,48,48,43,40,38,38, 38,37,35,35,35,35,34,33,33,32,32,31,31,31,31,30 }; const int n2c1w4_d[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,98,98,97,97,96,95,95,94,94,94,93,92,89,89,88,88,88, 88,87,86,85,84,84,82,81,81,80,79,78,77,77,76,76,76,76,74,74,74, 73,72,72,72,71,71,71,69,69,68,68,68,68,67,67,66,66,65,65,64,64, 62,61,58,57,57,57,56,55,54,54,54,53,53,52,52,52,52,51,51,50,49, 49,48,47,46,45,45,40,40,39,37,37,35,34,34,33,33,30 }; const int n2c1w4_e[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 99,99,98,97,97,96,96,95,95,95,94,94,94,94,91,91,89,88,87,86,86, 85,84,83,82,82,82,81,81,79,78,78,76,76,76,76,73,72,71,71,70,70, 70,69,69,69,69,69,68,68,67,66,65,64,61,61,61,61,60,60,59,59,58, 57,57,55,54,54,48,45,45,44,44,43,42,42,42,42,41,41,39,38,37,37, 36,36,35,35,35,35,34,34,34,33,33,32,31,31,31,30 }; const int n2c1w4_f[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,97,97,95,95,95,94,93,92,91,90,89,89,88,87,87,86,84, 83,82,80,80,80,80,80,80,79,79,79,79,78,76,76,76,76,73,73,72,71, 71,70,69,69,69,69,68,67,66,66,66,64,64,64,62,62,62,62,61,60,60, 59,58,58,58,58,57,57,56,56,56,56,56,53,52,50,49,48,47,44,44,43, 42,40,39,37,37,36,36,36,35,35,34,33,33,33,32,30,30 }; const int n2c1w4_g[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,98,98,96,95,95,95,94,94,93,93,88,87,85,84,80,80,80,79, 78,78,78,77,77,77,76,76,73,71,71,70,70,70,70,69,69,68,67,67,66, 66,66,66,66,66,66,64,63,63,63,61,61,61,61,60,59,59,59,58,57,57, 57,56,55,54,54,53,51,51,49,49,49,48,47,45,44,44,42,41,41,41,40, 39,39,39,38,38,37,37,37,36,35,34,34,33,32,32,32,31 }; const int n2c1w4_h[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,99,98,98,97,96,96,94,94,94,94,93,91,90,89,87,87,87, 86,84,84,84,83,82,80,79,75,75,75,74,74,73,73,73,72,71,70,69,69, 69,68,68,68,67,65,65,63,63,61,61,61,61,60,60,60,60,60,59,59,58, 57,57,56,56,55,54,54,54,51,50,50,49,49,49,49,48,48,48,46,46,44, 42,42,41,40,40,38,37,35,35,34,34,33,33,33,33,32,31 }; const int n2c1w4_i[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 98,97,97,96,96,95,95,95,95,92,92,92,91,91,91,91,90,88,87,86,85, 83,82,81,80,79,77,76,76,75,75,75,74,74,72,72,72,71,71,71,70,70, 70,69,69,68,67,65,65,64,63,63,62,62,62,61,61,60,59,59,59,59,58, 58,56,56,55,55,52,51,50,48,48,47,47,47,46,45,44,44,42,42,42,41, 40,39,38,36,36,36,35,35,35,35,34,32,32,32,30,30 }; const int n2c1w4_j[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,97,97,97,96,96,96,95,93,91,90,87,87,86,86,84,83, 82,81,81,81,80,79,79,77,77,76,76,75,74,72,72,72,71,70,70,70,69, 69,68,68,67,67,67,66,66,66,65,65,65,64,64,62,60,59,57,57,57,57, 55,55,55,55,53,53,52,52,52,50,50,50,49,49,48,47,47,45,45,45,44, 43,42,39,39,39,38,38,38,37,35,35,34,32,32,31,30,30 }; const int n2c1w4_k[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 99,98,98,97,97,97,95,94,94,94,93,93,91,91,90,89,89,88,88,87,86, 83,83,82,82,81,81,80,80,79,79,78,76,74,73,73,72,71,71,70,70,70, 68,68,67,66,66,65,64,64,61,61,60,59,59,57,56,56,56,56,56,55,54, 53,51,51,51,51,50,50,50,49,47,47,47,46,46,45,45,43,43,42,41,40, 40,39,39,38,38,37,35,34,34,34,33,33,32,30,30,30 }; const int n2c1w4_l[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 99,99,96,96,95,95,94,94,93,91,91,88,88,87,87,87,87,84,84,83,83, 82,82,82,81,81,81,80,78,77,77,76,76,76,74,74,74,74,74,73,73,73, 73,73,72,72,71,71,70,70,69,68,67,64,64,63,62,60,60,59,59,59,58, 58,57,57,57,55,55,53,52,51,50,49,48,46,46,45,43,43,42,42,42,42, 42,40,40,40,38,37,36,36,34,34,33,33,33,31,30,30 }; const int n2c1w4_m[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,99,99,99,98,98,97,96,96,96,96,95,95,95,95,91,90,89, 88,87,86,84,83,83,82,80,79,77,77,76,76,74,74,74,73,72,72,71,71, 70,69,68,67,67,66,66,65,63,60,60,59,59,58,57,57,56,56,54,53,53, 53,53,52,51,50,50,50,50,49,47,47,46,46,45,44,43,42,42,42,41,41, 39,38,38,38,37,37,36,36,36,35,35,35,33,32,32,32,31 }; const int n2c1w4_n[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,99,98,98,97,97,96,96,96,95,94,94,92,91,91,90,90,90, 88,87,85,85,84,83,83,81,80,79,79,78,76,76,76,75,74,74,74,73,71, 70,67,67,67,66,66,66,64,64,64,64,63,63,61,59,59,58,58,58,56,56, 56,54,53,53,52,51,50,50,49,48,48,48,48,46,45,44,41,40,40,40,39, 39,37,37,36,36,36,35,35,34,33,33,33,33,32,31,31,30 }; const int n2c1w4_o[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,100,99,99,98,98,98,97,97,97,96,95,95,94,94,94,94, 93,93,93,92,92,92,91,91,90,87,86,86,85,85,84,83,83,80,79,78,78, 77,76,74,72,72,72,71,71,71,71,70,70,69,68,67,66,65,64,63,63,62, 62,62,60,59,59,58,58,57,57,56,55,55,54,53,52,52,51,51,51,49,46, 42,41,41,41,40,40,39,39,39,38,36,36,34,34,33,31,30,30 }; const int n2c1w4_p[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 99,99,98,96,93,93,92,91,91,91,90,89,89,88,85,85,83,82,82,81,80, 79,78,78,74,74,70,69,69,66,65,65,64,64,64,64,63,63,62,62,62,62, 61,61,61,61,61,59,59,59,58,58,57,57,56,55,55,54,53,53,52,52,51, 49,48,48,47,47,47,47,45,45,45,44,44,43,43,43,42,42,42,42,41,41, 41,40,40,39,37,37,36,36,35,34,34,34,32,32,30,30 }; const int n2c1w4_q[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,98,98,97,97,94,93,93,92,92,92,91,91,91,90,89,89,89,88, 87,86,85,83,83,83,82,81,80,80,80,79,79,78,77,77,77,77,77,75,75, 74,74,74,72,70,69,69,69,66,66,66,66,65,64,64,63,62,61,61,60,60, 60,58,57,57,56,56,54,52,50,49,49,48,47,46,44,43,42,42,40,40,40, 40,39,39,39,39,38,38,38,38,36,36,35,35,35,34,33,32 }; const int n2c1w4_r[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 99,98,98,97,96,96,96,95,95,94,94,93,93,92,92,91,90,89,87,86,85, 84,82,82,80,79,79,78,78,77,76,75,75,75,75,74,74,74,73,70,69,67, 67,66,64,64,63,62,62,62,61,61,60,60,59,59,58,58,57,57,56,55,54, 54,54,51,50,49,49,49,48,48,48,47,47,44,43,43,42,41,41,41,40,40, 40,40,39,39,38,36,36,36,35,35,33,32,32,32,31,31 }; const int n2c1w4_s[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,98,97,97,97,96,96,96,95,94,94,93, 92,91,91,91,90,89,89,88,88,85,85,82,82,80,80,79,78,77,76,75,75, 75,75,74,73,72,71,71,70,69,69,69,67,67,66,66,66,66,65,64,64,64, 64,62,62,61,59,59,59,58,56,56,56,55,55,54,52,50,50,49,49,48,48, 48,47,46,44,44,43,43,40,40,39,38,35,35,33,33,31,30,30 }; const int n2c1w4_t[] = { 100, // Capacity 100, // Number of items // Size of items (sorted) 98,97,97,97,96,96,95,92,91,90,89,89,88,88,87,87,87,86,86,86,85, 85,83,83,83,82,81,80,79,78,78,78,78,75,71,70,70,70,70,69,68,67, 65,65,64,64,63,61,61,61,61,60,60,60,60,59,57,57,54,54,54,54,53, 53,53,52,51,50,50,50,49,46,46,46,46,46,45,44,44,44,42,42,41,40, 40,39,39,38,38,38,37,36,35,35,34,34,34,34,32,32 }; const int n2c2w1_a[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 99,98,98,98,97,96,94,92,91,90,90,89,86,84,82,81,81,80,80,79,79, 79,77,75,73,72,71,71,71,70,67,65,65,62,61,59,56,55,55,55,55,54, 54,53,52,51,50,48,48,48,47,47,46,45,44,43,43,43,43,42,42,40,39, 38,38,36,34,30,30,29,27,26,26,24,22,21,21,20,19,18,18,18,15,14, 13,11,9,8,7,7,6,6,6,4,4,3,3,2,1,1 }; const int n2c2w1_b[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,99,99,98,97,96,95,95,91,91,91,90,90,88,88,88,88,87, 87,85,85,82,82,81,79,78,78,78,78,78,78,77,77,77,75,74,72,71,69, 69,68,67,64,64,62,62,60,58,57,55,55,54,51,51,51,48,48,47,46,45, 44,42,38,38,36,34,34,31,30,30,30,28,28,28,26,26,25,25,23,23,22, 21,20,19,18,18,17,16,13,9,8,5,4,4,4,4,3,1 }; const int n2c2w1_c[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,97,97,96,95,94,91,90,89,88,84,84,84,83,82,81,80,80,80, 78,73,72,72,72,69,69,66,65,65,65,65,65,64,63,63,62,60,58,58,57, 54,54,53,52,51,50,49,49,48,47,46,44,42,40,40,40,39,38,37,37,35, 35,33,32,31,30,30,29,28,27,27,23,21,20,20,20,19,19,19,18,17,16, 16,15,14,13,12,12,12,11,10,8,7,5,5,4,3,3,1 }; const int n2c2w1_d[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 99,97,97,96,94,94,93,93,89,89,89,88,87,85,85,84,84,82,82,78,77, 76,75,73,73,71,71,67,66,63,63,62,62,61,61,59,59,57,57,57,57,55, 53,53,52,51,51,50,49,49,48,48,48,47,46,46,46,44,44,41,38,37,37, 37,37,35,35,34,34,32,32,31,31,30,29,28,27,27,26,26,26,25,25,24, 21,19,18,15,13,13,12,12,12,10,10,5,4,3,2,1 }; const int n2c2w1_e[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,96,94,93,92,92,92,90,90,89,89,89,87,84,82,82,82,81, 80,77,77,77,77,75,73,72,71,69,68,68,64,64,62,61,58,54,53,53,53, 52,52,51,51,49,49,48,48,46,45,45,44,43,42,41,40,37,37,36,35,35, 34,34,33,33,33,31,29,27,24,24,23,22,21,20,18,17,17,16,15,14,14, 14,13,13,13,11,11,9,8,7,7,6,4,3,1,1,1,1 }; const int n2c2w1_f[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,100,99,99,97,97,97,97,95,92,91,89,88,88,88,88,88, 86,85,85,83,82,81,81,80,80,80,79,78,76,75,75,71,70,70,70,69,69, 68,67,67,65,63,63,62,62,62,56,54,54,54,53,52,52,51,49,49,47,42, 42,42,41,40,40,38,38,35,34,34,33,31,31,31,31,30,30,29,27,27,26, 23,22,22,21,19,19,17,16,15,15,12,11,10,9,9,8,4,1 }; const int n2c2w1_g[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,99,99,98,98,96,95,94,93,91,90,90,89,89,88,86,83,83, 82,81,81,80,80,80,79,79,79,76,75,74,73,73,70,70,65,63,60,59,59, 58,57,55,54,54,52,52,51,51,51,50,47,47,46,45,45,45,43,42,42,41, 36,35,35,35,34,33,33,29,29,29,29,29,28,24,22,22,22,22,22,20,20, 20,19,18,17,17,16,15,12,11,11,9,8,6,3,1,1,1 }; const int n2c2w1_h[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,98,97,96,94,94,93,93,92,92,90,88,88,87,87,86,86, 86,85,85,78,78,77,77,77,74,71,71,68,68,67,66,65,65,62,62,60,59, 59,55,55,54,53,52,52,51,51,50,49,49,48,47,46,46,46,45,45,45,42, 42,41,41,40,38,36,36,34,33,32,32,32,31,29,27,23,22,22,21,21,20, 18,16,15,11,10,10,9,9,8,6,6,5,5,4,3,1,1 }; const int n2c2w1_i[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,98,97,96,96,96,93,93,92,91,88,87,86,85,84,82,82,79, 79,79,77,77,76,72,71,71,70,68,67,66,66,65,64,64,63,63,62,62,62, 62,61,60,59,59,58,57,56,55,55,54,51,51,50,50,48,47,47,46,46,46, 45,44,41,41,38,37,35,33,32,31,29,29,29,28,28,27,26,25,25,22,19, 19,18,18,13,11,10,10,9,6,5,5,4,3,3,2,1,1 }; const int n2c2w1_j[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,98,97,96,95,93,87,87,86,85,85,85,84,83,82,82,81,80, 80,79,79,77,75,75,75,72,72,70,69,69,66,66,66,63,62,62,61,61,60, 57,57,57,55,53,52,52,48,48,47,46,43,43,42,41,41,40,40,38,37,37, 37,36,34,32,31,31,31,30,29,29,28,28,26,26,26,25,24,22,19,16,16, 15,15,14,14,13,9,9,8,7,6,6,5,4,4,4,3,1 }; const int n2c2w1_k[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,97,96,95,95,93,93,92,90,90,90,89,88,88,87,85,84,82,78, 78,78,78,77,74,74,70,69,68,67,67,66,66,65,61,60,60,59,57,56,55, 55,54,54,52,52,51,51,50,50,49,48,48,48,47,44,43,41,41,40,39,37, 37,32,32,31,30,30,29,28,27,26,25,24,24,24,23,23,22,21,19,18,18, 17,16,15,14,12,10,10,8,6,5,4,3,3,2,2,2,1 }; const int n2c2w1_l[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,99,99,99,98,98,96,96,95,95,95,94,94,93,92,90,90,88, 87,85,85,85,82,81,81,80,80,80,76,76,76,75,73,73,73,73,72,71,71, 68,68,64,64,64,61,60,59,58,57,57,56,51,51,50,49,47,45,45,45,44, 42,40,38,38,36,36,36,35,34,33,30,30,29,29,28,28,27,23,22,20,20, 19,17,16,16,11,11,9,8,8,7,7,5,5,3,2,2,1 }; const int n2c2w1_m[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 98,97,95,93,93,92,92,92,91,90,89,89,89,88,86,84,84,84,83,83,82, 82,81,81,79,78,77,75,73,72,72,71,71,70,69,68,65,65,64,64,62,61, 60,57,55,55,53,51,51,50,50,50,48,46,45,42,42,41,41,41,41,41,40, 39,39,37,36,35,34,33,33,33,30,30,29,27,25,23,23,23,23,19,19,16, 16,14,14,14,14,12,12,10,8,8,7,7,6,5,3,3 }; const int n2c2w1_n[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 99,99,96,96,95,93,92,89,89,88,87,85,81,80,80,78,77,77,76,75,74, 72,71,71,70,70,69,69,67,67,67,65,65,65,65,64,62,62,59,59,59,58, 58,56,56,56,56,55,55,54,52,50,50,49,49,48,47,45,43,43,43,41,40, 39,38,38,37,36,36,36,35,35,35,30,30,29,26,26,26,26,24,24,23,23, 17,17,17,15,13,13,12,11,11,11,6,5,4,4,3,1 }; const int n2c2w1_o[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 98,97,97,97,97,94,93,93,93,92,91,91,90,89,89,88,87,87,87,85,84, 84,83,83,82,81,81,81,81,78,76,76,75,75,74,73,70,69,68,68,68,66, 65,64,64,63,59,58,57,56,56,52,51,51,50,49,48,48,47,47,46,46,45, 45,44,44,43,43,42,40,40,40,37,33,31,30,29,28,26,25,25,24,19,19, 19,19,17,16,16,15,15,14,13,12,12,7,4,2,1,1 }; const int n2c2w1_p[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 99,99,99,99,99,96,96,96,95,94,93,93,91,91,91,89,87,87,86,86,85, 85,84,83,82,82,81,81,76,75,75,74,72,68,68,66,65,64,64,64,63,61, 61,60,60,59,58,56,56,56,55,55,54,54,52,51,51,46,44,43,41,40,39, 39,39,39,38,37,37,36,36,35,33,29,28,27,26,23,23,21,17,17,14,13, 11,11,10,10,10,9,9,9,8,6,6,4,4,3,3,2 }; const int n2c2w1_q[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 98,98,98,98,96,93,92,91,90,89,87,87,86,86,85,84,83,83,81,78,78, 78,78,78,78,77,72,72,71,70,70,70,69,68,67,65,65,64,64,64,63,63, 62,62,62,62,61,61,60,60,59,59,58,57,57,56,56,56,55,54,51,50,49, 49,47,46,46,39,39,38,38,34,33,32,30,30,29,28,27,26,24,23,23,22, 22,22,20,18,18,15,12,9,6,6,5,3,3,2,2,2 }; const int n2c2w1_r[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 98,97,94,94,93,91,90,89,89,89,88,86,86,84,83,80,79,78,77,75,75, 72,71,70,69,67,66,65,64,64,62,61,60,60,60,59,57,56,56,56,56,56, 55,55,55,54,51,50,50,49,49,49,48,47,47,46,44,43,42,40,40,37,37, 36,36,36,36,34,33,33,32,32,30,30,28,28,25,25,24,24,24,22,22,21, 20,19,17,16,13,12,10,9,6,5,5,4,3,3,2,1 }; const int n2c2w1_s[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 99,98,97,96,95,94,93,93,91,90,89,88,87,87,86,86,85,84,83,82,79, 79,78,77,77,77,77,73,73,72,71,71,70,68,67,63,63,62,61,61,61,61, 60,59,57,56,52,51,49,48,47,47,47,46,45,44,44,44,44,43,43,42,42, 39,39,39,34,33,33,32,31,31,28,28,27,25,25,24,24,24,24,22,21,20, 18,17,17,16,14,14,13,10,10,9,9,7,7,7,7,6 }; const int n2c2w1_t[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,98,95,94,94,91,90,89,87,84,80,80,77,75,74,73,73, 72,72,72,69,69,65,64,63,62,62,59,59,59,59,59,59,57,56,53,53,51, 51,51,50,50,50,49,49,48,47,47,47,47,44,44,43,43,40,39,38,37,36, 34,34,32,30,29,29,27,23,23,23,21,18,18,18,18,17,16,16,16,15,15, 14,12,12,11,10,10,9,8,8,7,7,5,4,4,4,2,1 }; const int n2c2w2_a[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,98,95,94,94,93,93,93,92,90,90,90,89,88,87,87,86,86,84, 84,83,82,82,81,80,79,79,79,77,77,76,75,75,75,75,74,73,71,69,69, 68,65,63,60,59,59,58,57,57,56,56,56,56,55,55,54,54,54,54,50,50, 49,48,48,48,45,45,44,44,43,43,39,38,38,37,37,37,37,36,36,33,33, 31,29,28,27,27,26,26,26,26,25,25,25,23,23,23,22,22 }; const int n2c2w2_b[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 99,99,98,97,96,94,93,93,93,92,91,91,91,91,90,89,88,87,85,85,85, 82,82,81,80,80,79,78,76,76,75,75,74,74,72,71,71,70,70,69,69,66, 65,65,65,64,64,63,63,60,60,60,59,59,58,57,56,56,55,54,53,53,53, 52,52,51,51,50,49,49,49,48,48,47,47,47,47,46,45,45,43,43,41,41, 40,37,37,36,36,36,31,31,30,29,28,23,22,21,21,20 }; const int n2c2w2_c[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,99,98,98,98,98,98,97,96,94,93,92,90,89,89,88,87,84,83,82, 81,81,80,80,78,78,78,78,75,75,75,75,74,71,71,71,70,70,69,69,69, 68,68,66,65,64,64,64,64,63,61,58,57,56,56,55,55,55,54,54,54,54, 51,50,50,49,48,46,45,45,44,44,43,41,41,40,40,40,39,37,37,36,36, 35,35,35,35,33,32,31,31,30,29,29,27,27,25,24,21,20 }; const int n2c2w2_d[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,96,96,95,95,94,93,92,92,90,89,89,88,88,87,87,87,86,86, 85,85,85,85,85,84,83,82,77,77,77,76,74,74,72,72,72,71,70,69,67, 67,66,62,62,60,59,59,59,57,57,56,56,56,55,53,52,52,51,49,48,47, 46,43,43,43,43,43,41,41,40,40,39,38,37,36,36,36,36,35,34,34,33, 33,33,33,31,31,29,28,27,27,24,24,23,22,21,20,20,20 }; const int n2c2w2_e[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,97,97,97,95,95,93,92,92,90,90,89,88,88,87,87,85, 84,84,84,82,80,80,80,79,79,79,78,78,77,77,72,71,71,68,68,66,66, 66,64,62,61,60,60,59,58,58,57,57,56,55,55,55,54,53,50,50,49,47, 47,45,45,45,45,45,43,43,43,43,42,42,42,42,42,40,40,39,37,36,36, 36,33,33,33,30,28,27,27,26,24,23,23,22,22,22,22,21 }; const int n2c2w2_f[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 99,96,95,94,92,92,92,92,91,90,89,88,87,86,85,83,83,83,83,82,80, 80,80,78,77,76,76,75,75,74,74,73,72,71,71,71,68,68,68,66,64,62, 59,58,58,55,55,54,54,53,53,53,52,52,51,50,50,47,46,45,43,42,41, 41,40,40,39,39,38,38,37,37,36,35,35,35,35,33,33,33,32,32,32,30, 28,27,27,26,25,25,25,24,24,23,23,22,22,21,21,20 }; const int n2c2w2_g[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 98,98,97,97,96,96,96,95,95,95,95,93,92,92,90,90,90,89,88,88,88, 85,84,84,82,81,81,80,79,79,77,77,74,73,73,72,71,70,70,70,68,67, 66,65,65,64,63,63,63,60,58,58,58,57,56,56,56,56,56,55,52,51,51, 50,49,49,48,48,46,45,45,44,43,43,42,41,41,38,36,36,35,34,34,33, 32,31,31,30,30,30,29,28,27,26,26,26,23,22,21,20 }; const int n2c2w2_h[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,98,98,96,96,95,94,94,94,93,92,91,90,90,89,88,87, 84,83,82,79,78,78,78,77,76,74,74,74,73,73,72,71,70,69,69,67,64, 64,63,63,63,62,61,61,60,60,59,58,57,56,55,54,54,54,54,53,53,51, 51,50,50,50,49,48,48,48,47,45,44,44,44,43,42,42,41,41,40,38,38, 38,38,37,35,30,29,28,27,27,26,26,25,25,24,22,22,21 }; const int n2c2w2_i[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,96,96,92,92,91,91,91,89,87,87,86,86,86,85,84,83,82, 81,79,79,78,77,76,76,75,75,74,74,73,71,69,69,69,68,68,66,64,63, 63,63,62,62,61,61,58,57,56,56,54,53,53,52,52,52,50,50,50,49,49, 48,48,47,45,44,43,42,41,41,40,39,38,37,36,36,35,34,34,32,32,32, 31,26,25,24,24,24,24,24,23,23,22,22,21,20,20,20,20 }; const int n2c2w2_j[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 99,98,98,97,97,96,95,93,93,93,93,93,92,91,91,91,89,87,86,83,83, 82,81,80,80,80,76,76,76,75,75,75,75,75,73,71,71,70,70,70,69,67, 66,65,64,63,62,62,61,61,61,61,60,60,59,58,58,58,57,56,55,55,55, 54,53,52,52,52,52,51,51,50,49,47,46,46,45,45,44,44,43,43,39,39, 38,37,37,34,33,32,29,28,28,26,25,24,22,22,21,20 }; const int n2c2w2_k[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 98,98,98,97,96,95,94,94,92,90,88,88,86,86,86,85,85,83,83,81,80, 79,78,78,77,77,76,76,75,74,72,71,71,70,70,67,66,65,65,62,61,61, 60,59,59,59,58,58,57,57,57,56,55,53,53,53,52,52,50,50,49,49,49, 47,47,47,46,46,44,44,42,42,41,41,40,39,39,39,38,38,36,34,33,33, 32,29,29,26,26,26,26,25,25,25,25,24,22,21,21,20 }; const int n2c2w2_l[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,98,98,98,98,97,97,96,93,91,91,91,91,89,88,87,86,86,85, 83,83,83,82,82,80,79,78,78,76,75,75,75,74,72,72,72,72,71,69,68, 66,66,66,62,61,60,59,58,58,57,56,55,54,53,51,50,50,50,50,49,48, 48,47,47,47,47,46,46,45,45,42,41,40,40,39,39,38,38,37,36,36,36, 36,33,32,30,30,30,27,25,24,24,24,23,23,22,21,21,20 }; const int n2c2w2_m[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,99,98,98,98,98,97,96,95,95,93,92,92,91,90,90,89,88,88,87, 85,85,85,85,84,84,83,83,83,82,81,80,79,79,79,78,77,74,74,73,72, 71,64,61,60,60,59,58,57,57,57,54,54,54,52,51,50,50,49,49,49,48, 48,47,47,47,46,45,45,44,43,41,41,40,39,36,36,35,34,34,34,32,31, 30,29,29,28,28,28,27,26,26,25,25,24,23,23,22,22,20 }; const int n2c2w2_n[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 99,98,98,97,97,97,97,97,96,95,95,92,92,92,92,91,91,90,90,89,88, 87,85,85,83,82,82,82,82,81,79,77,76,76,75,75,74,74,71,71,70,69, 68,66,66,64,63,62,61,61,60,59,56,53,52,51,50,50,48,47,46,43,42, 41,41,40,40,40,39,39,38,36,34,34,33,33,33,32,32,32,31,31,30,30, 30,29,29,29,27,27,25,24,23,22,22,21,21,21,20,20 }; const int n2c2w2_o[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,98,98,97,97,97,95,93,93,89,89,88,87,86,84,83,82,81,80, 79,79,79,77,75,73,73,72,72,71,71,71,69,68,68,67,67,66,65,65,64, 63,60,59,59,58,58,57,57,56,56,55,55,55,55,54,54,54,53,51,51,50, 50,50,48,47,47,47,47,46,46,45,44,43,41,41,40,40,39,37,36,32,32, 31,29,28,27,27,27,27,26,25,25,25,25,24,24,22,21,20 }; const int n2c2w2_p[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 99,97,97,96,96,95,95,93,93,92,92,91,91,89,89,88,87,86,86,85,84, 84,83,82,79,78,78,76,72,71,71,71,70,68,68,68,67,66,65,64,62,62, 62,61,61,59,59,57,57,55,55,54,53,52,52,51,49,48,47,47,47,46,46, 45,45,44,43,43,42,42,40,39,39,39,39,39,38,37,36,36,35,34,33,32, 31,30,29,28,28,27,25,25,25,24,23,22,22,21,20,20 }; const int n2c2w2_q[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 98,97,97,97,97,96,96,96,96,95,93,93,92,91,90,90,88,88,87,87,87, 86,86,86,85,83,83,80,80,80,77,76,76,76,75,75,75,70,69,69,68,67, 66,65,65,65,64,61,60,59,59,58,58,58,55,55,54,54,54,54,54,53,53, 52,52,52,50,50,46,46,46,45,45,44,44,41,41,40,39,39,37,33,32,31, 30,30,29,29,29,28,26,24,24,23,22,22,21,21,20,20 }; const int n2c2w2_r[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,97,97,96,95,95,94,93,93,91,91,91,90,89,88,86,86, 85,82,82,82,81,81,80,79,79,78,78,76,74,73,69,68,67,67,66,66,66, 66,64,63,62,62,60,60,59,58,56,54,53,52,51,50,50,49,48,47,46,46, 44,44,43,43,43,43,43,42,42,41,41,40,39,36,35,34,33,33,33,32,32, 32,31,30,30,30,29,29,27,26,25,24,24,23,22,22,20,20 }; const int n2c2w2_s[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 99,99,98,97,96,95,94,94,94,93,93,92,92,92,92,90,90,90,89,88,88, 87,87,85,85,84,81,79,76,75,74,74,74,72,72,72,72,72,71,70,70,69, 68,68,68,67,67,65,65,64,64,63,63,63,61,61,61,60,60,59,58,57,57, 56,56,55,54,53,52,51,49,49,49,49,47,47,46,44,41,40,38,37,37,37, 35,34,34,33,32,32,31,30,29,27,25,24,23,22,22,20 }; const int n2c2w2_t[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,99,99,99,97,97,96,93,91,90,87,86,86,86,85,85,85,84, 84,83,83,82,81,81,79,77,75,75,74,74,73,72,72,72,71,70,70,70,70, 69,69,69,68,68,67,67,66,65,64,59,59,59,59,57,57,57,56,56,55,54, 54,52,49,49,48,45,44,44,43,42,42,42,42,41,40,40,39,39,39,38,38, 36,35,35,35,33,33,32,30,30,29,28,27,27,26,25,25,22 }; const int n2c2w4_a[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,93,93,93,93,93,93,92,92,92,91,91,90,90,89,86,86, 85,84,84,83,82,82,80,79,77,77,76,76,76,74,74,73,71,71,71,70,69, 68,68,68,68,67,67,66,64,64,63,62,62,60,60,60,58,56,56,55,55,51, 50,49,49,46,45,45,45,44,43,43,42,41,41,40,40,40,40,38,38,37,36, 36,36,36,36,35,34,34,33,32,32,31,31,30,30,30,30,30 }; const int n2c2w4_b[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,99,98,96,96,96,96,95,94,93,92,92,90,90,90,89,88,86, 84,84,84,80,80,79,79,79,78,75,75,75,75,74,74,74,72,72,71,71,70, 70,70,69,69,69,68,67,67,67,67,66,66,65,63,61,60,60,58,57,57,57, 56,56,55,55,54,53,52,51,50,50,47,47,46,45,43,43,43,42,41,41,40, 40,39,39,39,38,37,37,37,37,34,34,33,33,32,32,32,30 }; const int n2c2w4_c[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,100,99,97,96,95,94,94,94,93,90,90,89,89,89,89,88, 88,87,87,87,86,85,84,84,84,83,83,83,82,80,80,79,78,78,76,75,75, 74,70,70,69,69,69,69,68,68,68,68,67,66,65,65,64,64,64,63,63,62, 62,61,61,60,60,59,58,58,57,57,55,54,53,53,51,51,49,49,49,48,47, 47,46,46,42,41,38,37,35,34,33,32,32,32,31,31,30,30,30 }; const int n2c2w4_d[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 99,99,99,98,98,98,97,97,97,96,96,95,94,94,92,91,90,88,88,87,86, 86,86,86,84,84,83,82,82,82,81,81,81,81,80,79,78,77,77,76,75,75, 75,75,74,74,73,72,72,69,67,66,63,63,63,61,60,60,59,59,58,58,56, 56,55,55,54,52,50,49,48,48,48,47,47,47,46,46,44,42,40,40,39,38, 37,37,36,36,36,35,34,33,33,32,31,31,31,30,30,30 }; const int n2c2w4_e[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,99,98,98,98,98,98,97,97,96,95,95,95,93,93,91,89,89, 88,88,87,87,87,86,84,84,84,84,83,83,83,83,81,79,77,76,74,73,71, 70,69,69,68,68,68,66,66,64,64,64,64,63,61,61,60,60,60,60,59,58, 58,56,56,56,54,54,51,51,50,50,48,48,47,46,45,45,43,43,43,42,42, 41,40,37,36,36,36,36,34,33,33,33,33,32,31,31,30,30 }; const int n2c2w4_f[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,97,97,96,96,95,95,94,92,92,90,90,89,87,87,86,85, 85,85,84,84,84,83,82,81,81,80,80,79,79,79,78,78,76,75,74,73,72, 72,70,70,68,67,65,65,64,64,63,63,63,62,62,61,59,58,58,57,57,56, 55,54,54,54,53,52,51,50,47,47,43,42,42,42,42,41,41,40,40,39,38, 38,38,37,36,35,35,35,35,34,34,33,33,33,32,32,31,31 }; const int n2c2w4_g[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,99,99,98,96,96,96,95,95,92,91,91,91,91,91,88,87,87, 87,87,85,85,84,84,82,81,81,80,79,78,77,75,74,74,74,74,72,71,70, 70,70,70,70,69,69,68,68,67,66,66,65,65,64,63,63,62,61,61,60,58, 58,56,55,54,54,54,53,53,53,53,52,51,47,47,45,45,44,44,43,43,42, 41,41,39,38,37,36,36,36,35,35,34,34,33,33,32,32,30 }; const int n2c2w4_h[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,99,98,97,97,97,96,96,96,96,95,94,93,89,88,87,86,85, 85,85,85,84,84,84,83,83,82,81,81,81,80,80,79,78,78,77,77,77,76, 75,72,72,70,69,69,69,69,66,66,65,64,64,63,63,62,59,59,58,58,57, 57,57,55,54,52,52,51,51,51,48,47,47,47,46,46,45,45,45,44,43,43, 42,42,42,42,39,37,37,37,35,34,33,32,32,31,31,30,30 }; const int n2c2w4_i[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,97,94,94,94,94,93,93,92,91,91,91,90,90,89,88,87, 87,87,85,84,83,83,82,82,82,82,79,78,78,77,74,74,74,74,72,72,71, 71,70,68,67,67,66,66,64,63,63,62,61,61,60,60,59,59,58,56,53,52, 52,52,52,52,52,52,51,51,50,49,49,48,47,46,46,45,45,45,43,41,40, 40,39,38,38,38,37,37,35,35,33,33,32,31,30,30,30,30 }; const int n2c2w4_j[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,99,98,98,98,98,97,97,96,95,95,93,92,91,90,90,90,89, 88,88,86,86,85,85,83,82,81,81,80,76,76,76,74,74,73,73,73,71,71, 71,70,70,69,68,68,67,67,67,66,66,66,65,64,64,64,62,61,59,58,58, 55,55,55,54,52,51,50,50,49,49,49,49,48,47,47,47,44,44,43,43,40, 40,38,38,38,37,37,37,36,36,36,36,35,33,32,32,31,30 }; const int n2c2w4_k[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 99,97,97,97,96,95,94,94,93,93,93,91,90,89,88,86,84,83,83,83,82, 82,81,81,81,80,78,78,78,77,75,75,74,73,73,73,73,71,71,71,70,69, 69,68,68,67,66,65,64,64,63,63,63,63,62,62,61,60,59,58,57,57,57, 57,56,55,54,54,53,52,52,52,52,50,50,49,49,49,48,48,46,45,45,44, 44,42,39,39,37,34,34,34,34,33,33,32,31,31,30,30 }; const int n2c2w4_l[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,97,97,97,96,93,91,89,89,88,88,88,85,84,82,82,80,80, 78,78,78,78,78,77,77,76,76,75,75,75,74,74,74,72,71,70,69,69,69, 67,67,67,66,65,65,65,64,63,63,61,61,60,60,60,60,59,58,58,57,57, 57,56,56,54,53,53,52,52,51,51,47,47,46,45,45,45,44,44,43,43,43, 43,42,37,37,37,35,34,34,33,33,33,33,32,32,31,30,30 }; const int n2c2w4_m[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,99,98,97,96,96,95,94,94,94,93,93,92,92,91,91,91,90,90,90, 89,86,86,85,84,84,83,82,82,77,77,77,77,77,76,75,75,74,73,72,71, 71,70,70,70,70,69,69,68,67,67,66,65,64,64,63,61,60,58,58,58,57, 57,57,54,54,54,53,52,52,52,51,51,51,48,46,46,46,45,44,44,44,43, 43,43,41,39,38,38,36,36,35,35,34,32,31,31,31,30,30 }; const int n2c2w4_n[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,97,95,95,94,94,94,93,92,92,91,91,91,90,89,87,87, 86,86,85,84,81,81,81,81,80,79,79,79,79,78,77,75,75,75,74,74,73, 73,73,71,71,70,70,69,67,67,66,64,64,63,63,63,62,61,61,61,61,60, 59,59,59,59,58,58,56,56,54,54,53,53,53,52,52,51,49,45,44,44,43, 43,39,37,37,37,37,37,37,36,36,35,33,32,32,31,31,30 }; const int n2c2w4_o[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,99,97,97,97,94,94,93,93,93,92,92,92,91,91,90,90,90,88,88, 88,88,87,87,87,86,86,86,86,85,85,84,84,83,83,81,81,80,79,79,79, 79,77,74,74,73,72,72,70,70,67,67,66,66,66,65,64,64,64,63,62,61, 59,58,54,53,53,52,51,47,47,45,44,43,43,42,41,41,41,39,39,39,39, 37,37,36,35,35,34,34,33,33,33,32,31,31,30,30,30,30 }; const int n2c2w4_p[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,99,98,97,97,96,96,95,94,94,93,91,89,89,89,87,87,86, 85,84,84,84,83,83,83,83,79,79,76,76,75,74,73,73,72,71,71,70,70, 70,70,68,67,67,66,64,64,63,62,62,62,62,62,59,58,58,56,56,56,54, 54,54,53,53,53,51,51,50,49,49,48,48,48,47,46,46,45,44,43,43,43, 42,41,41,41,41,40,39,38,38,38,38,37,36,35,32,31,30 }; const int n2c2w4_q[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 99,98,98,98,96,95,94,91,90,90,90,89,88,86,85,85,84,83,83,83,83, 82,80,80,79,79,78,78,77,77,77,77,77,76,76,76,76,76,76,76,76,73, 73,72,71,71,70,70,68,67,67,67,66,65,64,63,62,62,62,61,59,57,56, 56,56,56,55,54,54,54,54,53,52,52,51,51,50,48,47,47,47,45,45,44, 44,42,41,41,38,37,36,34,34,34,32,32,32,31,30,30 }; const int n2c2w4_r[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,97,97,97,96,94,94,93,93,93,91,89,89,89,89,89,88, 87,87,86,86,85,85,84,83,80,79,78,77,77,77,73,73,71,70,70,69,69, 68,67,65,63,62,62,62,62,61,60,60,59,59,59,58,58,58,57,57,56,56, 55,54,53,52,51,49,48,47,46,45,45,45,44,43,42,42,42,42,41,40,39, 39,38,37,35,35,35,35,34,33,33,32,32,31,30,30,30,30 }; const int n2c2w4_s[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 100,100,97,96,96,95,94,94,94,90,90,90,87,86,86,86,83,83,83,83, 83,82,82,82,80,79,79,78,77,77,77,76,76,75,71,71,71,70,70,68,68, 67,67,66,66,65,63,63,63,62,61,61,60,60,59,59,59,58,56,55,53,53, 53,52,51,49,49,47,45,45,45,45,45,44,42,42,42,41,41,41,41,41,39, 39,38,38,38,37,33,33,33,33,32,32,32,31,31,31,31,30 }; const int n2c2w4_t[] = { 120, // Capacity 100, // Number of items // Size of items (sorted) 99,99,98,98,97,97,97,96,93,92,91,91,90,89,88,88,87,86,86,85,85, 84,84,83,83,81,80,80,78,76,75,75,74,72,72,71,69,69,68,68,68,68, 67,66,66,65,62,61,61,60,60,60,59,58,58,57,57,57,56,56,54,54,53, 53,53,52,52,51,50,50,50,49,48,48,46,46,46,46,45,45,43,42,42,41, 41,41,38,37,36,36,35,34,34,34,33,33,33,32,30,30 }; const int n2c3w1_a[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 99,99,97,97,96,96,96,94,93,93,92,90,90,90,89,88,88,87,83,82,81, 81,81,80,79,78,77,77,76,76,75,74,74,74,71,69,69,68,67,67,66,62, 59,58,57,56,55,54,54,53,53,52,52,49,49,48,47,46,45,44,43,43,42, 42,39,38,37,35,35,34,32,32,31,31,30,29,24,24,21,21,21,20,18,16, 13,12,11,9,7,7,7,6,5,5,4,4,2,2,1,1 }; const int n2c3w1_b[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,96,94,93,92,92,91,91,91,89,88,86,86,86,85,84,84,84,81, 81,80,79,79,78,77,77,77,77,73,71,69,67,66,65,65,64,64,64,62,60, 57,57,56,56,56,56,53,52,51,51,50,50,48,47,46,45,44,43,42,41,41, 40,40,39,39,38,37,36,36,36,34,33,31,31,29,29,26,25,22,22,22,20, 17,11,11,10,9,7,7,7,7,6,5,3,2,2,1,1,1 }; const int n2c3w1_c[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 98,97,97,97,96,95,95,95,95,93,92,88,87,86,86,85,81,81,80,78,78, 78,77,77,76,75,74,72,71,70,70,69,69,67,67,67,65,65,65,64,64,63, 62,58,58,56,56,56,55,52,51,50,50,50,49,49,47,45,43,43,43,42,41, 40,40,40,39,38,36,35,33,33,32,30,29,28,28,25,25,22,22,20,20,18, 17,16,15,11,11,10,8,5,5,5,4,4,2,2,2,1 }; const int n2c3w1_d[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 99,99,97,97,96,96,94,92,92,92,92,91,90,90,89,89,88,85,84,84,84, 80,80,78,78,77,77,77,76,75,75,75,74,73,73,72,71,71,70,68,66,65, 64,62,61,60,57,56,56,55,55,54,54,52,50,50,48,48,47,47,45,45,45, 44,42,40,40,39,38,38,38,36,34,32,30,29,29,29,28,28,28,26,25,25, 24,21,18,17,14,13,12,12,10,10,9,9,8,5,4,1 }; const int n2c3w1_e[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,98,96,93,91,89,89,88,86,86,85,85,85,84,84,82,82, 81,80,79,78,77,76,75,75,73,72,71,70,69,68,68,66,66,64,63,63,62, 62,58,57,55,54,52,51,50,50,49,48,48,46,46,44,43,41,41,38,37,34, 33,31,31,31,31,29,29,28,28,27,27,27,26,26,26,25,22,22,21,20,20, 19,18,18,16,15,15,15,14,14,13,9,8,8,8,2,2,2 }; const int n2c3w1_f[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,98,98,97,97,96,94,92,90,87,86,84,84,83,83,81,81,81, 81,80,77,77,77,75,74,74,74,73,70,69,69,68,67,66,66,65,65,64,63, 62,62,61,60,59,57,57,57,57,56,56,54,52,50,50,47,45,43,43,43,40, 38,37,37,36,36,35,35,33,33,32,31,31,29,27,27,24,23,19,18,16,14, 13,13,12,12,11,10,9,8,8,8,4,4,4,3,2,2,1 }; const int n2c3w1_g[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 99,98,96,94,93,92,91,91,88,88,87,87,87,86,85,84,83,82,81,79,79, 77,75,73,73,73,72,71,69,68,67,66,65,65,64,64,62,62,61,60,60,57, 55,55,54,50,50,50,49,48,48,47,45,44,44,44,42,42,39,38,35,35,34, 34,34,33,33,32,31,31,29,29,28,26,25,23,21,21,20,19,18,18,16,16, 15,14,13,13,11,11,11,10,8,6,6,5,5,4,3,2 }; const int n2c3w1_h[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,98,98,98,94,93,91,91,89,87,87,87,86,86,86,85,85,84,83, 83,81,81,80,78,77,77,76,76,75,75,73,73,70,69,69,65,63,63,63,62, 62,62,60,59,58,57,57,55,54,53,52,51,51,50,49,49,48,47,47,44,44, 42,38,37,37,32,32,32,30,30,29,28,27,27,25,25,25,23,23,23,22,22, 21,20,19,17,15,14,13,13,10,9,8,6,5,4,3,2,1 }; const int n2c3w1_i[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,97,96,94,94,92,92,92,91,91,89,87,86,86,86,85,85,83,83, 80,80,78,76,75,73,72,68,66,65,64,63,63,62,62,61,60,58,58,56,56, 56,54,54,53,53,52,51,51,50,49,49,49,48,47,47,46,45,43,43,42,42, 42,40,37,37,36,36,34,34,33,33,31,29,25,24,24,23,21,21,20,17,16, 15,13,13,12,11,11,11,10,9,9,8,8,7,7,5,3,1 }; const int n2c3w1_j[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 99,99,98,97,97,95,95,92,91,90,90,89,88,87,86,86,86,85,83,83,83, 82,80,78,78,77,76,76,75,75,74,72,70,69,67,62,61,61,59,59,59,58, 58,56,56,55,52,52,52,51,51,49,47,47,46,44,43,42,42,39,37,37,36, 31,31,31,28,27,25,25,25,23,21,19,18,17,16,16,16,16,15,14,14,14, 14,13,13,10,10,9,7,7,6,6,5,4,2,2,1,1 }; const int n2c3w1_k[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 98,98,96,95,95,94,94,93,93,92,92,92,90,89,89,88,87,87,87,87,85, 85,83,83,82,81,80,80,79,76,75,75,74,73,71,70,68,68,66,66,63,63, 63,59,59,58,58,58,58,56,55,54,53,51,49,49,47,46,46,45,44,44,43, 42,40,37,37,37,36,33,33,33,30,30,29,26,26,26,26,25,24,23,22,21, 21,20,18,17,17,16,15,10,7,6,5,4,3,2,1,1 }; const int n2c3w1_l[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,97,97,96,95,95,95,93,93,90,89,89,86,85,82,81,79,79, 78,77,77,76,76,76,74,74,74,73,71,71,70,70,69,67,66,66,65,65,61, 61,61,60,59,59,58,57,54,52,48,48,47,47,46,46,46,46,44,44,42,42, 41,41,39,39,39,39,36,35,34,31,31,26,26,26,24,22,21,21,19,18,17, 17,16,16,15,15,14,14,13,12,10,7,7,7,3,3,2,2 }; const int n2c3w1_m[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,100,98,97,95,94,92,89,87,87,83,81,81,81,80,80,78,77,75,74, 74,71,69,68,67,66,66,65,64,64,64,64,64,64,64,63,58,56,55,54,52, 50,49,49,46,46,45,44,43,41,40,40,37,35,35,35,34,34,33,32,32,32, 31,30,29,27,27,26,25,25,24,24,23,22,21,21,19,19,19,18,18,18,17, 17,15,14,14,14,11,11,8,6,6,5,4,3,2,2,1,1 }; const int n2c3w1_n[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 98,98,96,94,94,91,89,88,88,87,87,87,86,85,85,84,84,82,81,81,80, 80,79,79,78,76,75,72,72,70,69,69,68,67,66,65,64,63,58,57,54,54, 53,53,53,53,50,49,47,44,44,43,43,42,42,40,38,38,37,36,34,33,33, 30,30,30,29,26,25,25,23,23,20,20,19,19,16,16,15,15,15,15,13,12, 12,11,10,10,9,9,7,6,6,4,4,3,2,2,1,1 }; const int n2c3w1_o[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,98,96,96,94,93,93,92,91,91,90,89,89,86,86,85,84,83,82,82, 79,79,79,79,77,75,75,75,74,74,74,74,71,71,70,68,68,67,66,63,63, 62,62,60,59,59,58,55,54,54,52,49,48,47,47,46,45,44,43,43,42,40, 39,39,37,37,36,35,34,33,28,26,26,25,25,23,22,21,20,19,19,19,18, 17,17,16,12,12,12,10,10,9,9,8,7,7,7,6,3,2 }; const int n2c3w1_p[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,97,96,94,94,93,92,92,91,90,90,87,86,86,86,84,84,82,81,80, 77,76,76,76,75,74,74,73,73,72,72,71,71,70,70,70,69,68,68,67,66, 66,65,64,63,62,62,60,59,59,59,59,57,52,52,50,49,48,47,46,44,42, 41,38,36,36,34,33,30,28,27,25,25,24,22,20,20,17,16,16,15,15,15, 13,13,12,11,11,10,10,10,10,9,8,8,6,5,5,4,3 }; const int n2c3w1_q[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,97,94,93,91,89,88,86,85,85,84,83,81,81,80,79,78,77,76, 75,75,74,71,71,70,69,68,68,68,68,66,64,63,63,62,62,62,61,59,58, 56,55,55,54,54,54,54,52,52,47,46,46,46,45,44,41,41,39,39,39,38, 38,37,36,36,35,35,34,34,34,33,31,30,29,29,29,29,28,28,27,27,27, 26,26,26,23,23,22,20,20,20,17,14,8,8,6,3,1,1 }; const int n2c3w1_r[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,98,95,95,94,92,92,92,90,88,88,87,87,87,86,86,83,83,82,82, 81,80,77,76,75,75,75,74,73,70,70,68,66,66,66,65,64,64,60,59,58, 56,55,52,52,52,52,52,51,49,49,48,46,44,42,42,41,41,41,40,40,39, 38,36,36,35,34,34,34,31,31,30,27,27,27,24,24,22,21,20,15,15,15, 14,14,12,12,11,10,9,7,6,6,5,4,4,3,3,2,1 }; const int n2c3w1_s[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,97,96,95,95,94,91,91,89,88,88,86,83,82,79,78,78, 76,75,75,74,72,71,70,70,69,69,69,68,66,65,64,64,63,63,62,62,61, 60,58,58,57,56,56,55,55,54,52,52,49,49,49,48,48,47,46,46,45,45, 41,40,40,39,37,36,36,36,35,35,35,35,33,32,31,31,31,28,28,25,24, 24,21,20,19,19,19,18,16,16,16,16,13,13,11,8,6,5 }; const int n2c3w1_t[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,98,96,95,95,95,91,90,90,90,89,88,85,85,83,81,80,80,80, 79,79,78,77,77,77,76,76,75,74,74,73,73,71,68,67,66,65,64,63,62, 58,56,56,55,53,51,51,51,50,49,46,44,44,43,43,42,42,42,40,39,38, 37,37,37,36,36,36,34,34,34,33,32,31,30,30,29,27,26,26,25,22,19, 18,17,16,16,15,14,12,12,10,9,7,6,5,4,4,3,1 }; const int n2c3w2_a[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,98,96,96,96,96,96,96,94,93,93,92,92,92,91,91,91,90,87, 84,83,83,79,78,78,77,77,76,76,75,75,75,73,73,73,72,72,72,72,72, 71,71,70,70,66,66,65,64,63,59,58,57,56,56,55,55,54,53,53,52,51, 49,47,46,46,45,44,43,43,42,41,41,39,39,38,37,35,35,34,34,33,33, 32,32,32,32,31,30,30,29,28,24,23,22,22,22,22,21,20 }; const int n2c3w2_b[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 99,97,96,96,96,95,95,95,95,94,94,93,92,92,92,91,91,91,90,89,89, 89,88,88,88,87,86,86,85,85,84,83,82,81,81,77,77,76,76,75,73,73, 73,72,72,72,72,70,69,67,66,65,65,64,62,61,60,58,57,56,55,53,52, 52,52,48,48,46,45,43,42,39,39,38,38,38,38,37,36,35,34,34,32,31, 30,30,28,27,27,27,25,24,24,24,23,23,22,22,22,21 }; const int n2c3w2_c[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,97,97,97,96,96,95,95,95,94,93,93,93,92,91,89,88, 87,86,84,84,83,83,82,81,81,81,78,78,75,74,73,72,72,71,70,68,67, 66,65,64,63,63,62,60,60,59,59,58,57,56,56,55,54,51,49,49,48,47, 47,46,45,45,45,45,44,44,44,44,43,41,41,40,39,39,39,37,37,37,35, 35,34,32,31,31,30,28,26,25,24,24,23,23,22,21,20,20 }; const int n2c3w2_d[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,99,99,98,97,96,95,95,95,94,94,91,91,90,90,88,86,84, 83,83,79,78,77,74,74,72,72,70,69,69,69,69,68,68,68,67,67,67,66, 66,65,64,63,63,63,63,63,62,62,61,60,60,59,59,59,59,57,55,55,55, 53,53,52,52,51,50,49,48,47,47,45,44,44,43,43,42,42,41,41,38,37, 36,36,36,36,34,34,29,29,28,27,25,24,23,23,22,22,20 }; const int n2c3w2_e[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 99,98,98,98,93,93,92,90,90,89,89,87,85,85,84,81,81,81,80,77,76, 75,75,74,74,73,71,70,70,69,68,67,67,67,66,66,65,65,64,63,62,62, 61,61,59,58,57,57,57,56,55,54,54,54,52,52,52,52,52,51,51,50,50, 50,49,47,47,47,47,47,45,45,44,43,42,42,39,39,39,39,39,39,38,37, 37,37,34,33,33,32,32,31,31,31,29,28,28,27,25,22 }; const int n2c3w2_f[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,98,97,97,96,95,94,92,92,92,90,86,86,85,85,83,83, 74,74,73,73,73,72,71,71,71,70,70,70,70,69,69,67,67,66,66,66,66, 65,65,63,63,62,61,57,56,56,56,55,54,54,53,53,53,51,49,47,47,47, 46,46,45,44,44,44,42,41,40,40,37,37,35,35,35,35,33,32,32,32,32, 31,31,30,28,28,27,27,27,26,24,23,22,21,21,21,21,20 }; const int n2c3w2_g[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,99,97,97,96,96,95,94,94,93,93,92,91,91,90,89,88,88, 87,87,86,85,84,83,83,83,82,82,78,75,75,73,73,72,72,70,69,69,67, 67,65,65,63,61,61,60,59,58,58,58,58,57,57,57,55,54,54,54,52,52, 52,51,48,47,47,47,46,45,45,45,44,42,41,40,37,35,34,31,30,29,27, 26,26,26,25,25,25,24,24,24,24,23,23,23,23,23,22,20 }; const int n2c3w2_h[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 99,98,98,98,96,92,92,91,89,87,86,86,85,85,82,81,81,80,80,77,77, 76,76,75,74,74,74,73,71,71,69,69,68,68,66,66,65,64,63,63,63,62, 61,59,59,57,56,55,54,54,53,53,53,51,50,50,49,49,49,48,48,47,47, 46,44,44,44,43,42,41,36,36,36,36,36,35,33,33,32,32,32,32,30,30, 30,30,29,28,28,28,25,25,25,24,24,22,22,22,20,20 }; const int n2c3w2_i[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 99,99,99,99,98,97,97,97,96,95,95,95,93,93,93,92,92,91,91,91,90, 90,89,88,87,87,86,84,83,82,81,80,79,79,79,78,78,77,77,76,74,73, 72,71,70,69,69,68,66,66,65,65,65,64,63,63,63,63,62,61,60,60,59, 57,57,54,54,52,49,48,48,47,47,47,47,46,46,45,44,43,43,37,37,36, 36,34,33,32,30,30,30,27,25,22,22,22,21,21,20,20 }; const int n2c3w2_j[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,99,99,98,97,97,96,96,96,95,94,94,94,93,93,93,91,90, 89,87,87,86,85,84,83,83,82,81,80,80,80,79,79,78,78,78,78,77,76, 75,74,72,72,72,71,70,70,69,67,66,66,63,62,60,60,57,56,56,56,56, 53,52,52,50,50,48,48,45,44,44,44,44,43,40,38,38,38,37,37,37,36, 36,35,33,32,30,30,28,28,27,27,26,26,25,24,23,22,22 }; const int n2c3w2_k[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,99,98,98,97,95,95,95,94,94,93,93,93,90,89,87,87,87, 87,86,85,85,84,84,83,83,82,81,81,80,79,79,78,74,74,73,72,71,71, 70,70,69,68,67,67,67,66,64,62,62,61,61,59,59,58,56,55,54,52,52, 52,52,51,50,50,48,48,48,47,47,42,41,39,38,36,34,34,34,34,33,33, 32,32,32,31,31,30,29,29,27,27,26,26,25,24,23,20,20 }; const int n2c3w2_l[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,100,98,98,96,95,95,93,93,93,92,92,91,91,91,90,90,89,87,87, 85,85,84,84,82,82,81,80,78,78,75,74,72,72,71,70,69,68,67,66,65, 65,65,65,64,63,63,63,61,61,61,61,61,61,60,60,59,58,57,57,57,56, 54,54,53,53,53,52,49,48,47,47,47,45,43,43,42,40,40,40,40,38,36, 36,34,32,32,29,28,27,27,27,25,23,23,23,22,22,22,21 }; const int n2c3w2_m[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,98,98,98,97,96,95,95,94,92,92,91,91,91,90,90,89,89, 89,89,87,87,85,84,84,83,82,81,78,78,78,77,77,77,76,75,74,72,72, 71,69,69,68,67,67,67,66,65,62,62,62,61,60,60,60,60,60,59,58,58, 57,55,55,54,52,52,48,46,46,45,45,44,44,43,43,43,42,42,41,41,40, 40,37,35,33,33,33,32,31,30,29,29,29,25,25,24,23,21 }; const int n2c3w2_n[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,100,98,96,94,94,93,92,92,92,91,91,90,89,89,87,87,85,85,81, 81,81,80,79,79,78,78,78,78,78,77,77,76,76,76,76,75,75,75,74,73, 72,72,69,68,67,66,66,65,64,63,62,61,58,56,56,55,55,54,54,51,49, 49,49,48,47,47,46,44,44,44,43,43,40,39,38,38,38,38,37,37,36,35, 35,34,32,32,32,31,30,27,27,25,25,24,23,23,22,21,20 }; const int n2c3w2_o[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,99,98,97,96,95,95,95,94,93,93,93,92,92,91,88,88,88, 88,87,86,86,85,85,85,85,84,82,82,81,81,81,78,78,77,77,76,76,75, 72,72,72,71,71,70,68,68,67,66,64,64,63,63,63,63,61,60,60,57,56, 56,55,55,55,53,53,52,52,51,51,50,49,48,48,47,45,45,43,42,40,39, 38,38,37,37,37,37,36,34,34,33,33,33,32,31,26,25,21 }; const int n2c3w2_p[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,100,99,99,98,98,97,96,96,94,94,94,92,91,90,88,87, 86,85,84,83,82,82,82,81,80,79,75,74,73,72,72,72,72,71,69,68,68, 67,65,65,65,65,65,64,62,60,60,59,59,58,57,57,57,56,55,54,54,53, 52,52,49,49,47,45,45,45,43,42,41,41,40,39,39,36,35,34,34,34,33, 31,31,31,30,30,30,29,28,27,26,26,24,23,22,21,20,20,20 }; const int n2c3w2_q[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,97,95,95,94,94,93,92,92,92,91,89,88,88,88,87,86,86,85,85, 83,83,82,81,80,75,75,75,74,74,73,73,72,72,69,69,69,69,69,69,68, 68,68,68,66,65,64,63,63,63,63,61,59,59,58,58,57,56,53,52,50,50, 49,48,48,46,46,45,44,43,43,42,42,42,42,42,42,41,41,39,38,38,38, 37,37,35,34,32,31,30,29,28,28,27,25,24,24,22,21,21 }; const int n2c3w2_r[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,98,98,97,97,96,96,96,96,92,91,91,87,86,84,83,82,82,81,81, 81,81,80,79,79,79,78,78,78,76,76,76,76,76,75,73,73,71,71,70,69, 69,66,66,65,63,62,61,60,58,57,57,57,55,52,51,49,46,46,46,46,46, 46,45,45,45,44,43,43,43,42,42,42,41,40,40,37,37,37,35,35,34,34, 33,32,32,27,27,26,26,25,24,23,22,22,22,21,20,20,20 }; const int n2c3w2_s[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,99,99,99,98,97,97,97,96,96,95,95,95,94,92,91,91,90, 90,89,87,84,83,83,83,82,82,82,82,81,80,80,79,79,79,78,78,77,77, 77,75,74,73,69,68,65,64,64,63,62,62,62,62,62,61,61,60,58,57,56, 55,51,49,48,47,46,45,45,44,43,42,41,39,38,38,37,36,36,36,35,34, 34,34,33,33,32,32,31,31,29,28,26,26,25,25,20,20,20 }; const int n2c3w2_t[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,97,95,95,94,93,93,92,91,90,89,89,88,88,86,86,85,84, 84,82,82,82,81,81,80,80,79,79,77,77,76,74,74,74,73,72,71,70,69, 69,69,67,67,66,66,65,64,64,63,63,62,61,61,61,61,60,59,59,59,58, 57,57,57,57,56,55,54,54,54,51,50,50,50,49,48,47,46,46,45,44,42, 41,40,40,40,39,38,35,34,29,27,26,25,25,23,23,22,20 }; const int n2c3w4_a[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 99,99,98,98,97,97,96,96,96,96,95,94,93,92,91,89,87,87,87,86,85, 84,84,83,83,83,82,81,80,79,79,79,77,77,76,74,74,74,73,72,72,71, 71,69,69,69,66,65,64,64,64,63,62,61,60,59,57,57,57,56,56,55,54, 53,52,52,51,51,49,47,47,46,46,46,46,46,46,44,43,43,43,41,40,40, 39,39,38,36,36,35,34,34,33,32,32,31,31,30,30,30 }; const int n2c3w4_b[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,98,97,95,95,95,94,94,94,94,93,93,92,91,90,90,90, 90,89,89,88,86,85,85,84,83,83,82,81,81,80,79,79,77,76,76,73,72, 71,71,71,69,69,68,67,67,63,61,61,61,60,60,59,58,57,57,57,57,56, 56,56,56,56,55,53,53,53,51,51,49,48,48,47,47,47,47,46,46,45,45, 44,44,43,43,42,42,39,38,38,37,36,35,33,32,31,30,30 }; const int n2c3w4_c[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 99,99,98,97,96,93,92,92,91,91,91,90,90,90,89,88,88,87,85,85,84, 84,84,82,80,80,80,80,78,77,76,75,74,73,72,70,70,69,68,68,67,66, 65,65,65,65,64,62,59,59,59,58,58,57,57,56,56,56,55,55,54,51,51, 50,49,48,46,46,46,46,46,46,45,44,44,41,41,41,41,40,40,39,39,38, 37,36,36,36,35,35,35,35,34,34,34,34,32,32,31,30 }; const int n2c3w4_d[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,99,99,99,98,98,98,97,97,97,94,94,93,93,92,90,89,88, 87,86,85,83,83,82,81,80,79,78,77,76,75,73,73,73,73,72,72,71,71, 71,70,68,67,66,65,64,64,64,64,63,62,62,62,61,57,56,55,55,54,53, 53,53,53,52,52,52,51,51,49,49,48,48,45,45,45,45,44,44,43,42,41, 41,40,40,38,35,34,34,34,34,33,33,32,32,32,30,30,30 }; const int n2c3w4_e[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,99,98,98,98,96,96,95,94,94,93,93,92,92,91,91,90,89, 88,88,88,88,88,87,86,86,85,85,85,85,84,84,84,83,83,83,81,80,80, 80,79,77,77,75,75,74,72,72,69,68,68,66,65,65,64,64,63,61,61,60, 60,58,58,58,58,57,57,56,56,55,54,49,49,47,47,47,46,45,44,43,42, 42,41,40,40,36,34,34,33,33,32,32,32,32,32,31,30,30 }; const int n2c3w4_f[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,98,97,96,94,93,92,91,90,89,89,87,87,85,85,85,84,84, 84,83,83,83,83,83,81,81,80,80,79,79,79,78,78,77,76,75,74,74,74, 73,73,71,71,71,71,70,69,69,68,68,68,66,66,65,64,63,63,63,62,61, 59,58,58,57,56,56,56,56,55,52,50,49,47,46,46,45,45,43,43,43,42, 42,41,41,38,37,37,36,36,35,35,34,34,34,33,31,31,30 }; const int n2c3w4_g[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,98,97,97,95,94,94,94,93,93,91,90,90,89,88,88,86,85, 85,84,84,84,82,82,82,81,81,81,80,75,75,75,75,74,74,74,73,72,71, 70,69,69,69,68,67,65,64,64,63,63,63,63,61,61,59,58,58,58,56,56, 55,54,53,53,53,51,50,49,48,48,46,46,44,44,44,43,43,43,43,42,42, 42,41,41,40,40,39,39,39,39,38,36,35,35,35,33,32,32 }; const int n2c3w4_h[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,97,97,97,95,95,95,94,94,94,94,93,93,93,92,92,90,89,86,85, 83,82,82,81,79,78,77,76,75,74,74,74,74,74,73,73,72,71,71,71,70, 69,68,66,66,65,64,64,64,63,63,62,62,62,61,61,61,59,59,59,58,58, 57,57,55,54,52,50,49,48,47,46,46,45,45,44,44,44,42,42,41,41,40, 39,39,39,37,37,36,36,36,35,35,35,32,32,32,31,30,30 }; const int n2c3w4_i[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 99,99,99,99,98,97,97,92,92,91,91,90,89,89,88,88,88,86,85,84,83, 83,81,80,80,80,80,80,79,79,78,77,77,77,77,76,76,75,74,72,72,72, 71,70,69,69,69,67,67,66,66,66,66,65,64,61,60,59,59,59,58,57,56, 56,54,53,52,51,51,51,50,50,50,50,49,48,48,47,47,47,45,43,43,43, 42,41,41,38,37,37,36,35,33,32,32,32,31,31,30,30 }; const int n2c3w4_j[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,98,98,96,96,95,95,93,92,92,91,91,90,88, 85,84,84,82,81,80,80,76,75,74,73,73,72,71,71,70,69,69,68,67,65, 65,65,64,64,64,64,63,62,61,61,61,60,57,57,56,56,54,52,52,51,51, 51,50,48,48,48,47,46,46,46,45,45,45,44,44,44,43,43,43,42,42,41, 41,41,41,39,39,38,37,36,36,36,34,34,33,33,32,32,31 }; const int n2c3w4_k[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,98,96,96,95,94,94,94,93,93,93,93,91,91,91,90,90,89, 89,87,87,87,87,85,84,84,84,83,82,81,81,81,80,79,79,78,78,77,77, 77,75,75,74,74,74,74,69,68,68,67,67,65,65,64,63,61,59,59,58,58, 58,58,57,56,55,55,55,54,54,53,53,52,51,50,50,50,49,49,48,48,48, 48,47,47,43,43,42,40,40,39,37,37,35,34,34,33,31,30 }; const int n2c3w4_l[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 99,97,96,95,94,93,92,92,92,91,90,88,88,88,86,86,86,86,85,85,85, 85,85,83,83,83,82,81,81,80,79,78,76,76,75,75,74,74,74,74,74,73, 73,72,71,70,70,70,69,68,67,66,65,65,64,64,63,61,61,60,59,58,58, 58,57,57,57,56,56,56,55,54,54,53,53,53,53,50,48,48,48,46,46,46, 46,45,43,43,42,41,40,39,37,35,35,34,34,31,31,30 }; const int n2c3w4_m[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,100,100,99,98,98,95,92,91,91,89,89,89,89,88,88,87,86,86,85, 85,84,84,83,82,82,81,81,81,80,79,79,79,78,78,78,77,76,75,75,74, 74,73,72,72,70,69,68,68,67,66,65,64,63,62,62,62,60,59,58,56,56, 55,53,53,53,51,51,50,50,46,44,44,44,44,43,42,42,41,41,40,39,39, 38,37,37,36,36,36,36,35,35,35,34,33,33,33,32,32,30 }; const int n2c3w4_n[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,97,96,95,95,94,94,94,93,87,86,85,85,85,85,85,85,85, 84,84,83,83,82,81,81,80,80,80,80,80,80,79,79,78,77,77,76,76,75, 75,75,74,72,70,69,68,68,67,67,65,64,64,64,63,62,60,59,59,59,58, 58,58,57,57,56,56,54,54,52,51,51,48,48,48,47,47,47,46,45,44,44, 42,41,41,39,38,38,37,36,36,36,35,34,33,33,33,32,31 }; const int n2c3w4_o[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 98,98,98,97,97,96,96,96,96,94,94,93,93,93,92,92,92,91,91,90,90, 89,88,87,87,87,85,85,83,78,77,77,77,77,76,75,74,73,71,71,70,70, 70,70,70,69,68,68,65,65,64,63,63,61,61,61,61,60,60,59,59,59,59, 58,58,57,54,54,52,52,52,51,49,49,49,48,47,47,47,45,45,45,43,42, 42,41,41,40,40,40,40,39,38,37,36,35,34,32,31,30 }; const int n2c3w4_p[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,99,98,96,96,96,95,94,92,91,90,90,89,89,88,88,88,88,86, 86,85,85,85,84,83,83,83,83,82,82,81,80,80,79,79,77,77,77,75,75, 74,72,71,70,70,70,69,69,69,68,68,67,65,64,64,62,62,61,59,59,57, 57,54,54,54,54,53,53,52,50,50,49,48,48,48,46,43,42,42,42,39,39, 38,38,37,37,37,36,36,35,34,34,34,34,33,32,32,30,30 }; const int n2c3w4_q[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,98,98,98,97,97,97,96,96,96,95,95,95,94,93,93,93,92,91, 91,88,88,87,87,86,85,85,84,82,81,79,79,79,78,78,77,77,76,76,75, 73,73,73,73,72,72,72,71,70,69,68,67,66,65,65,64,63,62,61,61,60, 60,59,59,57,56,55,54,54,53,53,52,51,50,50,50,49,49,48,48,47,47, 47,46,45,45,45,44,38,35,35,35,34,34,34,33,33,31,31 }; const int n2c3w4_r[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,98,98,98,98,98,97,97,96,95,95,93,92,90,89,87,86,86,84,84, 84,84,80,80,80,79,79,78,77,74,73,73,72,72,72,71,71,71,70,69,69, 69,68,67,66,65,64,64,63,63,62,60,57,57,57,55,55,55,54,53,53,52, 52,52,51,51,50,49,47,46,46,45,44,44,44,43,43,43,42,41,41,41,41, 40,40,39,39,39,39,38,38,37,36,35,35,34,32,31,30,30 }; const int n2c3w4_s[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,99,98,97,97,96,95,94,94,93,92,91,90,90,88,88,88,87,84,81, 80,80,79,79,76,76,75,75,75,73,73,71,71,71,70,70,70,69,69,67,67, 66,65,64,64,62,61,60,60,59,59,59,59,58,56,55,54,54,53,53,53,51, 51,50,49,48,48,48,47,47,47,46,46,45,45,45,45,45,44,44,44,42,42, 41,41,40,39,38,37,34,34,34,33,33,32,32,31,31,31,30 }; const int n2c3w4_t[] = { 150, // Capacity 100, // Number of items // Size of items (sorted) 100,100,99,99,97,97,95,95,95,94,94,93,93,93,92,91,91,91,91,91, 89,89,86,86,85,85,84,82,81,81,79,79,78,76,75,74,74,74,74,73,73, 71,70,70,69,69,67,67,67,66,66,66,66,65,65,64,64,63,63,62,61,61, 61,60,60,58,57,54,54,53,53,53,52,52,51,50,48,48,47,46,46,46,45, 44,42,40,39,39,39,37,36,35,34,33,33,33,32,32,30,30 }; const int n3c1w1_a[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,97,97,97,94,93,92,92,91,89,89,88,88,88,88,87,87,86, 86,86,86,86,85,84,83,83,82,81,81,81,81,80,80,79,79,79,78,78,77, 77,77,76,76,76,75,74,74,73,73,73,73,72,72,72,72,72,71,71,69,69, 68,67,67,66,66,66,66,64,64,64,64,63,63,62,61,61,61,60,60,59,59, 57,56,56,56,55,55,55,54,54,53,53,52,52,52,51,50,50,50,49,49,49, 49,47,47,46,46,46,46,46,46,45,45,45,45,44,44,42,41,40,40,40,39, 39,38,38,38,38,38,38,37,37,36,36,36,36,34,34,34,34,34,34,31,31, 31,30,30,30,30,30,29,29,27,27,27,26,24,24,23,22,22,22,22,22,20, 18,17,17,17,16,16,15,15,14,14,14,13,13,12,11,11,11,10,10,8,8, 8,6,6,5,5,4,4,3,3,3,1,1 }; const int n3c1w1_b[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,98,98,98,95,93,93,92,92,92,92,91, 90,90,89,89,89,89,88,88,88,88,87,86,86,86,86,86,85,85,85,84,84, 84,83,83,81,81,80,79,77,77,77,75,75,75,75,74,74,74,74,73,73,73, 72,71,71,71,71,70,70,70,70,70,69,68,68,68,68,68,67,67,67,66,65, 65,65,64,64,63,63,63,62,61,61,60,60,59,59,59,58,58,57,57,57,56, 53,53,53,52,52,52,52,51,50,49,49,48,48,48,47,46,45,44,44,44,44, 42,42,41,40,40,40,39,39,39,38,38,38,37,37,36,36,36,36,34,34,33, 33,33,33,33,33,32,32,32,32,31,30,29,28,27,27,26,26,26,25,24,23, 21,21,20,20,17,16,16,15,14,14,14,13,13,13,13,13,12,12,11,11,10, 9,9,7,7,7,7,6,5,5,4,4,3,3 }; const int n3c1w1_c[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,99,97,96,96,95,95,94,92,92,91,91,91,91,90,90, 90,89,89,88,88,87,86,86,85,85,85,83,82,82,82,81,81,80,80,80,79, 79,79,76,75,75,74,74,73,72,72,72,71,71,70,68,67,67,67,67,66,66, 65,65,64,64,64,63,63,63,62,62,62,61,61,60,60,59,59,59,59,58,58, 57,57,56,56,56,56,55,55,54,52,51,51,50,50,49,48,48,47,47,47,47, 46,46,43,43,42,42,42,41,41,40,40,40,39,37,37,36,36,34,34,34,34, 33,33,33,32,31,30,30,29,29,28,28,27,27,26,26,26,26,25,25,24,24, 23,23,23,23,22,22,21,21,21,20,20,20,20,19,19,18,17,17,16,16,15, 14,14,14,14,14,13,13,12,12,11,11,11,11,10,9,9,8,8,8,8,7,7,7,6, 6,6,5,4,4,4,2,2,1 }; const int n3c1w1_d[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,99,98,97,97,97,96,96,95,95,95,94,94,93,93,93,93,93, 92,92,91,90,89,89,89,88,87,87,87,87,87,87,87,86,85,84,84,83,82, 80,80,80,80,79,79,78,78,77,76,76,74,74,74,74,73,73,71,70,69,69, 68,68,68,68,68,68,67,67,66,66,66,65,64,63,63,62,62,62,61,61,61, 60,60,60,60,59,59,58,57,57,57,57,55,55,54,54,53,53,53,51,51,51, 50,49,49,48,48,48,48,47,46,46,46,45,45,45,43,43,43,42,42,42,42, 42,41,41,40,39,38,37,37,37,37,37,36,36,35,35,35,35,34,34,34,32, 31,31,30,29,29,28,28,26,26,26,25,24,24,24,23,22,21,21,21,20,20, 20,19,19,19,19,19,19,17,14,13,12,12,11,10,10,10,9,9,8,8,8,8,7, 6,6,5,5,5,4,3,2,2,2 }; const int n3c1w1_e[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,98,98,97,97,96,96,95,95,95,95,94,93,93,93,91, 91,91,91,91,91,90,90,87,87,86,85,85,85,84,84,82,81,81,81,79,78, 78,76,76,75,75,75,75,74,74,74,72,72,72,72,71,70,69,69,69,69,67, 67,67,67,66,66,66,65,64,64,64,64,63,62,61,61,60,60,59,58,57,56, 55,55,55,54,53,53,53,52,52,50,50,49,47,47,46,46,45,44,44,43,43, 42,42,41,41,41,40,40,39,39,39,39,38,38,38,37,36,35,35,34,34,33, 33,32,32,32,32,32,32,31,31,31,30,30,30,30,30,29,28,28,27,27,26, 25,24,24,24,23,23,23,23,22,22,22,21,21,21,20,19,19,19,18,18,17, 17,16,16,15,15,14,14,13,12,12,11,10,10,9,8,8,8,8,7,7,7,7,6,6, 5,4,3,3,3,3,2,2,1,1 }; const int n3c1w1_f[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,98,98,98,97,97,97,97,96,96,95,94,94,94,94,94, 94,93,93,93,93,93,92,91,90,90,90,90,89,87,86,86,86,85,85,85,85, 85,84,83,83,83,82,82,81,81,80,80,78,77,76,76,76,75,75,74,74,74, 74,74,73,72,71,71,70,70,70,69,69,68,68,68,67,67,67,67,66,66,65, 64,63,63,62,61,61,61,60,60,60,60,60,60,59,59,58,58,58,57,57,56, 56,54,54,53,53,50,50,49,49,49,48,48,48,46,46,46,45,44,42,41,40, 40,37,37,37,36,36,34,33,32,32,31,30,29,28,28,27,27,27,26,25,25, 25,24,24,23,23,23,23,23,23,23,22,22,21,21,20,20,20,19,18,17,16, 16,15,15,14,14,14,13,12,12,12,11,10,10,10,10,9,8,8,8,8,7,7,7, 7,6,5,5,5,5,4,3,2,1 }; const int n3c1w1_g[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,98,98,97,95,95,94,94,93,93,93,93,92,91,91,91,91,90, 90,90,89,89,89,88,88,87,87,86,86,86,86,86,85,85,84,84,84,83,82, 81,81,80,80,79,79,79,78,77,77,76,76,75,75,74,74,74,74,73,73,73, 73,73,72,72,72,71,70,70,69,69,68,68,68,67,67,66,62,62,62,62,62, 62,61,60,60,60,60,60,59,58,57,57,57,57,56,56,54,54,53,53,52,52, 52,52,52,51,50,50,50,49,49,49,48,47,46,46,46,45,44,43,43,42,42, 40,40,40,39,39,38,36,36,36,35,35,34,33,33,32,32,32,31,30,30,29, 29,29,28,27,27,26,26,26,25,25,25,24,24,24,24,23,23,23,22,22,22, 22,21,20,20,19,16,15,15,14,14,14,13,11,11,10,10,10,9,9,7,6,6, 5,5,5,4,4,3,2,1,1,1,1 }; const int n3c1w1_h[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,97,97,97,97,97,97,96,96,96,96,95,95,95,95,94,93, 93,93,92,92,91,90,89,89,88,88,88,87,87,87,86,86,85,85,84,84,83, 83,82,81,80,80,80,79,79,79,78,77,77,77,77,76,75,75,74,74,73,72, 71,71,71,71,71,71,71,69,69,69,68,65,65,63,63,62,62,62,62,61,61, 60,60,59,58,58,58,56,56,56,54,53,53,52,51,51,51,50,49,49,48,48, 48,47,46,46,46,46,46,46,43,43,42,41,40,39,39,38,37,37,36,36,36, 35,34,34,33,33,32,32,32,32,32,32,32,30,30,29,29,28,27,27,27,27, 26,26,26,26,25,25,24,24,23,22,21,21,21,21,20,19,19,18,17,17,17, 16,16,16,15,15,15,14,14,13,12,11,11,10,9,9,7,6,6,6,6,6,4,4,4, 4,4,3,2,1,1,1,1,1 }; const int n3c1w1_i[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 99,97,97,96,96,95,93,92,92,92,92,92,92,92,91,91,90,89,88,87,87, 87,86,85,85,84,84,84,83,83,83,83,83,83,82,81,80,79,78,78,78,78, 77,77,76,76,76,75,75,75,74,73,72,71,71,70,70,69,69,68,68,67,66, 66,65,65,63,63,63,63,62,61,61,61,59,58,58,58,58,58,58,58,58,57, 56,56,56,54,53,52,52,52,51,50,50,50,50,50,49,49,48,48,48,48,48, 47,47,46,45,45,44,43,43,43,43,43,43,42,41,41,40,40,38,38,37,37, 37,37,36,36,36,35,35,34,33,32,32,31,31,29,29,29,28,27,27,27,26, 26,25,24,24,23,22,22,22,21,21,21,20,20,19,18,18,18,18,17,16,16, 16,16,15,15,14,14,14,13,13,12,12,11,11,11,11,8,8,7,6,5,3,3,2, 2,2,2,2,2,1,1,1,1 }; const int n3c1w1_j[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,98,97,97,97,97,97,96,96,95,95,93,93,93,92,92,91,91, 89,88,88,88,88,88,86,86,85,85,85,84,83,83,83,82,81,80,79,79,78, 78,77,77,75,74,74,74,73,73,72,72,72,71,71,71,70,70,70,70,69,69, 67,67,66,66,65,65,65,64,64,64,63,63,63,62,62,62,61,60,60,59,59, 59,59,59,58,58,57,57,57,56,56,55,55,55,55,54,54,52,52,52,51,51, 51,50,50,50,49,49,49,49,48,47,47,47,45,44,44,44,43,43,43,43,43, 41,41,41,40,40,39,39,39,39,38,37,37,37,36,36,36,35,35,34,33,33, 31,31,30,29,28,28,28,27,27,25,25,24,23,23,23,22,22,21,21,21,19, 19,19,17,17,17,17,16,16,15,14,14,14,14,13,13,12,11,10,10,10,9, 9,9,8,7,6,6,4,4,3,3,3,2 }; const int n3c1w1_k[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,99,98,98,98,98,97,95,95,95,95,94,94,92,92,92,92,91, 90,88,88,88,88,87,87,87,86,85,84,84,83,83,83,82,82,82,82,81,81, 81,81,80,80,80,79,78,77,75,75,74,74,74,73,73,72,72,71,71,70,70, 70,69,68,68,68,68,67,67,66,66,65,64,63,62,61,60,60,58,58,57,57, 56,56,55,55,55,55,55,55,54,53,53,53,52,51,50,49,49,49,48,48,48, 48,47,47,47,46,45,43,43,42,42,42,42,41,41,41,41,40,40,39,39,38, 38,38,38,36,35,35,34,33,32,32,30,28,28,28,28,28,26,26,25,25,24, 24,23,23,23,22,22,22,22,21,21,21,21,20,20,20,19,19,19,18,17,17, 16,15,15,14,14,13,13,12,12,11,11,11,10,9,9,9,8,7,6,6,5,5,4,4, 4,3,3,3,2,2,2,2,1 }; const int n3c1w1_l[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,99,97,96,96,94,94,94,93,93,93,93,92,92,92,89, 88,87,87,85,84,84,84,84,83,83,83,83,82,80,80,79,79,78,76,75,75, 75,74,73,73,73,73,73,72,72,72,71,71,70,70,70,70,70,69,69,69,68, 67,67,66,66,64,63,63,63,62,62,61,61,59,59,59,59,58,58,57,56,56, 55,55,54,53,52,52,51,51,50,50,50,50,50,50,48,48,48,48,47,47,47, 46,46,46,46,45,44,43,41,41,39,39,38,37,37,37,36,36,35,35,35,34, 34,33,33,33,32,32,31,31,31,31,30,30,30,29,29,28,28,25,25,25,25, 24,24,24,23,23,23,23,22,21,20,20,20,20,19,18,18,18,16,16,16,15, 14,14,14,14,13,12,11,11,11,11,11,10,10,9,9,9,8,8,8,7,7,7,6,4, 4,3,3,2,2,2,1,1,1 }; const int n3c1w1_m[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,98,98,97,97,97,97,97,96,96,96,96,95,95,94,92,92,92, 92,91,91,91,90,90,90,89,87,87,86,85,85,83,83,83,82,82,80,78,78, 78,77,77,77,77,76,76,75,75,74,74,74,74,72,71,71,71,70,70,69,69, 69,68,67,67,67,67,66,66,66,66,65,65,65,65,64,63,61,61,60,60,60, 59,59,58,58,58,57,55,54,54,54,54,54,54,54,54,52,52,52,52,51,51, 51,51,49,47,47,46,46,45,44,44,44,44,44,43,42,42,42,41,41,41,41, 40,39,38,37,37,35,35,35,33,32,31,30,30,29,29,29,28,28,27,27,26, 26,25,25,25,24,23,23,23,23,23,21,21,20,19,19,19,18,18,18,17,17, 17,17,16,16,16,15,15,15,15,15,14,14,13,12,12,11,11,10,10,10,10, 10,9,7,6,6,5,5,4,3,2,1,1 }; const int n3c1w1_n[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,98,98,97,96,95,95,93,93,93,91,90,90,88,88,87, 84,82,82,81,81,81,81,81,81,80,80,79,79,78,78,77,77,77,77,76,75, 75,74,73,73,72,71,71,71,70,70,70,69,67,66,66,66,66,66,65,65,65, 64,64,63,59,59,59,59,58,58,56,56,54,54,53,53,53,51,51,51,51,50, 49,48,48,48,48,47,47,47,47,46,46,46,46,46,46,46,46,46,46,45,44, 44,44,43,41,41,40,40,40,39,39,39,38,36,36,35,34,34,34,33,33,33, 32,32,32,32,31,31,31,30,30,29,28,28,27,27,27,26,25,25,24,24,23, 23,22,22,22,22,21,21,21,20,19,19,18,16,16,16,15,15,15,15,15,15, 14,13,13,13,12,12,12,12,11,10,10,10,9,9,9,8,8,8,8,7,7,7,7,7,5, 5,4,3,3,3,2,2,2 }; const int n3c1w1_o[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,99,98,98,98,97,96,96,95,95,95,94,92,91,91,90,90,89,89,89, 87,87,86,86,86,86,86,84,84,83,83,83,82,82,82,82,81,79,79,78,77, 77,76,76,76,76,76,76,76,76,76,76,75,74,73,72,72,71,69,69,67,66, 66,66,65,65,64,64,63,63,63,63,62,60,60,60,59,59,57,56,56,55,54, 54,54,54,54,53,52,52,52,51,51,51,50,48,48,47,47,46,45,45,45,45, 45,42,42,41,41,41,40,40,39,39,38,38,37,37,37,36,35,35,35,34,34, 34,34,31,30,30,30,29,29,29,29,29,29,28,28,28,28,28,26,26,26,25, 25,25,24,24,24,23,22,22,22,22,21,21,21,21,21,20,19,19,19,18,18, 18,18,18,17,17,16,16,16,16,15,14,14,14,13,13,12,12,11,10,10,9, 8,8,8,7,7,6,6,5,4,4,3,2 }; const int n3c1w1_p[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,98,98,98,97,97,97,97,96,96,95,92,92,92, 92,91,91,91,91,90,89,89,87,87,87,86,86,86,86,86,85,85,85,84,84, 84,83,83,83,82,82,82,81,81,81,79,78,77,77,76,75,75,75,75,75,72, 72,72,72,72,72,72,71,71,71,71,70,70,70,69,68,65,64,64,64,63,63, 62,62,61,60,60,59,59,59,59,59,58,58,57,57,57,57,56,56,55,53,53, 52,52,51,51,50,48,48,48,47,46,46,46,44,44,43,43,42,42,41,41,38, 38,37,37,37,37,36,35,35,34,33,33,33,32,32,31,30,30,30,29,29,28, 28,28,28,27,26,25,25,25,24,24,23,23,23,22,22,22,21,21,21,21,21, 20,19,18,18,17,16,16,16,16,16,16,15,15,14,14,13,13,13,13,12,12, 11,9,9,8,8,7,7,6,4,2,2,2,2 }; const int n3c1w1_q[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 99,98,97,95,95,93,93,93,93,93,92,92,92,92,92,92,91,91,90,90,90, 90,89,88,87,85,85,85,85,85,84,84,83,82,82,81,81,80,79,79,79,79, 78,78,77,77,77,76,76,76,76,75,74,74,73,72,72,71,71,70,70,70,70, 69,69,67,67,66,66,65,65,65,64,63,61,60,60,59,58,54,53,53,52,52, 51,51,50,50,50,49,48,48,48,48,47,46,46,46,46,45,45,43,42,42,42, 42,41,41,41,40,40,39,38,38,37,36,36,36,35,35,35,35,34,34,34,33, 32,32,32,31,31,31,31,30,30,29,28,27,27,27,26,25,25,25,24,23,23, 23,23,23,23,22,22,21,21,21,20,20,20,20,20,19,19,18,17,17,17,17, 17,16,16,16,15,14,14,14,14,13,12,11,11,11,11,11,8,7,7,7,5,5,5, 4,3,2,2,2,2,2,1,1 }; const int n3c1w1_r[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,98,98,98,97,97,96,96,95,95,94,94,94,92,92,91,90, 90,89,89,87,86,86,85,84,84,84,83,82,82,81,80,80,79,79,79,78,78, 78,77,77,77,77,77,77,76,76,75,75,75,74,74,73,73,72,72,71,67,67, 67,67,66,65,65,65,64,64,63,62,61,61,60,60,59,59,59,58,58,58,58, 58,58,57,57,56,56,56,55,54,54,53,52,52,50,50,50,49,47,46,45,45, 45,44,43,43,41,41,41,40,40,40,40,39,39,38,38,38,38,38,37,36,35, 35,35,34,33,33,32,30,30,30,30,28,28,27,27,27,26,26,26,25,25,25, 24,24,24,24,23,22,21,21,20,20,19,19,19,19,19,18,16,16,16,16,15, 15,14,14,14,14,14,12,11,11,11,10,10,10,9,8,8,8,7,7,6,6,6,6,6, 5,5,3,2,2,1,1,1,1 }; const int n3c1w1_s[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 99,99,98,97,97,97,97,96,96,96,95,95,93,93,92,92,90,89,88,88,88, 88,87,87,86,86,86,86,86,86,85,84,83,83,83,82,82,82,81,81,81,80, 80,80,80,78,77,76,76,74,73,72,71,71,71,70,70,70,70,69,69,69,69, 67,66,66,65,65,64,63,63,63,62,62,62,61,61,61,61,59,58,58,56,56, 54,52,52,51,51,51,50,50,50,50,50,49,49,48,48,47,47,45,45,44,44, 44,44,44,43,42,42,42,42,42,41,39,38,38,38,37,36,36,36,36,35,35, 35,34,33,33,32,31,31,31,31,31,31,30,30,29,29,28,28,28,27,27,27, 26,25,25,25,24,24,23,23,23,22,21,21,21,20,20,20,19,19,17,17,17, 17,16,15,15,15,14,14,14,14,13,11,11,10,10,10,9,9,8,8,8,8,7,7, 6,6,4,3,3,2,1,1,1 }; const int n3c1w1_t[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,98,97,96,96,96,96,95,94,94,93,92,92,92,91,91, 91,90,90,89,88,87,87,87,87,87,86,86,86,85,84,83,83,83,83,82,82, 81,81,81,81,80,80,79,79,79,78,78,78,78,78,76,76,76,76,76,76,75, 74,74,74,73,73,72,71,69,69,69,67,66,65,64,63,63,63,62,61,61,60, 59,57,57,56,56,56,55,55,54,54,54,54,54,53,53,52,52,51,50,48,48, 48,48,47,46,46,45,45,45,43,42,40,40,40,39,39,39,39,38,38,37,37, 37,36,35,34,32,31,31,30,30,29,28,27,27,26,25,24,24,24,24,24,22, 22,21,21,21,21,20,19,19,18,18,18,18,18,17,16,16,16,15,15,14,14, 13,13,12,12,12,12,11,11,11,11,10,9,9,8,7,6,6,6,6,6,6,5,5,5,4, 4,3,3,3,3,2,1,1 }; const int n3c1w2_a[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,98,98,98,98,98,97,97,96,96,96,95,94,94,93,93, 91,91,91,90,90,90,89,89,88,88,88,88,87,87,86,85,85,84,83,83,83, 83,82,81,79,79,79,79,78,78,77,77,77,76,76,76,76,75,75,74,73,73, 73,72,72,72,71,71,71,70,70,69,69,69,69,69,68,68,68,67,67,67,67, 65,65,65,65,65,64,63,63,63,63,61,61,61,61,61,60,60,60,59,59,59, 58,58,58,57,56,56,55,55,55,55,54,54,54,53,53,51,51,50,50,50,50, 49,49,48,48,48,48,47,46,46,45,44,43,43,42,42,41,40,40,40,40,40, 39,38,38,38,38,37,36,36,35,35,34,34,34,33,33,33,33,33,33,32,32, 32,32,32,32,32,31,31,30,28,27,26,26,25,25,24,24,23,23,22,22,22, 21,21,21,20,20,20,20,20,20,20,20,20 }; const int n3c1w2_b[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 99,99,99,97,96,95,94,93,93,93,93,93,91,91,91,90,89,89,89,89,88, 88,87,87,85,85,84,84,84,84,82,81,81,81,80,80,79,78,78,77,77,76, 76,76,76,75,75,74,74,74,74,74,74,73,73,73,72,72,72,72,72,71,71, 70,69,69,69,69,68,68,68,67,67,67,67,67,67,67,66,66,66,65,65,65, 64,64,64,63,63,62,61,61,60,59,59,58,58,58,58,58,58,58,57,57,57, 57,56,56,55,55,54,54,54,54,54,53,53,53,53,53,52,52,52,51,51,50, 49,48,48,48,47,47,46,46,46,45,45,44,43,43,42,41,40,40,38,38,38, 38,38,37,36,36,36,36,36,36,36,36,35,35,35,34,34,33,33,33,33,32, 32,32,32,31,31,31,30,30,29,29,28,28,27,27,27,26,26,25,25,23,22, 21,21,21,21,21,21,21,20,20,20,20 }; const int n3c1w2_c[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,98,98,98,96,96,96,95,95,94,94,94,93,93,92,92, 92,91,91,90,90,90,89,89,89,89,88,88,87,87,86,86,85,85,85,85,84, 84,83,82,82,82,82,81,81,81,81,81,80,80,79,79,78,78,78,78,77,76, 76,76,75,74,74,74,73,72,72,71,71,71,70,70,70,70,69,68,68,68,66, 66,66,65,65,65,65,63,62,61,61,60,60,60,60,58,58,58,58,57,57,57, 57,56,56,55,54,54,53,52,52,52,52,52,52,52,52,52,51,51,50,50,49, 48,47,47,47,47,46,45,45,45,45,45,44,43,43,42,42,42,41,41,41,41, 40,40,39,39,39,38,37,37,37,36,36,36,35,35,35,34,34,33,33,33,32, 32,32,32,31,31,31,30,30,28,28,28,28,28,27,27,27,26,26,26,24,24, 23,23,23,23,22,22,22,21,21,20,20,20 }; const int n3c1w2_d[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,98,98,98,97,97,97,97,96,96,96,96,95,95,95,94,94, 94,94,93,93,92,92,92,91,91,91,91,90,90,89,87,87,86,86,85,84,84, 83,83,82,81,81,81,80,80,79,79,79,79,79,79,78,78,78,78,77,77,77, 77,77,76,76,76,76,75,75,75,74,74,73,73,73,73,73,72,72,72,71,71, 71,70,70,70,69,69,69,69,69,68,67,67,67,66,65,65,65,65,64,63,63, 63,63,62,62,62,61,61,61,60,59,59,59,59,59,58,57,57,57,57,57,56, 56,55,54,54,53,53,53,53,53,52,52,52,51,50,48,48,47,47,47,47,46, 46,44,44,44,43,43,42,41,41,41,41,40,40,39,38,37,36,36,36,36,35, 34,34,33,33,32,31,31,31,30,30,29,29,28,28,28,27,27,27,27,26,25, 25,24,24,23,23,22,22,22,22,21,21,20 }; const int n3c1w2_e[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,98,98,97,97,97,96,96,96,95,95,95,95,94,94,94,93, 93,92,91,91,90,89,89,89,89,88,88,87,87,87,87,86,86,86,85,85,85, 84,84,83,83,82,82,82,81,81,81,81,80,80,79,79,79,78,77,77,77,76, 76,76,76,74,73,73,73,73,73,73,73,73,72,72,72,72,71,71,70,70,70, 70,70,68,68,68,68,67,66,66,66,66,66,65,64,63,63,63,62,61,61,61, 61,61,60,60,59,59,59,58,58,57,57,57,56,56,56,55,54,54,53,53,53, 52,52,51,50,50,49,49,49,48,47,47,47,46,45,45,44,44,43,43,43,43, 43,42,42,42,42,41,41,41,41,40,40,39,39,38,37,36,36,35,35,34,34, 34,33,33,33,32,30,30,30,29,29,28,28,28,28,28,27,27,27,26,25,25, 24,24,23,23,23,22,22,22,21,21,20,20 }; const int n3c1w2_f[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,99,98,98,98,98,97,97,97,96,96,96,95,94,94,93,93,92,91,91, 90,90,90,90,89,88,88,88,87,87,86,86,85,85,84,84,83,82,81,81,80, 79,79,79,78,78,78,78,78,78,78,78,77,77,77,77,76,76,75,75,74,74, 74,73,73,73,72,71,71,70,70,69,69,69,68,68,67,65,65,65,65,65,65, 64,64,63,63,62,62,62,62,62,61,61,61,61,60,59,59,58,58,58,57,57, 56,56,56,56,54,54,54,52,52,52,52,52,50,50,50,49,49,47,47,47,46, 46,46,45,45,45,45,45,44,44,44,43,43,43,43,42,42,42,42,41,41,40, 39,39,38,38,37,37,37,37,37,37,36,36,35,35,35,35,35,34,34,34,33, 33,33,33,32,32,32,31,31,31,30,30,30,28,28,27,26,23,22,22,22,22, 22,21,21,21,21,20,20,20,20,20,20,20 }; const int n3c1w2_g[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,98,98,98,97,96,96,96,96,95,95,95,95, 94,94,94,94,94,93,93,93,92,92,92,92,92,92,92,92,91,91,90,89,88, 88,88,88,87,87,87,87,87,86,85,85,85,85,85,84,83,83,83,83,82,81, 81,80,80,80,80,80,79,79,78,78,78,77,77,77,77,76,75,75,74,74,73, 72,72,71,69,69,69,69,69,68,68,67,67,66,64,63,62,62,62,62,61,61, 61,61,60,59,58,58,58,57,57,57,57,56,56,55,54,54,54,53,52,51,51, 51,50,50,50,50,50,49,47,47,46,44,43,43,42,42,42,42,42,42,42,42, 41,41,41,40,40,39,39,38,38,37,37,37,36,36,36,36,36,35,35,35,34, 33,33,33,32,32,32,31,30,30,30,30,30,29,29,28,28,28,27,27,26,26, 25,25,24,24,23,23,22,22,22,22,22,21,20 }; const int n3c1w2_h[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,99,99,98,97,97,96,96,96,96,95,95,94,94,94,94, 93,93,93,91,91,91,91,91,90,90,90,90,90,90,90,89,89,89,89,89,88, 88,88,87,86,86,86,85,85,85,84,84,84,84,83,83,83,81,81,80,80,80, 80,80,79,79,78,78,77,77,76,76,75,75,75,74,73,73,72,71,71,70,70, 70,70,69,68,68,67,67,67,65,65,65,64,64,62,62,62,62,61,61,60,60, 59,59,58,58,58,57,57,57,57,56,56,55,55,55,54,54,52,51,50,50,49, 48,48,48,48,47,47,46,45,45,43,43,43,42,42,41,41,41,40,40,40,40, 39,39,38,38,38,37,37,36,35,35,35,35,34,34,34,34,33,33,32,32,32, 31,31,30,30,30,30,28,28,28,27,27,27,26,26,26,26,25,25,25,25,25, 25,24,24,24,24,24,23,22,20,20,20,20 }; const int n3c1w2_i[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,98,97,97,97,96,95,95,95,94,93,93,92,92,92,92, 91,91,91,90,90,90,88,88,88,87,87,87,87,86,86,85,85,84,84,84,83, 83,83,83,83,82,82,82,82,82,82,81,81,80,80,79,79,79,78,78,77,77, 76,75,74,74,72,72,72,71,71,71,69,69,69,68,68,68,68,68,68,67,67, 66,65,65,65,64,64,64,64,63,63,63,62,62,62,62,61,61,60,60,59,59, 59,59,59,58,58,57,57,57,56,56,56,55,55,54,53,53,52,52,51,51,51, 51,50,49,49,49,48,46,46,45,45,45,45,44,44,44,43,42,42,42,42,41, 41,41,41,40,40,40,39,39,38,38,38,38,37,37,36,35,34,34,34,33,33, 32,31,31,31,30,30,30,29,29,29,29,27,27,27,26,25,25,25,24,24,24, 23,23,23,23,23,22,22,21,20,20,20,20,20 }; const int n3c1w2_j[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,99,99,98,98,98,97,97,97,96,96,96,95,95,94,94, 93,93,93,93,93,93,92,92,91,89,88,88,88,88,88,87,87,87,87,87,87, 86,85,85,85,84,83,83,82,82,82,81,80,80,80,80,80,79,79,79,78,77, 77,76,76,76,76,76,75,75,75,75,74,73,73,73,72,71,71,71,71,70,69, 69,68,68,68,68,67,65,65,65,62,62,60,60,60,60,60,59,59,59,59,59, 58,58,58,58,58,57,56,55,55,54,54,53,53,53,53,52,50,50,49,49,49, 48,48,48,47,47,46,46,46,45,45,45,43,43,43,42,42,42,41,41,41,41, 40,40,40,40,39,39,37,37,37,37,37,36,36,36,35,34,33,33,32,32,32, 30,30,30,30,29,29,29,29,29,28,27,27,26,26,25,25,25,25,24,24,24, 24,24,23,23,23,22,22,21,21,21,20,20,20 }; const int n3c1w2_k[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,98,98,98,98,97,96,96,95,95,95,95,94,93,93,93,93, 92,92,91,91,90,90,89,89,89,89,89,88,87,87,85,85,84,84,84,84,84, 83,83,83,82,82,82,78,78,77,77,77,77,77,76,76,76,75,74,73,73,72, 72,71,70,70,70,69,69,68,67,67,66,66,66,65,64,64,64,63,63,63,63, 63,62,61,60,60,60,59,59,59,59,57,57,56,56,55,55,54,53,53,53,53, 52,52,52,51,51,50,50,49,49,49,48,47,47,47,47,47,46,46,46,45,44, 44,43,43,43,43,43,43,42,42,42,41,41,40,40,40,40,40,39,39,39,38, 38,38,38,37,37,37,36,36,36,36,34,33,33,32,32,32,32,32,31,31,31, 30,30,30,30,30,29,29,28,28,28,28,28,28,27,27,27,26,26,26,26,25, 25,24,24,23,22,21,21,21,20,20,20,20 }; const int n3c1w2_l[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,98,98,98,98,97,97,97,97,97,96,96,95,95,94,94, 94,94,93,92,92,92,92,92,92,92,91,91,90,90,90,90,89,89,89,88,88, 88,87,87,86,86,86,86,85,85,85,84,84,84,83,83,82,81,80,80,79,79, 78,77,77,77,76,76,76,76,75,75,74,74,74,74,73,73,72,72,71,71,71, 71,70,70,70,69,69,68,68,68,67,67,67,66,66,66,66,65,64,64,63,63, 63,62,61,60,60,60,60,59,59,59,59,58,58,58,57,57,56,55,55,54,54, 54,52,52,52,51,51,51,51,50,49,49,48,48,47,47,47,47,47,46,46,45, 45,45,44,44,44,43,43,43,42,42,41,41,40,39,39,39,39,37,37,37,37, 36,36,36,35,35,34,33,33,33,33,33,32,31,31,30,27,27,26,25,24,24, 24,24,23,23,23,23,23,22,21,21,20,20 }; const int n3c1w2_m[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,98,98,98,97,97,97,96,96,94,93,93,92,92,92,91,90, 90,90,90,89,89,89,89,88,87,87,86,86,86,86,85,85,85,85,85,84,84, 84,84,83,82,82,82,82,82,81,81,81,81,80,80,79,79,79,79,77,76,76, 75,75,74,74,74,73,72,72,72,72,72,72,72,72,72,71,71,70,70,69,68, 68,68,68,67,67,67,67,65,65,65,64,64,63,62,62,62,62,62,61,60,59, 59,58,58,58,58,58,58,57,57,57,57,57,57,56,56,55,55,55,55,54,54, 54,53,53,53,52,52,52,51,51,50,49,49,49,48,48,47,47,47,47,47,46, 44,44,44,44,44,43,42,42,41,41,41,40,39,38,38,37,36,36,36,36,36, 35,35,34,33,33,32,32,31,31,31,30,30,30,29,29,28,27,27,27,26,26, 26,25,24,23,23,23,22,22,22,21,21,20 }; const int n3c1w2_n[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,98,98,98,96,96,95,95,94,94,94,93, 93,93,93,93,92,91,91,91,91,90,90,90,89,89,89,89,89,88,87,87,87, 86,86,86,85,85,84,84,82,82,81,81,80,80,80,80,79,78,77,77,77,77, 77,76,76,75,75,75,73,73,73,72,71,71,70,70,70,70,69,69,68,68,68, 68,68,67,67,67,67,66,66,66,65,65,65,64,63,63,63,62,62,62,61,60, 60,59,59,59,58,58,58,58,58,57,57,55,55,55,55,55,55,54,54,54,54, 53,52,52,52,52,52,51,51,50,50,50,50,50,49,49,49,49,49,48,48,48, 48,46,45,45,45,44,44,44,43,43,42,42,41,41,41,39,39,39,39,38,37, 37,37,37,36,36,36,36,35,34,34,34,34,34,34,33,33,33,32,31,31,30, 30,29,28,27,26,25,25,24,24,22,21,21,20 }; const int n3c1w2_o[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 99,99,99,99,98,98,98,98,97,97,96,96,96,95,95,95,94,94,94,92,91, 91,90,90,90,90,89,89,88,88,87,87,87,87,86,86,86,85,84,84,84,84, 83,83,82,82,82,81,81,81,81,81,80,79,79,79,79,78,78,78,77,77,76, 76,74,74,74,73,73,73,73,73,72,71,71,70,70,69,69,68,68,68,67,66, 65,65,64,64,63,63,62,61,61,61,61,61,61,61,60,60,59,58,57,57,57, 57,57,56,56,56,56,56,55,55,54,54,54,53,53,53,52,52,52,51,51,50, 50,49,49,48,48,48,48,46,45,45,45,44,44,44,44,43,43,42,42,41,41, 41,40,39,39,39,39,38,38,37,37,35,35,34,34,33,33,32,32,32,32,30, 30,30,29,29,28,28,28,28,28,27,27,26,26,25,25,25,24,24,24,24,24, 24,24,23,22,22,22,21,21,21,21,20 }; const int n3c1w2_p[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,98,97,97,97,96,96,95,95,95,95,94,94,94,93,93,92, 92,92,92,91,90,90,90,90,89,89,88,88,88,88,87,87,85,84,83,83,83, 82,82,82,82,81,81,81,81,79,79,79,78,78,78,78,77,77,77,77,76,76, 75,73,73,72,71,70,70,70,70,70,70,69,69,69,67,67,66,66,66,66,65, 65,65,65,63,63,63,63,62,62,61,61,61,61,61,60,60,59,59,59,58,58, 56,55,55,55,54,53,52,52,52,51,50,49,49,49,49,48,48,48,48,48,47, 47,47,46,46,46,45,45,45,45,45,45,45,44,44,44,43,43,43,43,43,42, 42,41,41,41,41,41,40,40,39,38,38,37,37,36,36,36,35,34,33,33,33, 32,32,32,31,31,30,30,30,29,29,27,27,27,26,26,26,25,24,23,23,22, 22,22,22,22,21,21,21,21,21,20,20,20 }; const int n3c1w2_q[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,98,97,97,97,96,96,94,93,93,92,92,92, 91,91,91,90,90,90,88,88,88,88,88,88,87,86,86,85,85,85,85,85,84, 84,84,84,83,83,82,82,81,81,81,80,80,80,79,79,78,78,78,77,77,77, 77,77,76,75,75,75,75,74,74,74,74,74,74,74,73,73,73,72,72,71,71, 70,70,70,69,68,68,68,67,67,67,67,67,67,67,67,66,66,66,65,64,64, 64,64,63,63,62,62,62,61,61,60,60,60,59,59,59,59,56,56,56,54,53, 52,52,51,51,51,50,50,50,50,49,49,49,49,48,48,47,46,46,46,46,46, 45,45,43,43,43,42,41,41,39,39,39,39,38,37,37,37,36,36,36,35,34, 34,34,34,32,32,31,29,29,28,28,28,27,27,26,26,26,25,25,24,24,23, 23,22,22,21,21,21,21,21,20,20,20,20,20 }; const int n3c1w2_r[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,99,99,98,98,97,97,97, 95,95,95,95,95,94,94,93,93,92,92,92,91,90,90,89,89,89,89,89,88, 88,88,88,88,88,85,85,85,85,84,84,83,83,82,82,82,82,81,81,80,80, 78,78,76,75,75,74,73,72,72,70,70,69,69,67,67,66,66,65,65,65,64, 64,63,62,62,61,61,60,60,60,60,60,57,57,57,56,56,56,56,55,55,54, 54,54,54,53,52,52,51,51,51,50,50,50,50,49,49,49,48,48,48,48,48, 48,48,48,46,46,45,45,44,44,43,43,43,42,41,41,40,40,40,40,40,39, 39,39,39,39,39,38,38,37,36,36,35,35,34,34,34,33,33,33,33,32,32, 31,31,31,31,31,30,30,30,29,29,29,28,28,28,28,26,25,25,25,24,24, 24,23,23,23,23,22,22,22,21,20,20,20,20,20 }; const int n3c1w2_s[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,98,98,98,98,97,97,97,97,97,96,96,96,95,95,95,94,94,92,91, 90,90,89,89,89,88,88,88,88,87,87,86,86,86,85,85,85,84,84,84,83, 83,82,82,80,80,80,79,78,78,78,78,78,77,77,77,76,75,75,74,74,74, 73,73,72,72,72,72,71,71,71,70,70,68,68,68,67,67,66,66,66,66,65, 65,65,64,64,64,64,63,63,63,63,63,63,63,63,61,61,60,59,59,59,59, 58,58,58,57,57,57,57,55,54,54,53,53,53,53,53,52,52,51,51,51,50, 50,50,50,50,50,49,49,49,48,48,48,48,47,47,47,46,46,45,45,44,43, 42,41,41,41,40,40,40,39,39,39,38,38,38,38,38,38,37,37,36,36,36, 35,34,34,34,34,33,33,32,31,31,31,30,29,27,27,25,25,24,24,24,23, 23,23,23,23,23,21,21,21,20,20,20,20 }; const int n3c1w2_t[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,99,98,98,98,98,98,97,96,96,96,95,95,95,94,93,93,92, 92,91,91,90,90,90,89,88,88,87,87,87,87,86,86,85,85,85,85,84,84, 84,84,84,83,83,83,83,82,81,80,80,80,79,78,78,78,78,77,76,76,75, 74,74,74,73,72,72,72,71,71,71,71,71,68,68,67,67,67,67,66,66,65, 65,65,65,63,63,63,63,63,63,63,63,62,62,62,61,61,61,60,60,60,60, 59,59,59,59,58,58,58,57,57,56,56,56,56,55,55,54,54,54,53,53,53, 52,52,52,52,51,51,51,51,51,50,50,50,49,49,48,48,48,48,47,47,46, 46,46,46,45,44,44,43,42,42,42,42,42,42,42,41,40,39,38,37,37,36, 36,36,35,35,34,33,33,33,33,33,32,32,31,30,29,28,28,28,27,27,26, 25,25,24,23,23,23,23,22,21,21,20,20 }; const int n3c1w4_a[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,98,98,98,98,98,97,97,96,96,95,95, 95,95,94,94,93,93,92,91,91,91,91,91,90,90,90,89,89,89,89,89,88, 88,88,88,88,87,87,87,87,86,86,86,85,85,85,84,84,83,83,83,82,82, 82,82,81,81,81,81,80,80,79,79,79,79,79,78,77,77,77,77,75,74,74, 73,73,73,72,72,71,71,70,70,70,69,69,69,69,68,68,67,67,67,67,67, 67,65,65,65,65,64,64,64,63,63,63,62,62,62,62,60,60,60,59,59,59, 58,57,57,56,56,56,56,55,55,54,54,54,54,54,54,52,52,52,52,52,51, 51,51,50,50,49,49,48,48,48,47,47,47,46,46,45,45,44,44,44,43,43, 43,43,42,42,41,41,41,40,40,39,39,39,39,39,38,38,37,37,36,36,36, 36,35,35,35,35,33,32,32,32,32,30,30,30 }; const int n3c1w4_b[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,98,98,97,97,97,96,96,96,95,95,95,93,93,93,93,93, 92,92,92,92,91,91,91,90,90,89,89,88,87,87,87,87,86,86,85,85,85, 85,84,84,84,84,83,83,83,83,83,83,82,80,80,80,79,79,79,78,78,78, 78,78,78,77,76,76,76,75,75,75,75,75,73,73,73,72,72,72,71,71,70, 70,70,70,70,70,69,69,68,68,68,68,68,67,67,66,66,66,66,65,65,65, 64,64,64,63,62,61,61,61,60,60,60,59,59,58,58,58,58,58,58,57,57, 57,57,57,56,55,55,55,55,54,54,54,54,54,53,53,53,52,52,52,52,51, 51,50,49,49,49,49,48,48,47,46,46,46,45,44,44,42,42,42,42,41,41, 41,40,40,40,40,39,39,39,39,38,38,38,37,37,37,37,37,36,36,36,36, 35,35,34,34,33,33,32,32,31,31,30,30 }; const int n3c1w4_c[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,98,98,97,97,96,96,96,96,96,96,96,95,95,94,94,92, 92,92,92,92,92,92,91,91,91,90,89,89,89,89,89,87,86,85,85,84,84, 84,84,83,83,83,83,83,81,81,80,80,80,80,79,79,79,79,78,78,78,78, 77,77,77,77,77,77,76,76,76,76,76,75,75,75,75,74,74,74,74,73,72, 72,72,70,70,70,70,70,69,69,69,68,68,67,67,66,65,65,65,65,64,64, 64,64,64,63,62,62,61,60,60,60,60,60,60,60,59,59,59,58,58,58,58, 57,57,55,55,55,53,53,53,52,52,52,52,51,51,49,49,49,49,49,49,49, 48,48,48,48,48,46,46,45,45,45,45,44,44,44,44,43,43,43,43,43,43, 42,42,42,41,40,40,40,40,40,39,38,38,38,38,37,37,35,34,34,34,34, 33,33,33,32,32,32,31,30,30,30,30,30 }; const int n3c1w4_d[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 99,99,98,98,98,98,97,97,96,96,95,94,94,94,94,93,93,93,92,92,92, 92,92,92,92,92,91,91,91,91,90,90,89,89,88,88,87,87,87,87,87,87, 86,86,85,85,85,84,84,83,83,83,83,83,83,82,82,82,82,82,81,81,81, 81,80,79,78,78,77,77,77,76,76,75,75,75,74,74,74,74,73,73,73,73, 73,73,72,72,71,70,70,70,70,70,69,69,69,68,68,68,67,67,66,66,66, 66,66,65,64,63,63,63,63,62,62,62,61,60,60,60,60,59,59,59,59,58, 57,56,56,56,55,55,55,55,55,53,53,53,52,52,52,51,51,51,50,50,49, 49,49,49,48,48,48,48,47,47,46,46,46,46,46,44,43,43,43,42,42,41, 41,41,41,40,40,40,39,39,39,39,38,38,38,38,38,37,36,36,35,35,34, 34,34,33,33,33,32,32,32,31,31,30 }; const int n3c1w4_e[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 99,99,99,98,97,97,97,97,96,96,95,95,95,95,94,94,94,93,93,93,93, 93,92,92,91,90,89,88,87,86,86,86,86,85,85,85,85,84,84,84,83,83, 82,82,82,82,82,82,81,81,81,81,81,80,80,80,79,78,78,77,76,76,75, 74,74,74,74,73,73,73,73,73,73,72,72,72,71,71,71,70,70,70,69,69, 69,69,69,69,68,68,67,67,67,67,67,66,66,66,65,64,64,64,63,63,62, 62,61,61,61,61,60,60,59,59,59,59,59,57,56,55,54,53,53,53,53,52, 52,52,51,51,51,50,50,50,50,50,49,48,48,48,48,48,47,47,47,46,46, 46,45,45,45,45,45,44,44,44,43,43,43,43,43,43,42,42,42,42,41,41, 40,40,40,40,39,39,39,38,37,36,36,36,36,35,35,35,35,34,34,32,32, 32,32,31,31,31,30,30,30,30,30,30 }; const int n3c1w4_f[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,98,98,98,97,97,96,96,96,96,96,95,94,94,94,93, 93,93,91,91,91,90,90,90,90,90,89,89,89,89,89,88,88,88,88,87,87, 87,87,86,86,86,86,85,84,83,83,83,83,82,82,82,82,81,81,81,81,81, 80,80,79,79,77,76,76,76,76,76,75,74,74,74,73,73,72,72,72,71,70, 69,68,68,68,68,68,67,67,67,66,66,66,65,64,64,64,63,63,62,62,62, 61,60,60,59,59,59,58,58,58,58,57,56,56,55,55,55,54,54,54,53,53, 53,52,52,51,51,50,50,50,50,50,50,49,49,49,49,48,48,47,47,46,45, 45,45,45,45,44,44,43,43,42,42,42,42,41,41,40,40,40,40,40,40,38, 38,38,38,38,37,37,37,37,36,36,36,35,35,35,35,34,34,34,33,33,33, 33,32,32,32,32,31,31,31,31,31,30,30 }; const int n3c1w4_g[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,99,98,97,97,96,96,96,95,95,94,94,94,94,93,93,92,92,91,91, 89,89,89,89,88,88,88,88,88,87,87,87,87,86,86,86,86,86,85,85,85, 84,84,83,83,83,82,82,82,82,82,81,80,80,80,80,80,80,80,79,79,79, 79,78,78,78,78,77,77,77,76,76,75,75,75,75,75,74,74,74,74,73,73, 73,73,73,72,72,72,72,72,71,71,71,71,70,70,70,70,70,69,68,68,67, 67,67,66,66,66,65,65,64,62,62,62,61,61,60,60,59,59,59,59,59,59, 59,58,58,58,57,57,57,56,55,55,55,54,54,54,54,53,52,52,51,51,50, 50,50,48,48,48,48,47,47,46,46,45,45,43,43,43,41,41,41,40,40,39, 39,39,39,38,38,38,38,37,37,37,37,37,36,36,36,35,35,34,34,33,33, 32,32,32,32,32,31,31,31,30,30,30,30 }; const int n3c1w4_h[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,98,98,98,98,97,97,97,97,97,96,96,95,94,94,93, 93,93,91,91,91,90,90,89,89,89,89,88,88,88,87,87,86,86,86,86,85, 85,85,84,84,84,83,83,81,81,81,81,81,80,80,80,80,79,78,78,78,77, 77,76,76,76,76,76,75,75,74,74,73,73,73,72,72,72,72,72,71,71,70, 70,70,69,69,69,68,68,66,66,66,66,66,65,65,65,64,64,63,63,63,63, 62,62,62,62,61,61,61,60,60,59,59,59,58,58,57,57,57,56,55,54,54, 54,54,52,52,51,51,51,50,50,50,50,50,49,49,49,48,48,48,48,48,47, 47,47,47,46,46,46,45,45,45,44,44,44,43,43,42,41,41,40,39,39,38, 38,37,37,37,37,37,37,37,36,36,35,34,34,34,34,34,34,33,33,33,33, 33,32,32,31,31,31,31,31,31,30,30,30 }; const int n3c1w4_i[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,98,98,98,97,97,97,96,96,96,95, 95,95,94,94,94,94,94,93,93,93,92,91,90,89,89,89,89,89,88,88,87, 87,87,86,86,86,85,84,84,83,82,82,81,81,81,81,80,80,80,79,78,78, 77,77,76,76,76,75,75,74,74,74,74,74,73,73,73,73,73,72,72,72,72, 71,71,70,70,70,68,68,67,67,66,65,65,64,64,63,63,63,63,63,62,61, 61,60,60,59,59,59,58,57,57,56,56,56,55,55,55,55,54,53,52,52,52, 52,52,52,52,52,52,49,49,49,49,49,49,48,47,47,47,47,46,46,46,45, 45,44,43,43,43,43,42,42,42,41,41,41,41,41,40,40,40,40,40,39,39, 38,38,38,37,37,37,36,36,36,36,35,35,35,35,34,34,34,34,34,34,34, 33,33,33,33,32,32,32,32,31,31,31,30,30 }; const int n3c1w4_j[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,98,98,98,97,97,97,96,96,96,96,96,95,94,94,93,93, 93,92,92,92,92,92,91,91,91,90,90,89,89,89,89,88,88,87,87,86,86, 85,85,85,85,84,84,84,84,83,83,82,82,82,82,82,82,82,81,80,79,79, 79,78,78,78,77,76,76,75,75,75,74,73,73,73,72,72,72,72,71,71,70, 70,69,69,69,69,69,68,67,66,66,66,66,66,66,65,65,65,65,64,64,64, 63,63,62,62,61,61,60,60,60,59,59,59,59,58,58,58,58,58,58,58,57, 56,56,56,56,53,53,53,52,52,52,52,51,51,51,50,50,50,49,48,48,48, 48,47,47,47,46,46,46,46,44,44,44,44,43,43,42,42,42,41,40,40,40, 40,40,39,39,38,38,38,38,38,37,37,37,36,35,34,34,34,34,34,34,34, 33,33,32,32,32,32,31,31,31,30,30,30 }; const int n3c1w4_k[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,99,99,98,98,97,97,97,95,95,95,95,95,94, 94,94,94,94,93,93,93,93,92,92,92,91,90,89,89,89,89,89,88,88,88, 87,87,87,87,87,86,86,85,84,83,83,83,83,82,82,81,79,79,79,79,78, 78,77,76,76,76,75,75,75,74,73,73,72,72,72,72,71,70,70,70,70,70, 70,69,69,69,69,68,68,68,66,66,66,66,66,66,66,66,65,65,65,64,64, 63,63,63,63,62,62,62,61,61,61,61,61,59,59,59,59,59,59,58,58,58, 57,57,57,57,57,56,56,56,55,55,55,55,54,54,52,52,51,51,51,50,50, 50,50,49,48,47,47,47,46,46,46,46,45,45,44,44,44,43,42,42,41,41, 41,41,41,40,40,39,38,38,38,38,38,38,37,36,36,36,35,34,33,32,32, 32,31,31,31,31,30,30,30,30,30,30,30 }; const int n3c1w4_l[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,98,98,98,98,98,97,96,96,96,96,96,95, 95,95,95,94,94,94,93,93,92,92,92,92,91,90,90,89,88,88,88,88,87, 87,86,86,86,85,83,83,83,82,82,82,81,81,80,80,80,80,80,80,80,80, 79,79,78,78,77,77,76,75,75,75,75,75,75,74,74,74,73,73,72,72,72, 71,71,71,71,71,69,69,68,68,67,67,66,66,66,66,66,65,65,65,65,65, 64,64,63,62,62,62,62,62,62,62,62,61,61,60,60,60,59,59,59,59,58, 58,58,57,57,57,57,57,56,56,56,56,56,56,55,55,54,54,53,52,51,50, 50,49,49,49,49,48,48,48,47,46,45,44,44,44,44,44,43,43,43,43,42, 42,41,41,40,40,40,39,39,39,39,38,38,37,37,37,37,37,37,36,36,35, 35,34,34,34,34,33,32,32,31,31,31,30,30 }; const int n3c1w4_m[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,99,98,98,97,97,97,97,97,96,96,96,95,95,94,94, 94,93,92,92,92,91,91,90,90,90,90,89,88,88,88,88,87,87,86,86,86, 86,86,84,84,84,83,83,83,83,82,82,82,82,82,81,81,80,80,80,79,79, 79,79,79,78,78,78,78,78,77,77,77,76,76,76,76,75,74,74,73,73,73, 72,71,71,71,70,70,70,69,69,69,69,68,68,67,67,67,67,66,66,66,66, 65,65,65,64,64,64,64,64,64,63,62,62,62,61,61,60,60,59,59,59,59, 59,58,57,56,55,55,55,55,55,55,54,54,54,54,53,53,53,53,52,52,52, 52,51,50,49,48,48,48,48,48,47,47,45,45,45,45,44,44,44,43,43,42, 41,41,40,40,39,39,39,38,38,38,37,37,37,36,35,34,34,33,33,33,33, 33,32,32,31,31,31,31,31,30,30,30,30 }; const int n3c1w4_n[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,98,98,98,98,98,98,97,97,97,96,95,94,93,93,93,93,92, 92,92,92,92,91,91,91,90,87,87,87,85,85,85,84,84,84,83,83,82,82, 82,82,81,81,81,81,80,80,80,80,79,79,78,78,78,78,76,76,76,75,75, 74,73,72,72,72,72,72,71,71,71,71,70,70,70,69,69,69,68,68,68,68, 68,68,68,68,67,67,67,65,64,63,63,63,63,63,63,63,62,62,62,61,60, 60,60,60,60,60,59,59,59,59,58,58,58,57,57,56,56,56,56,55,55,55, 55,54,54,54,54,54,54,53,53,53,53,53,52,52,52,52,51,51,51,51,51, 51,50,49,49,49,49,47,47,46,46,46,45,45,45,45,44,44,43,43,43,42, 42,41,40,40,39,39,39,39,38,38,37,37,37,37,37,37,35,34,34,33,32, 32,32,32,31,31,31,31,31,30,30,30,30 }; const int n3c1w4_o[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,97,97,97,96,95,95,95,95,94,94,93,93,92,92,91, 91,89,89,88,88,87,86,86,86,86,85,85,84,84,83,83,82,82,82,82,81, 81,81,81,81,81,80,80,80,79,79,79,79,78,77,77,77,77,77,77,77,77, 76,76,75,75,75,74,74,73,73,73,73,72,72,72,72,71,71,71,71,70,70, 70,70,70,70,69,69,69,69,69,67,66,66,65,65,65,64,63,62,62,62,62, 61,61,61,61,60,60,60,58,58,58,58,58,58,58,58,58,57,55,55,54,53, 53,53,53,53,52,52,52,52,52,51,51,51,50,50,50,49,49,48,48,47,47, 46,46,45,45,45,45,44,44,43,42,42,42,42,41,41,41,41,40,40,37,37, 37,36,36,36,36,35,35,35,35,35,35,35,34,34,34,34,34,34,33,33,33, 33,33,32,32,32,32,32,32,32,31,31,30 }; const int n3c1w4_p[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,98,98,97,96,96,95, 95,94,94,94,93,92,92,92,92,92,92,91,90,89,89,89,89,88,88,88,88, 87,87,87,86,86,85,84,83,82,82,82,81,81,81,81,79,79,79,78,78,78, 77,77,77,77,77,76,76,76,76,75,75,75,75,74,74,74,74,74,73,73,73, 71,71,71,71,71,71,71,69,69,68,67,66,66,66,65,64,64,64,63,63,63, 63,63,63,62,62,62,62,61,60,60,60,60,59,59,59,59,59,58,58,58,57, 56,56,56,56,56,54,53,53,53,52,52,52,51,51,51,51,51,50,49,49,49, 48,47,47,47,47,46,46,46,45,45,44,44,43,43,42,42,42,41,41,41,41, 41,40,40,40,39,39,39,38,37,36,36,36,36,35,35,35,35,34,34,34,34, 33,33,33,33,33,32,32,32,32,31,31,30,30,30 }; const int n3c1w4_q[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,98,98,98,97,97,96,96,96,96,96,95, 95,95,95,94,93,93,93,92,92,92,92,92,92,91,91,90,90,90,89,87,87, 87,86,86,86,86,86,86,85,85,85,85,84,83,83,83,82,81,81,81,80,80, 80,79,79,79,79,79,79,79,79,78,78,77,77,76,76,76,75,75,75,74,73, 72,72,72,72,71,70,70,70,70,69,69,69,68,68,68,68,68,68,67,67,66, 66,65,65,65,65,64,64,64,62,62,62,62,61,60,60,59,58,58,58,58,57, 57,57,57,57,56,56,55,54,54,54,54,53,53,53,53,52,52,51,51,50,50, 50,49,49,48,48,48,48,47,47,46,45,45,45,44,44,43,43,43,42,42,42, 42,41,41,40,40,40,40,39,39,39,38,38,37,37,36,36,36,35,35,34,34, 33,33,33,33,32,32,32,32,31,30,30,30,30 }; const int n3c1w4_r[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,98,97,97,97,96,96,96,96,96,96,96,96,95,95,93,93, 93,93,92,92,92,91,91,91,91,90,90,90,90,89,88,88,87,87,87,86,85, 85,84,84,83,83,82,82,82,81,81,81,80,80,80,80,80,79,79,78,78,77, 77,77,76,75,74,74,73,73,73,73,72,72,71,71,70,70,69,69,69,69,68, 68,68,68,68,67,67,67,67,67,66,66,65,65,65,64,63,63,63,62,60,60, 60,60,59,59,59,59,59,58,58,58,58,58,57,57,57,57,57,57,57,57,56, 56,56,55,55,55,55,54,54,54,54,53,53,52,51,51,51,51,51,50,50,50, 49,48,47,46,46,46,46,45,45,44,44,44,43,43,43,42,42,42,41,41,41, 41,41,40,40,40,40,39,39,38,38,38,38,37,37,37,37,36,36,35,35,35, 35,34,33,33,33,32,32,31,31,31,30,30 }; const int n3c1w4_s[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,98,98,98,98,98,98,97,96,96,96,95,94,93,92,92, 92,92,91,91,91,91,91,90,90,90,90,89,89,89,89,89,88,88,87,86,86, 86,84,82,82,82,80,80,80,80,80,79,79,79,78,77,77,77,77,77,76,76, 76,76,75,75,74,74,74,73,73,72,72,72,72,72,71,71,71,71,70,70,70, 70,70,69,69,68,68,67,67,67,67,67,67,66,65,65,65,65,65,64,63,63, 63,62,62,62,61,61,61,60,60,60,60,60,60,60,60,59,59,58,58,58,58, 57,57,57,55,55,55,55,55,55,54,53,53,53,53,52,52,51,51,50,49,49, 49,49,48,48,48,47,47,46,45,45,45,45,44,43,43,43,42,42,42,42,42, 42,41,40,40,40,39,39,38,38,37,37,37,37,35,35,35,33,33,33,33,32, 32,32,31,31,31,31,31,30,30,30,30,30 }; const int n3c1w4_t[] = { 100, // Capacity 200, // Number of items // Size of items (sorted) 98,98,98,98,97,97,97,96,96,95,95,95,95,95,94,94,93,93,93,92,92, 91,91,91,91,91,90,90,90,90,90,89,89,88,88,88,88,88,87,86,86,86, 86,86,85,85,84,84,83,82,82,81,80,80,80,80,80,80,79,79,79,79,79, 78,78,78,77,77,77,77,76,76,76,76,75,75,74,74,74,74,73,72,72,71, 71,71,71,71,71,70,69,69,69,69,69,69,68,68,68,67,67,67,67,67,66, 66,65,65,65,65,65,64,63,62,61,61,61,60,60,59,58,58,57,57,57,56, 56,56,56,55,55,54,54,54,53,53,53,52,52,52,51,51,51,50,49,49,48, 48,48,47,47,46,45,45,45,45,44,44,44,43,43,43,43,43,43,43,42,42, 42,41,41,40,40,40,39,39,38,38,36,35,34,34,34,33,33,33,33,33,32, 32,32,31,31,31,31,30,30,30,30,30 }; const int n3c2w1_a[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,98,98,97,97,95,95,95,95,94,94,94,93,92, 92,91,91,91,91,91,90,90,90,90,89,89,89,88,87,87,87,87,87,86,86, 86,85,83,83,82,82,81,81,80,80,79,79,78,78,78,77,77,76,76,76,75, 74,74,74,74,73,72,72,72,72,71,70,70,69,69,67,67,67,65,64,64,63, 62,61,60,60,60,60,59,59,59,58,58,57,57,57,56,56,55,54,53,53,51, 51,50,49,48,47,47,46,46,46,46,45,45,45,44,44,43,43,42,42,41,41, 40,40,40,40,40,39,38,38,38,38,38,36,36,35,32,32,30,30,30,30,29, 29,28,25,24,24,24,24,23,23,23,23,23,22,22,21,20,19,19,19,19,17, 17,16,16,16,16,16,16,15,15,13,13,13,12,10,10,9,9,8,8,7,7,5,4, 4,4,4,4,4,3,2,2,2,1 }; const int n3c2w1_b[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,98,97,96,96,96,95,95,94,93,93,93,92,90, 90,90,89,89,89,88,87,87,87,86,83,82,81,81,80,80,80,79,79,79,78, 77,77,77,77,76,76,76,75,73,72,72,72,72,71,70,68,68,68,68,67,66, 66,66,66,66,65,65,65,63,63,63,62,61,60,60,60,60,58,58,57,57,56, 56,56,56,55,55,55,55,55,53,52,51,51,50,50,50,50,49,49,48,48,48, 48,47,47,46,46,45,45,45,45,43,43,42,41,40,40,40,40,40,39,39,39, 39,39,38,38,37,36,35,35,34,34,34,33,33,31,30,30,30,27,27,25,25, 24,24,23,23,23,23,22,22,21,21,20,19,19,19,19,19,18,18,17,17,17, 16,16,15,15,15,14,14,14,13,13,12,12,12,12,12,10,9,9,9,9,9,9,9, 8,7,5,5,4,4,3,2,1,1,1 }; const int n3c2w1_c[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,98,97,97,96,96,96,96,93,93,92,90,90,89,89,89,89,89,88, 88,87,86,86,86,85,85,85,85,83,82,81,81,81,80,80,79,79,78,77,77, 76,76,76,75,75,75,74,74,73,73,72,72,72,72,72,71,70,70,70,70,70, 69,69,68,68,67,66,66,65,65,63,63,63,62,62,62,62,60,60,59,59,58, 58,58,57,57,57,55,55,54,54,53,53,53,52,52,51,51,51,50,50,49,48, 48,47,47,47,46,44,43,43,43,42,42,41,40,40,40,40,39,39,39,39,39, 38,37,36,36,36,35,35,34,34,34,34,33,33,33,33,32,32,32,32,31,30, 29,29,29,29,28,27,26,25,24,23,23,22,22,20,20,20,19,19,19,18,18, 17,17,17,16,16,15,15,15,13,13,13,13,13,12,12,10,10,9,9,9,8,8, 7,7,7,5,4,4,3,3,1,1,1 }; const int n3c2w1_d[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,98,98,98,97,96,95,95,95,94,94,93,93,93,93,92, 92,92,91,90,90,89,89,88,87,86,86,85,85,84,84,84,83,83,83,83,81, 79,78,78,77,77,76,76,75,75,75,75,75,74,74,74,74,74,73,73,73,72, 71,71,70,69,69,68,68,66,65,65,65,65,65,64,64,63,61,61,61,61,60, 60,60,60,60,59,59,58,58,57,57,56,55,54,53,53,52,51,51,51,50,49, 48,47,46,46,45,44,44,43,41,41,39,39,38,38,38,37,37,37,36,36,35, 35,35,34,34,34,34,34,33,32,32,32,31,29,28,28,28,27,27,26,25,25, 23,23,23,23,23,22,22,22,22,21,20,18,18,17,17,17,16,16,15,15,14, 13,13,12,12,12,11,11,11,11,11,10,8,8,8,8,8,6,6,6,6,6,5,5,4,4, 3,3,2,2,1,1,1,1 }; const int n3c2w1_e[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 99,99,99,99,98,98,98,97,96,95,95,95,95,95,94,94,93,93,93,91,91, 91,90,90,90,90,90,90,89,89,88,87,87,86,86,85,85,85,85,84,84,83, 82,82,80,80,79,79,79,78,78,78,78,77,77,77,76,76,76,75,75,75,72, 72,71,71,70,70,69,67,67,67,67,66,65,65,64,64,64,63,63,63,62,62, 61,61,59,59,58,58,58,57,57,57,57,56,55,55,55,54,53,52,51,51,50, 50,49,48,47,46,45,44,44,43,43,42,40,40,38,37,37,36,36,35,35,35, 35,33,33,32,32,32,31,31,31,31,31,31,30,29,29,29,28,27,27,26,26, 25,24,24,24,22,22,21,20,19,19,19,18,17,16,16,16,15,15,15,15,15, 14,14,14,13,13,12,12,12,12,11,11,10,9,9,8,7,6,6,6,6,5,5,5,4,4, 4,3,3,3,3,3,2 }; const int n3c2w1_f[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,98,98,98,98,97,96,95,95,95,94,93,93,93, 92,92,91,90,90,90,89,89,89,88,88,88,87,87,87,86,84,83,83,83,83, 83,82,82,80,80,79,79,79,78,75,75,75,75,74,74,73,72,72,72,72,70, 69,69,69,69,68,67,67,67,66,66,64,64,64,63,63,63,62,62,62,61,61, 61,61,61,61,61,60,59,59,59,59,59,59,57,57,57,56,55,55,54,54,54, 53,53,53,52,51,51,50,50,50,49,49,48,47,47,46,45,45,45,42,42,42, 40,39,37,36,36,35,35,34,34,34,34,34,32,32,32,30,30,29,28,27,27, 27,25,25,25,24,24,24,24,24,23,22,22,22,22,21,20,19,19,18,17,17, 16,15,15,15,14,12,12,12,11,11,11,10,10,10,10,9,9,9,9,8,8,8,7, 6,6,5,5,4,2,2,2,1,1,1 }; const int n3c2w1_g[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 99,99,98,98,97,97,96,96,95,94,94,92,92,92,90,90,89,89,89,88,88, 88,87,86,86,86,85,85,85,85,85,84,84,83,82,82,81,81,81,80,80,80, 79,79,79,78,78,75,75,75,74,74,74,74,73,73,72,72,71,70,69,69,68, 67,67,67,67,67,67,67,66,65,65,64,63,63,63,63,63,62,62,61,60,60, 60,59,59,58,58,58,58,57,57,57,56,55,55,55,54,53,52,52,52,52,52, 51,51,50,50,49,49,49,49,49,47,46,46,46,46,44,44,43,43,42,42,42, 41,41,41,40,39,39,37,36,36,36,35,35,35,34,34,33,33,33,32,31,31, 31,30,30,29,29,29,29,28,28,28,27,26,26,25,24,23,23,23,23,23,22, 22,22,22,22,20,20,19,19,19,17,15,15,14,12,11,10,9,8,7,7,5,5,5, 4,4,4,3,3,1,1,1,1 }; const int n3c2w1_h[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,99,99,98,98,97,97,96,96,95,94,94,94,93,93,93, 92,92,90,90,90,89,89,87,87,86,85,85,85,85,85,85,84,84,83,82,82, 82,81,81,80,79,79,77,77,77,77,75,74,74,73,72,72,71,71,71,70,70, 70,69,69,68,67,67,66,66,66,64,63,62,62,62,62,62,62,60,59,59,59, 59,59,58,58,57,57,57,56,56,56,55,55,54,54,53,53,52,52,52,52,51, 51,50,50,50,50,50,49,48,48,48,48,47,47,46,46,44,44,43,43,43,42, 42,41,41,41,40,40,38,38,37,36,36,35,35,33,32,32,31,31,31,30,30, 28,28,28,27,25,25,24,24,24,24,24,21,20,20,19,19,18,18,17,17,17, 17,17,16,16,16,15,14,14,14,14,13,13,12,12,12,11,11,9,9,9,8,6, 6,6,5,4,4,3,3,2,1,1,1,1 }; const int n3c2w1_i[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,99,99,98,97,97,97,97,97,97,97,96,96,95,95,95,95,95, 94,93,93,93,92,92,92,91,91,90,90,88,88,88,88,87,86,85,84,84,84, 84,83,83,81,79,79,79,78,78,77,76,76,75,74,74,73,73,73,72,72,72, 71,71,71,70,70,70,69,69,68,68,67,67,66,65,64,64,63,63,60,60,60, 59,58,58,58,58,57,56,56,55,55,54,53,53,52,52,51,51,51,50,50,50, 49,49,48,48,48,47,47,47,45,45,43,43,42,42,41,41,41,40,40,40,39, 38,38,37,37,36,36,35,35,35,35,35,34,33,33,32,32,31,30,29,29,27, 26,25,25,24,24,24,23,23,23,23,21,20,20,20,20,20,19,18,17,17,16, 16,16,14,14,13,13,13,13,13,12,12,11,11,10,10,9,9,8,8,8,8,7,6, 6,6,5,4,4,3,3,2,2,1 }; const int n3c2w1_j[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,98,98,97,95,95,95,94,93,92,92,92,92, 91,91,88,87,87,86,86,85,84,84,84,83,83,82,82,82,81,81,81,80,80, 79,78,78,77,76,76,76,75,74,74,74,73,72,70,69,68,68,67,67,67,67, 67,67,66,66,66,65,65,65,65,65,65,64,64,64,63,63,63,62,61,60,59, 59,59,58,58,58,57,57,57,56,56,56,56,55,55,54,54,54,53,53,52,52, 51,50,50,50,49,49,49,48,47,47,46,46,45,45,45,44,44,44,43,43,43, 41,41,41,39,38,37,36,36,36,36,36,36,35,35,35,34,33,33,32,31,31, 30,30,29,29,29,29,29,28,28,26,26,26,26,26,25,25,25,24,23,23,21, 20,20,20,20,20,19,19,19,18,18,17,16,15,15,15,13,12,11,10,9,9, 9,8,7,7,7,5,4,3,3,2,2,1,1 }; const int n3c2w1_k[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 99,99,99,99,98,98,96,95,95,92,92,92,91,91,91,91,89,89,89,88,88, 87,85,85,84,84,84,83,83,83,83,83,82,81,80,80,79,79,77,77,76,74, 73,73,73,73,73,70,69,68,66,66,66,66,65,65,65,64,63,63,62,62,61, 61,59,59,59,58,58,57,57,56,56,55,55,54,54,54,53,52,52,51,50,50, 50,50,49,49,48,48,48,48,48,47,47,46,46,46,45,45,45,44,44,44,43, 43,43,42,42,42,41,41,40,40,40,39,38,38,36,36,35,35,35,34,33,33, 33,33,33,33,32,32,32,31,30,30,30,28,28,27,27,27,26,25,24,23,23, 22,22,22,21,20,20,18,18,17,17,17,16,15,15,14,14,14,13,13,13,12, 12,12,12,12,11,11,11,11,10,9,8,7,7,7,7,7,7,7,7,7,6,6,5,5,5,5, 5,4,4,3,2,1 }; const int n3c2w1_l[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,99,99,97,96,96,96,95,95,95,94,94,94,94,93,93, 93,93,93,92,92,92,92,91,91,88,88,88,87,87,86,85,85,85,83,83,82, 82,82,81,81,80,80,79,79,78,78,77,77,77,77,76,74,74,74,73,71,70, 69,68,67,67,67,67,66,66,66,66,66,65,65,65,65,64,64,64,64,64,64, 63,63,62,61,61,60,60,60,59,58,57,56,56,56,56,55,55,55,54,54,54, 53,53,52,52,52,51,50,49,48,48,47,47,45,45,44,44,44,44,43,43,43, 43,42,41,41,40,40,40,40,40,40,40,38,37,37,37,35,35,33,33,33,31, 31,30,30,28,27,25,25,25,24,24,24,23,22,22,20,20,19,19,19,18,18, 18,18,17,16,15,14,14,13,13,12,11,11,11,10,10,10,8,8,7,7,7,6,5, 5,5,5,5,3,2,2,2,1,1 }; const int n3c2w1_m[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,98,97,97,96,96,95,95,93,92,92,91,88,88,88,87,86, 86,86,85,85,83,83,83,82,82,82,82,81,81,81,81,81,81,80,80,79,78, 78,78,77,77,77,75,75,74,73,73,72,72,72,72,72,72,71,71,71,70,70, 69,69,69,68,67,66,66,65,65,64,64,64,63,63,63,63,62,61,61,61,61, 60,60,60,59,59,58,57,56,55,55,54,54,54,53,53,53,53,53,52,52,52, 50,48,48,46,46,46,46,45,44,44,43,43,43,43,43,42,42,42,42,40,40, 40,39,38,36,36,36,36,36,36,32,32,32,31,31,30,30,28,28,27,27,27, 26,26,25,25,25,24,24,23,22,22,22,21,21,21,20,20,20,20,20,19,19, 19,18,18,18,18,16,16,15,13,13,12,11,11,10,10,9,9,8,8,8,7,7,6, 5,5,4,3,3,2,2,2,2,2 }; const int n3c2w1_n[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,98,98,97,97,97,96,96,95,94,94,94,94,93,93,93,92,91, 91,91,91,89,89,89,89,88,88,88,87,86,86,86,85,84,84,84,83,83,82, 81,81,80,80,80,80,79,79,79,79,78,77,77,77,76,76,75,75,75,75,75, 74,74,73,72,72,72,71,71,70,70,69,69,69,68,67,67,66,66,64,64,64, 63,62,62,62,61,60,60,60,60,60,59,58,58,57,56,56,54,54,53,53,52, 52,52,52,51,49,49,49,49,49,47,47,47,46,46,46,45,45,44,44,42,41, 41,41,40,40,39,38,38,37,36,36,36,33,32,31,31,30,30,30,30,29,28, 27,26,26,23,22,21,21,21,21,21,20,20,20,20,19,18,18,18,16,16,15, 13,13,12,12,11,10,10,10,10,9,9,9,8,8,7,7,7,6,6,5,5,4,4,3,3,3, 3,2,2,2,1,1,1 }; const int n3c2w1_o[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,98,98,96,94,93,92,92,92,91,91,90,90,89,89,89,88,88, 87,87,87,86,86,84,84,84,83,81,79,79,79,78,77,77,77,77,77,75,75, 75,74,74,74,73,73,73,73,72,72,71,71,70,70,69,68,68,67,67,66,66, 65,65,64,64,64,63,63,63,63,63,63,62,62,61,61,61,61,60,60,60,60, 59,59,58,58,58,58,58,57,57,57,56,55,55,55,54,54,53,53,53,52,51, 51,50,48,48,47,47,46,46,44,43,42,41,41,41,41,40,40,40,39,39,39, 39,38,37,36,36,36,35,35,35,34,33,32,32,32,31,31,31,30,29,28,28, 27,27,27,27,27,24,23,23,21,20,20,19,19,19,18,18,18,17,17,16,16, 15,14,13,13,13,13,12,12,11,11,9,9,8,8,8,8,7,7,7,6,4,4,3,3,3,3, 2,2,2,1,1,1,1 }; const int n3c2w1_p[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 99,99,97,97,97,97,97,96,96,96,96,96,96,94,94,94,93,92,92,89,89, 89,88,88,87,87,86,85,85,85,84,84,84,83,83,83,83,83,83,82,81,81, 81,80,80,80,79,79,79,78,78,77,76,76,75,74,73,72,71,71,71,71,69, 69,68,68,68,68,67,67,66,66,66,65,65,65,65,65,64,64,64,63,63,60, 60,58,58,58,58,57,57,57,56,56,56,55,54,54,53,53,53,53,52,52,50, 50,49,49,47,46,45,45,45,44,44,43,42,42,41,41,41,41,40,40,40,40, 40,40,39,39,38,38,38,37,37,37,37,36,36,35,34,34,34,34,34,33,33, 32,32,31,31,31,30,30,29,28,27,27,27,26,25,25,24,23,22,22,21,21, 21,21,20,19,19,19,18,17,17,17,16,15,13,13,13,10,10,9,9,9,9,9, 9,8,7,6,6,5,4,3,2,1 }; const int n3c2w1_q[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,98,97,97,97,96,96,96,96,96,95,94,93,93,93,92,92,92,91,90, 90,90,90,90,89,89,88,88,87,87,86,85,84,84,82,82,81,81,80,79,79, 77,75,75,75,75,73,73,72,72,71,71,71,71,71,70,70,69,69,69,69,68, 68,67,67,66,66,65,65,65,64,62,62,62,60,59,59,59,59,58,58,58,57, 57,56,55,55,55,54,54,53,53,53,53,52,52,51,50,50,48,47,47,46,46, 46,45,44,44,43,43,42,41,41,41,41,40,40,39,39,39,37,37,36,36,36, 35,33,32,32,32,32,32,31,31,31,31,30,30,30,29,29,28,27,26,26,26, 25,25,25,25,24,24,24,22,22,21,20,20,19,18,18,18,17,15,15,15,15, 14,14,13,12,12,12,11,10,10,10,10,10,9,8,8,8,8,8,8,7,7,6,6,5,5, 5,5,5,4,4,4,2,2 }; const int n3c2w1_r[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 99,99,99,99,99,98,98,97,96,95,95,93,92,91,91,90,90,90,89,89,89, 86,84,84,84,83,82,82,80,80,79,79,78,78,77,77,77,76,76,76,76,74, 74,74,72,72,71,71,71,71,70,70,70,69,69,69,68,67,66,66,65,65,64, 64,64,64,63,63,62,62,62,61,61,60,60,60,59,59,58,58,58,57,56,56, 55,54,53,53,52,52,52,52,52,51,51,51,50,50,50,49,49,47,47,46,46, 45,44,44,44,44,43,43,42,42,42,42,41,41,41,41,40,40,40,40,40,39, 39,39,39,37,36,35,35,34,34,33,33,33,32,32,32,32,31,30,30,29,29, 28,27,27,26,26,26,26,25,25,25,24,24,24,23,23,23,22,21,21,21,19, 18,18,18,17,17,16,16,15,14,14,14,13,12,11,11,10,9,7,7,7,7,7,7, 6,5,4,4,3,2,2,1,1 }; const int n3c2w1_s[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,98,98,97,97,96,95,95,94,94,94,94,94,93, 93,93,93,92,92,92,91,90,89,89,89,89,88,88,88,88,87,87,87,86,86, 85,84,84,84,83,83,82,81,81,80,79,79,78,78,77,77,77,76,76,76,75, 75,74,73,73,73,70,70,69,68,66,66,66,65,65,65,63,63,62,62,62,60, 59,59,59,59,57,57,57,57,57,57,57,55,55,53,53,53,53,53,52,52,52, 51,51,50,49,49,49,48,47,47,46,45,45,45,44,44,44,42,42,42,41,40, 40,40,39,39,39,39,36,36,36,35,34,34,34,33,33,31,31,30,30,30,29, 29,29,27,27,27,26,26,26,25,25,25,25,24,23,23,22,22,21,20,20,20, 20,19,17,17,17,16,16,16,16,15,15,14,13,12,12,12,12,12,12,12,11, 11,11,9,9,9,9,9,8,8,6,6,6,6 }; const int n3c2w1_t[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,98,97,97,96,96,96,95,94,94,92,92,91,91,90,90, 89,89,89,88,88,88,87,87,87,87,85,85,85,84,84,84,84,84,83,82,82, 82,82,80,79,79,79,78,78,78,77,76,76,75,71,71,69,69,69,68,68,68, 68,67,67,66,66,66,66,65,65,65,64,63,63,61,58,58,58,57,57,56,55, 55,55,54,54,54,53,53,52,51,50,50,49,49,49,48,47,46,46,46,45,44, 44,44,44,44,44,44,43,43,43,42,42,42,41,41,40,40,39,39,39,39,38, 38,38,37,35,35,35,33,32,32,31,31,30,30,29,29,28,28,27,27,26,26, 25,25,24,24,23,23,22,22,22,22,22,21,21,20,20,20,19,19,18,16,16, 15,15,14,14,14,13,13,13,12,12,12,12,12,11,11,10,10,10,9,8,8,7, 7,6,6,3,3,2,2,1,1,1,1 }; const int n3c2w2_a[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,99,98,98,98,98,97,97,96,96,96,95,95,95,94,94, 94,94,93,92,92,91,91,90,90,89,88,88,88,87,87,87,86,86,86,85,85, 84,84,83,83,83,82,82,81,81,81,81,80,80,78,78,78,78,78,77,77,76, 76,76,76,75,75,75,75,74,74,74,73,73,72,71,70,70,69,69,68,68,68, 68,67,67,67,67,66,66,66,66,65,65,65,65,65,64,64,63,63,62,61,61, 61,60,59,58,58,58,57,57,57,57,56,55,55,55,55,54,54,54,53,52,51, 51,51,50,50,50,49,49,49,48,48,47,47,47,47,47,46,46,46,45,44,44, 44,43,42,42,42,42,41,41,41,40,40,39,38,38,37,37,35,35,35,34,34, 34,34,33,32,32,32,31,31,31,31,30,30,29,29,28,28,27,27,27,27,26, 26,25,25,25,23,22,22,21,21,20,20,20 }; const int n3c2w2_b[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,98,98,98,97,97,97,97,96,94,94,93, 93,91,91,91,91,91,90,90,90,89,88,88,87,87,87,86,86,85,85,85,84, 84,83,82,82,82,81,81,80,79,79,79,79,79,79,79,78,77,77,77,77,77, 76,75,75,73,73,72,72,72,72,72,70,70,70,69,69,68,68,68,67,67,67, 67,66,66,65,65,65,64,64,64,64,63,63,63,62,62,61,61,61,61,61,61, 60,60,60,59,58,57,57,57,56,56,55,55,54,53,53,53,52,52,51,51,50, 50,49,48,47,47,46,45,45,45,45,44,43,43,43,42,42,42,42,42,40,39, 38,37,37,36,36,36,36,35,34,34,33,33,33,33,32,32,32,32,31,30,30, 30,30,30,29,29,29,29,29,28,28,27,27,27,27,26,26,26,25,25,25,25, 24,24,24,23,22,22,22,22,21,20,20,20,20 }; const int n3c2w2_c[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,98,98,97,97,97,97,96,95,95,94,94,93,93,93,92, 92,92,92,91,90,90,90,90,89,89,89,89,89,88,88,88,87,87,86,86,86, 85,85,84,84,83,83,83,82,81,81,80,80,79,79,78,78,78,78,78,78,77, 76,76,76,76,75,75,75,75,74,73,73,72,71,69,69,69,68,68,68,68,67, 66,66,66,66,65,65,65,64,64,64,63,63,63,62,62,62,61,61,60,59,58, 58,57,56,55,55,55,54,54,52,51,51,51,50,50,50,49,49,49,49,48,48, 48,48,47,47,47,47,47,46,46,46,46,45,45,44,44,44,43,43,43,42,42, 41,41,41,41,40,40,40,40,40,40,39,39,38,38,38,38,38,37,37,36,36, 36,35,35,34,34,33,33,33,33,33,32,30,29,27,27,27,26,26,25,25,25, 25,25,25,24,22,22,21,21,21,21,21,20,20 }; const int n3c2w2_d[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,98,97,96,96,96,96,96,95,95,95,94,94,94,93,93,93,93, 93,92,92,92,92,91,91,91,90,90,89,89,89,88,88,88,87,86,85,85,85, 84,84,84,84,84,83,83,83,83,83,83,82,82,82,81,81,81,80,79,78,78, 78,77,77,76,76,75,75,75,75,75,75,74,74,73,72,72,72,70,70,70,70, 69,68,68,68,68,68,67,66,66,65,65,65,64,64,63,61,61,60,60,60,60, 59,59,59,58,58,57,57,57,56,55,55,55,54,54,53,52,52,52,51,51,51, 51,50,50,50,50,49,49,49,49,47,47,47,47,45,45,45,43,43,42,41,41, 41,41,40,40,40,40,39,39,38,38,38,38,38,37,37,37,37,37,36,36,36, 36,36,35,35,34,34,34,34,33,33,33,33,32,32,31,30,29,29,28,28,27, 26,25,24,24,24,23,23,22,22,21,20,20 }; const int n3c2w2_e[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,98,98,98,98,98,97,97,97,97,96, 96,96,96,96,95,95,95,94,94,94,93,92,92,92,92,91,91,91,91,90,90, 90,90,89,89,89,89,88,88,87,87,87,87,87,87,86,86,86,85,85,84,83, 83,82,82,81,81,81,80,80,80,79,79,79,78,78,77,77,76,76,75,75,74, 74,74,74,73,72,69,69,69,67,67,66,66,66,66,65,65,64,64,63,63,62, 62,62,62,62,62,61,60,59,58,58,58,57,57,56,55,55,55,55,54,53,53, 53,53,53,53,53,53,52,52,52,52,51,50,49,49,49,49,49,48,48,47,47, 47,46,46,46,46,45,45,44,44,43,42,41,40,40,40,40,40,40,39,38,38, 38,38,37,37,36,36,34,34,34,32,32,32,31,30,30,29,28,27,26,26,26, 25,25,25,25,25,24,24,23,23,22,21,20,20 }; const int n3c2w2_f[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,98,98,98,97,97,97,96,96,95,95,95,95, 94,94,94,94,92,92,92,92,92,92,91,91,91,90,90,90,90,90,90,89,88, 87,86,86,86,86,85,84,84,84,84,84,84,84,83,82,82,82,82,82,81,80, 80,80,80,79,78,78,77,77,76,76,76,75,75,75,75,74,74,74,73,73,72, 72,71,70,70,69,68,67,67,67,67,66,64,63,63,63,62,62,61,60,59,59, 59,59,57,57,57,56,54,54,54,54,53,53,53,53,53,51,51,51,51,50,50, 49,48,48,48,48,48,47,47,46,46,45,45,44,44,44,43,43,43,43,42,42, 41,40,39,38,38,38,38,38,38,38,38,37,37,36,35,35,35,35,34,34,33, 32,32,31,31,30,30,30,30,30,30,29,29,29,28,28,28,27,27,27,27,26, 26,26,24,23,23,22,22,22,21,21,21,20,20 }; const int n3c2w2_g[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,98,98,98,98,98,97,96,96,95,95,92,92,92, 92,92,92,91,91,91,91,90,90,89,89,89,89,89,88,88,88,87,87,85,84, 84,83,83,83,82,82,82,81,81,81,81,80,79,79,79,79,78,78,77,77,77, 77,76,76,76,76,75,75,75,74,74,74,74,73,73,70,69,69,68,67,66,66, 66,64,64,64,64,63,63,63,63,63,62,62,61,61,61,61,60,60,59,59,57, 57,57,57,57,57,56,55,54,54,53,53,53,53,52,52,52,51,50,50,50,50, 49,48,48,48,47,46,46,46,45,45,45,45,44,44,43,42,41,41,40,40,39, 39,39,39,38,38,38,37,37,37,37,36,36,36,36,35,35,35,35,34,34,33, 33,33,31,31,30,30,30,29,29,29,29,29,27,27,27,26,25,25,24,24,24, 24,23,23,23,22,21,21,21,21,21,21,21,20 }; const int n3c2w2_h[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,99,98,98,98,97,97,97,97,97,96,96,96,96,96,95,95,95,95,95, 95,94,94,94,93,93,93,93,92,92,92,91,91,91,90,90,89,89,89,88,88, 88,87,86,86,85,85,85,85,84,84,83,83,83,82,82,82,81,81,80,80,80, 80,79,79,79,79,78,78,78,77,77,77,76,76,75,75,75,74,74,74,73,72, 72,72,72,72,71,71,71,71,69,69,69,69,68,68,68,66,66,66,65,65,64, 64,64,63,63,62,61,61,61,61,61,61,60,60,59,59,59,59,58,58,57,56, 56,56,56,55,55,55,54,54,53,52,52,51,51,51,51,51,50,50,49,48,45, 45,44,44,44,43,43,42,42,42,42,41,39,38,38,38,37,37,37,37,36,36, 35,35,34,34,33,33,33,32,32,31,30,30,30,30,29,28,28,28,28,27,27, 26,26,25,25,25,25,24,24,23,22,22,20 }; const int n3c2w2_i[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,98,98,97,97,97,96,96,95,95,95,93,93,92,92,92, 92,91,91,91,90,89,89,89,89,88,88,88,88,87,87,87,87,87,86,86,86, 86,86,85,85,85,84,84,84,84,84,83,83,82,81,80,80,79,78,77,77,76, 76,76,75,74,74,74,73,73,73,72,72,71,70,69,68,66,66,66,66,65,65, 65,65,64,64,63,63,62,61,61,61,60,59,59,59,59,58,58,58,57,57,57, 56,55,55,55,55,55,54,54,54,53,52,52,52,52,52,51,51,50,50,50,50, 49,49,49,49,48,47,47,46,46,45,45,45,44,43,43,42,42,42,41,41,41, 40,39,38,38,37,37,36,36,36,35,34,34,33,33,33,33,32,32,31,31,31, 30,30,29,29,29,29,28,28,28,28,28,27,27,27,26,25,25,25,25,24,24, 24,24,23,23,22,22,21,21,21,21,20,20 }; const int n3c2w2_j[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,97,97,96,96,96,96,95,94,94,94,94,93,92,91,91,91, 90,90,90,90,90,90,89,89,89,89,88,88,87,87,87,87,86,86,85,84,84, 83,83,83,83,83,82,82,82,82,82,81,81,81,80,80,79,78,78,78,76,76, 76,75,75,75,75,74,74,74,74,73,73,73,72,72,71,71,71,70,69,69,68, 68,68,67,67,66,66,66,65,65,65,64,64,63,63,63,62,62,61,60,60,60, 60,58,58,58,58,58,58,57,57,57,57,57,55,54,54,53,52,52,52,52,52, 52,51,51,51,50,50,49,49,48,47,47,47,46,46,46,46,45,45,44,43,43, 43,43,42,42,42,42,42,41,41,41,40,40,40,39,39,39,38,38,38,38,37, 37,37,36,36,36,36,35,35,34,34,33,31,30,30,29,29,28,28,28,28,25, 25,24,24,22,22,21,21,21,20,20,20,20 }; const int n3c2w2_k[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,99,99,98,96,96,96,95,95,95,94,94,94,94,93,93,93,93, 93,92,92,91,91,91,90,90,89,89,89,89,89,88,87,87,87,86,85,85,85, 84,84,84,83,83,82,82,81,81,81,80,80,79,79,79,79,78,77,77,76,76, 75,75,75,74,74,74,73,73,73,72,72,72,72,72,71,71,71,71,71,71,70, 69,69,68,67,67,67,67,67,67,66,66,65,65,64,64,64,64,63,63,63,62, 62,61,61,61,61,60,59,59,58,57,57,57,57,56,56,56,55,54,54,54,54, 53,52,51,51,50,49,49,49,48,47,47,47,47,46,46,46,45,45,45,45,45, 44,43,42,42,42,41,41,41,41,40,40,39,38,38,37,36,36,36,36,35,35, 34,33,33,33,33,32,32,32,31,31,31,31,30,30,28,28,28,28,27,27,26, 26,26,25,23,22,22,21,21,21,21,20,20 }; const int n3c2w2_l[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,98,97,97,97,97,96,96,95,95,95,94,94,94,94,94, 94,93,93,92,92,92,92,92,91,91,90,89,89,88,88,87,87,86,86,85,85, 85,84,84,84,84,81,81,80,80,80,80,79,78,78,77,77,77,77,77,76,76, 75,75,74,73,73,73,72,72,71,71,70,69,69,69,69,69,68,68,68,67,67, 67,66,66,66,66,66,66,65,65,65,64,64,63,63,63,63,62,62,61,61,61, 60,60,59,58,58,57,57,57,56,56,56,55,55,55,55,54,54,53,53,52,51, 51,51,51,51,51,50,49,49,49,48,48,47,47,46,45,45,44,44,44,44,43, 43,43,42,42,40,40,40,40,39,39,38,38,37,37,36,36,36,34,34,34,33, 32,32,31,31,30,30,29,28,28,28,28,28,27,27,27,27,27,26,26,25,25, 25,24,24,23,22,22,21,21,21,20,20,20 }; const int n3c2w2_m[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 99,99,99,98,98,98,97,97,97,97,97,96,96,95,95,95,95,95,94,94,94, 93,92,92,92,91,90,90,90,89,89,89,89,89,88,87,87,86,86,85,85,85, 85,84,84,84,84,84,83,83,83,83,82,82,82,81,81,81,80,80,80,78,77, 77,76,76,75,75,74,74,73,72,71,71,70,70,70,70,70,69,68,68,68,68, 67,67,66,66,66,66,66,65,65,64,64,63,62,62,62,61,61,61,61,60,60, 59,59,59,59,58,58,58,57,57,57,57,57,56,56,55,55,54,54,53,53,53, 52,52,52,51,51,50,50,50,50,50,49,49,48,48,47,47,47,47,47,46,45, 45,44,43,43,43,43,42,42,40,39,39,39,39,39,38,38,37,37,37,36,36, 36,35,35,34,33,33,33,33,32,32,32,32,31,31,30,29,27,27,26,24,24, 24,22,22,22,22,22,22,22,21,21,20 }; const int n3c2w2_n[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,98,98,98,97,97,97,97,96,96,96,96,95,95,95,95, 95,94,94,94,94,92,92,92,90,90,90,89,88,88,87,87,87,86,86,84,83, 83,82,81,81,81,81,81,80,80,79,79,78,78,78,77,77,77,77,77,77,76, 76,76,75,75,75,74,74,73,73,73,72,72,72,71,71,71,70,70,69,68,68, 67,67,66,66,65,64,63,63,63,63,63,62,62,62,62,61,61,60,60,59,59, 59,58,58,58,58,57,57,57,57,57,55,55,55,54,54,54,53,53,53,52,52, 50,50,49,48,48,48,47,47,46,46,46,46,44,44,44,43,43,43,42,42,42, 41,41,41,41,41,41,41,40,40,38,38,37,37,37,37,36,36,36,36,36,35, 35,35,34,34,34,33,33,33,32,32,31,30,30,29,29,28,28,28,27,27,27, 26,26,26,26,26,25,25,23,23,22,22,20 }; const int n3c2w2_o[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,98,98,97,97,96,96,96,96,95,94,93,93,92,91,90,89, 89,88,88,88,88,88,88,88,87,87,87,87,87,87,87,87,86,86,85,85,85, 84,83,83,82,82,82,81,81,81,80,80,79,78,78,78,77,77,76,76,76,76, 75,75,74,74,74,74,74,74,72,72,72,72,71,71,70,70,70,70,70,69,68, 67,67,67,67,66,66,66,66,66,65,65,64,64,63,62,61,61,61,61,60,60, 60,60,58,58,57,57,57,57,56,56,55,55,55,55,54,54,53,53,53,52,52, 52,52,52,51,51,51,51,49,49,49,49,48,47,47,47,46,45,44,44,44,44, 44,43,42,42,42,41,41,40,40,39,39,39,39,38,38,36,36,36,36,35,35, 35,34,34,34,34,34,34,33,33,33,33,31,30,29,29,28,26,25,25,25,24, 24,24,24,23,22,22,21,21,21,20,20,20 }; const int n3c2w2_p[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,99,99,97,97,97,97,97,97,96,96,95,95,94,94,93, 93,92,91,90,90,90,90,90,89,89,89,89,89,89,88,88,87,87,86,86,85, 85,85,84,84,84,84,84,83,83,83,82,81,81,81,81,81,80,79,79,78,78, 78,77,76,76,75,75,75,74,74,74,74,73,73,71,71,70,70,70,70,70,68, 67,67,67,67,65,65,65,65,65,64,64,63,62,62,62,62,61,60,59,59,59, 58,58,58,57,56,56,55,55,54,54,53,53,53,53,52,52,52,52,51,51,51, 51,51,51,51,51,50,50,50,50,49,49,49,48,48,48,47,47,46,46,46,46, 45,45,44,44,43,43,43,42,42,39,39,39,39,38,38,37,37,37,37,36,35, 34,33,33,33,33,33,32,32,32,32,31,31,30,30,30,29,29,29,27,27,27, 26,25,25,23,23,22,22,22,21,20,20,20,20 }; const int n3c2w2_q[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,98,96,96,96,95,94,94,94,93,93,93,92,92, 92,91,91,90,88,88,88,88,88,87,86,85,85,85,84,84,84,83,83,83,82, 82,82,82,81,81,81,81,81,79,79,78,77,77,76,76,76,75,75,74,73,73, 72,72,71,70,70,70,70,69,69,69,69,68,68,67,67,66,66,65,65,65,65, 64,64,64,64,64,64,63,63,63,63,63,63,63,62,62,62,62,61,60,59,59, 59,59,59,59,59,58,58,58,58,57,57,57,56,55,55,55,54,53,53,53,53, 53,52,52,51,51,50,50,50,50,49,49,49,48,48,47,47,47,45,44,44,44, 42,41,41,41,41,41,40,40,40,40,39,38,38,38,37,37,37,37,37,36,36, 36,35,34,32,32,32,31,31,31,30,30,29,29,29,29,28,26,26,26,25,24, 24,24,23,23,22,21,20,20,20,20,20,20 }; const int n3c2w2_r[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,99,98,98,98,97,97,97,97,97,96,96,96,95,95,95,93,93, 92,92,91,91,91,91,90,90,89,89,89,88,88,87,87,87,87,86,86,86,85, 85,85,85,84,84,84,84,84,83,83,83,82,82,82,81,81,81,81,80,80,80, 79,79,79,78,78,77,76,76,74,74,74,74,73,73,72,72,72,72,72,72,71, 71,71,70,69,68,68,68,67,66,66,66,65,65,65,64,63,62,62,62,61,61, 61,61,59,58,58,58,57,57,57,56,56,56,56,56,56,55,55,55,55,55,55, 54,53,53,50,48,48,46,46,46,46,46,45,45,45,45,45,45,43,43,43,42, 42,42,42,41,41,39,38,38,38,37,37,37,36,36,35,35,35,35,34,34,33, 33,32,32,32,32,31,30,30,30,29,29,29,29,27,25,25,25,25,25,25,25, 24,24,23,23,22,22,22,21,21,21,20,20 }; const int n3c2w2_s[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,98,98,97,97,97,96,96,96,96,95,95,95,94,94,94, 94,93,93,93,93,92,92,92,91,91,91,91,91,91,90,90,89,89,86,86,86, 85,85,85,85,84,83,82,82,82,81,80,80,79,79,79,78,78,78,78,77,77, 77,77,75,75,75,74,74,74,74,74,74,73,73,73,72,72,72,71,71,71,70, 68,68,68,67,67,67,67,67,66,66,66,66,65,64,64,64,63,63,62,62,62, 62,61,61,60,59,58,57,57,56,56,55,55,55,54,53,53,53,53,52,52,52, 51,50,50,49,48,47,47,47,47,46,46,45,45,45,45,45,44,44,44,42,41, 40,40,40,39,39,39,38,38,38,36,36,36,36,36,36,35,35,35,35,34,34, 34,34,33,33,33,32,32,31,31,30,30,30,29,28,28,27,27,27,26,25,24, 24,23,23,23,23,22,22,22,22,21,21,21,20 }; const int n3c2w2_t[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,98,97,97,97,97,96,96,96,95,95,95,94,94,94,94,93,93, 92,92,92,91,91,91,91,91,90,89,88,87,87,86,85,85,84,84,83,83,83, 82,82,81,81,80,80,80,80,80,80,79,79,79,79,79,79,78,77,77,76,76, 76,76,75,75,74,74,73,71,71,71,70,70,69,69,69,69,68,68,68,68,67, 67,67,67,67,67,67,67,66,65,64,63,63,63,62,61,61,61,61,61,61,60, 60,60,59,59,58,58,57,57,56,56,55,55,55,55,55,55,54,54,53,53,52, 51,51,50,49,49,48,48,47,46,46,46,46,45,45,44,43,43,43,43,43,42, 42,41,41,41,40,40,39,39,39,38,38,38,37,37,37,37,37,36,35,35,35, 35,35,34,34,33,33,32,32,31,31,31,31,31,31,31,31,30,30,30,29,28, 28,25,25,25,24,24,24,22,22,22,21,20 }; const int n3c2w4_a[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,98,98,97,97,97,96,96,96,95,94,94,93, 93,92,92,92,91,91,91,90,90,89,89,88,88,87,87,86,86,85,85,85,83, 83,83,83,82,82,81,80,80,80,80,79,79,79,78,78,78,77,77,77,77,77, 77,76,76,75,74,74,74,73,73,73,72,72,72,71,71,70,70,70,70,69,69, 69,69,69,68,68,68,67,67,67,66,66,66,66,65,64,64,64,64,64,64,64, 63,63,61,61,61,61,60,60,59,59,58,58,58,57,57,57,57,57,56,56,56, 55,55,55,55,54,54,53,53,53,53,53,52,51,51,51,50,50,49,49,49,48, 48,48,47,47,47,46,46,45,44,44,44,44,43,43,43,42,41,40,40,39,38, 38,38,38,38,38,38,38,37,37,37,36,36,36,36,35,35,35,34,33,33,33, 32,32,32,32,31,31,31,30,30,30,30,30,30 }; const int n3c2w4_b[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,98,98,98,98,98,98,97,97,97,97,96,96,95,95,95, 94,94,93,93,92,92,90,90,90,90,89,89,89,87,87,87,87,86,85,84,84, 84,84,83,83,83,82,82,82,81,81,81,81,81,80,79,79,78,78,78,77,77, 77,77,77,76,76,75,75,73,72,72,72,72,71,70,70,69,69,69,68,68,68, 68,66,66,65,64,64,64,64,63,63,63,63,62,62,62,62,61,61,61,60,60, 59,59,59,59,59,58,58,58,57,57,57,57,56,56,56,55,55,55,54,54,54, 54,53,53,53,52,52,52,52,52,51,51,51,51,51,51,50,50,50,50,48,48, 48,48,48,48,48,46,46,46,45,45,44,43,42,42,42,42,41,40,39,39,39, 39,39,39,38,38,37,37,37,36,36,35,35,35,35,34,34,34,34,34,33,33, 33,33,33,32,32,32,31,31,31,31,30,30,30 }; const int n3c2w4_c[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,99,98,98,97,97,97,97,97,97,97,97,96,96,96,96, 96,95,95,95,95,93,92,90,90,90,90,90,90,90,89,89,89,89,89,89,88, 88,88,88,88,88,87,87,86,86,84,83,83,82,82,82,82,81,81,81,81,80, 80,80,79,79,79,79,78,78,78,78,78,78,77,77,77,77,77,77,76,76,75, 74,73,73,73,73,73,73,73,73,72,72,72,72,71,71,71,70,70,69,69,69, 69,68,68,68,68,68,68,67,67,66,66,66,66,66,65,65,65,65,64,63,63, 62,61,60,60,60,59,59,58,58,58,57,57,56,56,55,55,55,55,55,55,54, 54,54,54,53,53,53,53,53,52,52,52,51,51,50,50,50,49,49,48,48,47, 47,47,46,46,45,45,45,44,44,44,41,40,40,40,40,39,38,37,37,37,36, 36,36,36,35,35,34,34,33,32,32,31,31,30 }; const int n3c2w4_d[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,98,98,98,98,98,98,97,97,97,96,96,96,96,95,95,95, 94,94,93,92,92,92,92,91,90,90,89,89,89,89,89,88,88,88,87,87,86, 85,85,85,84,83,82,81,81,81,81,81,80,79,78,78,77,77,77,75,75,75, 74,74,74,74,74,73,73,73,73,72,72,72,72,72,71,71,70,70,70,69,69, 68,68,68,67,67,67,67,66,66,66,66,66,66,65,65,63,63,63,63,62,62, 62,61,60,60,60,60,60,60,59,59,59,58,58,57,57,56,56,56,56,56,55, 55,55,54,54,54,53,53,53,52,52,52,51,51,50,50,50,50,49,49,49,48, 48,48,46,46,46,46,46,45,45,45,45,44,44,44,43,42,42,42,41,40,40, 40,39,39,39,39,39,38,38,37,37,37,37,36,36,36,35,35,35,34,34,34, 34,33,33,32,32,31,31,31,30,30,30,30 }; const int n3c2w4_e[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,99,98,98,98,98,97,97,96,95,95,94,94,94,94,93,93,93, 93,90,90,90,89,89,89,88,87,87,86,86,86,86,85,84,83,83,83,82,81, 81,81,80,80,80,80,79,79,79,78,78,77,77,77,77,77,77,76,76,76,76, 75,75,75,75,73,73,73,72,72,72,71,69,69,68,68,68,67,67,67,66,66, 66,66,66,66,66,66,65,65,64,63,63,62,62,62,62,61,61,61,60,60,60, 60,59,59,59,58,58,58,58,57,57,57,57,57,56,56,56,55,54,54,54,53, 53,52,51,51,50,50,50,50,49,49,49,49,49,49,48,48,48,48,48,47,47, 47,46,45,44,44,44,44,44,44,43,43,43,43,42,42,42,42,42,41,40,39, 38,38,37,37,37,37,37,37,37,37,36,36,36,36,36,35,35,35,35,34,34, 34,33,33,33,33,33,32,32,32,31,30,30 }; const int n3c2w4_f[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,98,98,97,97,97,96,96,95,95,95,95,94,94, 94,93,92,90,90,90,90,89,88,88,88,87,87,86,86,86,85,85,85,84,84, 83,83,82,82,81,81,81,80,80,79,79,79,78,78,78,78,77,77,77,76,76, 76,76,75,75,75,74,73,73,72,72,72,72,71,71,71,71,71,71,71,70,70, 69,68,68,68,67,67,67,67,66,66,66,66,66,65,64,64,64,64,64,64,63, 63,63,62,62,61,61,61,61,60,60,60,60,60,59,58,58,58,57,57,57,57, 56,55,54,54,54,54,54,53,52,52,51,51,51,50,50,50,50,49,48,48,47, 47,46,46,45,45,44,43,43,42,42,41,41,41,41,41,41,40,40,40,40,40, 40,39,39,39,39,38,38,37,37,37,36,36,36,36,36,36,35,35,35,35,33, 33,33,33,33,32,32,31,31,31,30,30,30 }; const int n3c2w4_g[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,99,99,98,98,98,98,97,97,96,96,96,95,95, 95,94,94,94,94,94,93,93,92,91,91,91,91,91,91,90,90,89,88,88,88, 87,87,87,86,86,85,85,85,84,84,83,83,83,83,83,82,82,82,82,82,81, 81,81,81,80,80,80,80,79,78,78,77,77,77,76,76,76,76,76,76,75,75, 74,74,73,73,73,73,72,72,70,70,69,69,68,68,68,68,68,68,68,67,67, 67,67,67,66,66,65,65,64,63,63,63,62,61,61,61,61,60,60,60,60,59, 58,58,58,58,57,56,56,53,53,53,53,53,53,52,52,52,52,51,51,50,50, 49,49,49,48,48,48,48,48,47,46,45,45,44,44,43,43,43,43,42,42,42, 42,41,41,41,41,40,40,39,39,38,37,37,36,36,36,36,36,35,35,35,35, 35,35,34,33,33,33,32,32,32,31,30,30 }; const int n3c2w4_h[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,98,98,98,97,97,97,97,95,95,94,94,94,94,93,93, 93,93,92,92,92,91,91,91,90,89,88,88,88,87,86,85,85,85,85,85,84, 83,83,82,82,81,81,80,79,78,78,78,78,77,77,76,76,76,75,75,75,74, 74,74,73,73,73,73,72,72,70,70,70,70,69,69,69,69,69,68,68,68,68, 67,67,67,67,67,67,66,66,66,66,66,66,65,65,65,64,63,63,63,62,62, 61,61,60,60,60,60,59,59,59,58,57,57,57,56,56,55,55,54,53,53,53, 53,53,52,52,52,51,51,51,51,50,50,50,49,49,49,49,48,48,48,48,47, 47,46,46,46,45,45,44,44,44,44,43,43,43,43,43,42,42,42,41,41,40, 40,40,39,39,39,39,39,39,39,38,38,37,36,36,36,36,35,35,35,34,33, 33,33,33,33,32,32,32,32,32,32,30,30 }; const int n3c2w4_i[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 99,98,98,98,98,98,96,96,95,95,95,94,93,92,92,92,91,91,91,90,89, 89,89,88,88,88,88,88,87,86,85,85,84,84,83,83,83,82,82,81,81,81, 80,80,80,80,79,79,78,78,78,78,77,77,77,77,77,76,76,75,75,75,74, 74,74,74,74,73,72,72,71,71,71,71,70,69,69,69,69,68,68,68,67,67, 67,67,67,67,66,66,66,66,65,65,65,65,64,64,64,63,63,63,63,63,63, 62,62,61,61,61,61,61,61,60,60,60,60,59,59,58,58,58,58,57,56,55, 55,54,54,53,53,53,52,52,52,52,52,52,52,52,52,51,51,51,50,50,50, 50,50,50,49,49,49,48,48,48,48,47,47,47,46,46,45,45,44,44,43,43, 43,43,43,42,42,41,41,40,39,39,38,38,37,37,37,36,36,35,35,35,34, 34,33,33,33,32,32,31,31,30,30,30 }; const int n3c2w4_j[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,98,97,97,96,96,96,95,95,94,94,93,93,91,91,91,91, 90,90,90,90,88,88,88,88,87,87,86,86,86,86,86,85,85,85,85,84,84, 83,83,83,82,82,82,82,82,82,82,81,81,80,80,80,80,79,79,78,78,77, 77,76,76,75,75,75,74,73,73,73,73,72,72,72,72,71,71,70,70,70,69, 69,69,69,69,68,68,68,67,67,67,66,66,65,65,65,65,65,65,65,65,65, 64,64,64,64,64,64,64,63,63,62,62,62,62,60,60,60,59,59,58,58,58, 58,58,57,56,56,56,56,56,55,55,54,54,53,53,53,53,52,52,52,52,52, 52,52,51,51,51,50,50,49,49,49,47,46,46,46,46,45,45,44,44,44,44, 44,44,43,43,42,41,41,41,38,38,38,37,35,35,35,35,34,33,33,33,33, 33,33,33,32,32,31,31,31,30,30,30,30 }; const int n3c2w4_k[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,98,98,98,98,98,97,97,97,96,96,95,94, 94,94,94,94,93,93,92,91,91,90,90,90,90,89,89,88,88,88,88,88,87, 87,87,86,85,85,85,85,85,85,85,83,83,82,82,82,82,81,81,81,80,80, 80,79,78,77,77,77,76,76,76,75,75,74,74,74,74,73,73,73,72,72,71, 71,71,71,69,69,69,68,68,67,67,66,66,66,65,65,64,64,64,64,64,64, 64,63,62,62,61,61,61,61,60,60,60,60,60,60,59,58,58,57,57,57,57, 56,56,55,55,54,54,53,53,53,53,53,52,52,52,52,52,52,50,49,48,48, 48,48,48,47,47,47,47,47,47,47,47,46,46,45,44,44,44,44,42,42,42, 42,42,41,41,41,40,40,39,38,38,37,37,37,37,37,37,36,35,35,35,35, 35,34,34,33,33,32,32,31,31,31,30,30,30 }; const int n3c2w4_l[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,99,99,99,98,97,97,97,97,95,95,95,94,94,94,93,93,93, 92,92,92,92,91,91,91,91,90,90,90,89,89,88,88,88,88,87,87,87,87, 86,85,85,85,84,84,84,83,83,83,82,82,81,81,80,80,80,80,80,79,79, 78,78,78,78,78,77,77,77,77,77,76,76,76,76,75,75,74,74,74,73,73, 72,72,71,71,71,70,70,70,69,68,68,68,68,67,66,66,65,65,65,65,65, 64,63,62,62,61,61,61,61,61,60,60,60,58,58,58,58,57,56,56,56,56, 56,56,55,55,55,55,55,54,53,52,52,52,51,51,51,51,49,49,47,47,46, 45,45,45,45,45,45,44,44,44,44,43,42,41,41,41,40,40,39,39,39,39, 38,38,38,37,37,36,36,36,36,36,36,36,35,35,35,35,34,34,34,34,34, 33,33,33,33,33,32,32,32,31,31,30,30 }; const int n3c2w4_m[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,99,99,99,98,98,98,98,97,97,97,97,97,96, 96,96,95,95,95,95,95,95,94,93,92,92,92,92,92,91,91,90,90,90,89, 88,88,86,86,86,85,85,85,84,83,82,82,82,82,81,81,81,80,80,80,80, 80,79,79,79,79,78,78,78,78,77,76,76,75,74,73,73,73,72,72,72,71, 71,70,70,69,69,69,68,68,68,68,68,67,67,67,66,66,65,64,64,64,64, 64,63,63,63,63,62,62,62,62,62,62,61,61,61,61,60,59,59,58,58,57, 57,55,54,54,53,53,53,53,53,53,53,53,53,53,52,52,51,51,50,50,50, 49,48,46,46,45,45,45,45,44,43,42,41,41,41,40,40,40,40,39,39,38, 38,38,38,38,37,37,37,36,36,35,35,35,35,35,34,34,34,34,33,33,33, 32,32,32,32,32,32,32,31,30,30,30,30 }; const int n3c2w4_n[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,98,98,98,98,97,97,97,96,96, 95,95,95,94,93,93,92,92,92,91,90,90,89,88,88,88,88,88,88,87,87, 87,87,86,85,85,85,85,85,84,84,82,82,82,81,81,81,80,80,80,80,80, 80,80,78,78,78,78,78,77,77,77,75,75,75,74,74,73,72,71,71,71,70, 70,70,70,69,69,69,69,68,68,67,67,65,65,65,64,64,64,64,64,63,63, 63,62,62,61,61,60,60,59,59,59,58,58,57,57,56,56,56,56,56,55,55, 55,55,54,54,54,53,53,53,53,52,52,51,51,51,50,50,50,50,49,49,49, 48,47,47,47,46,46,46,46,45,45,45,44,44,44,44,44,44,44,43,43,41, 41,40,40,39,39,39,38,38,37,37,36,36,36,36,36,36,35,35,34,33,33, 33,32,32,32,32,32,32,31,31,30,30,30,30 }; const int n3c2w4_o[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,97,97,97,96,96,96,95,95,95,94,93, 93,93,93,93,93,92,92,92,90,90,90,90,90,90,89,89,89,88,88,88,88, 87,87,86,86,85,84,83,83,83,82,82,82,82,81,81,80,80,80,80,79,79, 78,78,78,77,77,77,77,77,76,75,75,74,74,73,72,71,70,69,69,68,67, 67,67,67,67,66,66,66,65,65,65,65,64,64,64,63,63,61,61,61,61,60, 60,59,59,59,59,58,57,57,57,57,56,56,55,55,55,55,54,54,54,54,53, 53,53,52,52,52,51,51,51,51,51,50,50,50,50,50,49,49,49,48,48,47, 47,47,47,47,45,45,44,44,44,43,43,42,42,42,41,41,41,41,40,40,40, 39,39,39,38,38,37,37,37,36,36,36,36,35,34,34,34,34,34,33,33,33, 33,32,32,31,31,31,31,31,31,30,30,30,30 }; const int n3c2w4_p[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,99,99,98,98,98,97,97,96,96,94,94,93,93, 93,93,92,92,91,91,91,90,90,90,90,90,89,89,89,89,89,88,88,88,87, 87,87,86,86,86,86,85,84,84,83,83,83,83,83,82,82,82,82,81,81,81, 81,81,80,80,79,79,79,79,79,78,78,78,78,78,77,77,76,76,75,75,75, 74,74,74,74,72,72,72,71,71,71,70,70,70,70,69,68,67,67,67,67,67, 66,66,66,66,65,65,64,63,63,62,61,60,60,60,60,59,59,59,59,58,58, 58,58,57,56,56,56,55,55,55,54,54,53,53,52,52,52,52,52,51,51,51, 51,50,49,49,49,48,47,46,46,46,45,44,44,43,42,42,41,40,40,40,40, 40,39,39,39,39,38,38,38,38,37,37,37,37,37,37,36,36,35,35,35,35, 34,33,33,33,32,31,31,30,30,30,30,30 }; const int n3c2w4_q[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,98,98,98,98,98,97,97,97,97,97,97,97,96,96,96, 96,95,94,93,93,93,93,92,92,92,92,91,90,90,89,89,89,88,87,86,86, 86,86,85,85,85,84,84,84,83,83,82,82,81,81,81,80,80,80,79,79,79, 79,78,78,78,78,77,77,77,77,76,76,76,75,75,75,74,74,74,74,73,72, 72,72,72,72,72,71,70,70,70,69,69,69,68,68,68,67,66,66,65,65,65, 64,64,64,64,64,63,63,63,63,62,62,61,60,60,59,59,59,58,58,57,57, 57,56,56,55,55,55,55,55,54,54,54,54,53,53,53,52,51,51,51,50,50, 50,49,48,48,48,47,47,47,47,46,46,46,46,45,44,44,44,43,43,43,42, 42,42,41,41,41,40,40,40,39,39,39,39,38,38,38,37,36,36,36,36,35, 35,34,34,33,32,32,32,32,32,32,31,31,30 }; const int n3c2w4_r[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,98,98,98,98,97,97,96,96,96,95,95, 94,94,94,93,93,93,93,92,92,91,91,91,90,90,89,89,88,88,88,88,88, 87,87,87,87,86,86,85,85,84,84,84,84,83,82,82,81,81,81,81,81,80, 80,79,79,79,78,78,78,78,78,78,77,77,77,77,77,76,75,75,74,74,73, 73,72,72,72,72,71,71,70,70,70,70,70,69,68,68,68,68,68,68,67,67, 66,66,65,65,65,65,65,65,64,64,63,62,62,61,60,60,60,60,59,59,58, 58,58,57,56,56,56,55,55,55,54,54,54,54,54,54,53,53,53,53,53,53, 52,52,52,51,50,50,49,49,49,48,48,47,47,47,46,46,46,46,45,45,44, 44,43,43,43,42,42,42,42,42,42,41,40,39,38,38,38,38,38,38,37,37, 37,36,36,35,34,34,33,32,32,32,31,30,30 }; const int n3c2w4_s[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,99,98,98,97,96,96,96,96,95,95,95,94,94,94,93,93,93, 93,93,93,93,93,92,92,92,91,91,90,90,89,89,89,88,88,88,88,88,87, 87,86,86,86,86,86,86,86,85,84,84,83,83,83,81,81,81,81,80,80,79, 79,79,79,78,78,78,78,77,77,77,77,76,76,76,75,75,74,74,73,73,72, 72,71,71,70,70,70,70,69,69,69,68,68,68,68,68,67,67,67,66,66,66, 66,65,65,65,64,63,63,62,61,61,59,58,58,57,57,57,56,56,56,55,55, 55,54,52,51,51,50,50,50,50,50,50,49,49,49,49,49,49,48,48,48,47, 47,47,46,46,46,46,46,45,45,44,43,43,43,42,42,42,41,41,41,41,40, 40,40,40,40,39,39,38,37,37,37,37,37,37,36,36,36,36,36,35,35,35, 34,34,33,32,32,32,31,31,30,30,30,30 }; const int n3c2w4_t[] = { 120, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,98,98,98,97,97,97,96,96,96,96,96,95,95,95,95, 94,94,94,92,92,92,91,91,91,91,90,90,90,90,90,89,89,88,88,87,87, 87,87,86,86,86,86,86,85,85,85,84,83,82,82,81,81,81,81,81,81,81, 80,80,80,80,78,78,78,78,78,77,77,77,76,75,75,75,75,73,73,73,72, 71,71,71,71,70,70,69,69,69,68,67,67,67,66,66,66,65,65,65,64,63, 63,63,62,62,62,62,61,61,61,61,61,60,60,60,59,59,59,59,58,58,57, 56,56,56,56,56,55,55,54,54,53,53,53,52,52,52,51,51,50,50,50,49, 49,48,48,48,48,46,46,46,46,45,45,44,44,44,43,43,43,43,43,43,42, 41,41,41,41,40,39,39,38,37,36,36,36,36,35,35,35,34,34,34,34,33, 33,32,32,32,32,31,31,30,30,30,30,30 }; const int n3c3w1_a[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,99,98,98,98,97,96,96,96,95,95,95,94,93,92,91, 91,91,90,90,90,89,87,87,86,86,86,84,84,83,83,82,82,82,80,80,80, 79,78,77,77,77,77,77,75,74,73,73,73,73,72,71,71,71,70,69,68,68, 68,68,67,65,65,65,65,65,65,64,63,63,62,62,62,61,60,59,58,58,57, 57,54,54,53,53,52,52,52,52,51,51,50,50,49,49,49,48,48,47,46,45, 44,44,44,43,42,42,41,40,39,39,39,39,39,38,37,37,37,37,37,37,37, 37,36,36,35,35,35,35,34,34,33,33,32,32,31,31,29,29,29,28,27,26, 26,25,25,24,23,21,21,21,20,20,18,18,17,17,17,16,16,16,16,15,15, 14,13,13,13,13,13,13,13,12,11,9,8,8,7,6,6,6,5,5,5,5,4,4,4,4,4, 3,3,2,2,2,1,1 }; const int n3c3w1_b[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,98,98,98,98,98,98,98,96,95,91,91,90,90,90,90,90,89, 88,88,87,87,87,85,85,85,84,84,83,83,82,81,81,81,81,80,80,80,80, 80,79,79,79,79,78,77,77,76,75,74,74,73,73,73,73,73,72,71,71,71, 70,70,70,69,69,69,69,69,68,68,68,67,67,66,65,65,64,64,64,63,63, 63,62,61,61,61,61,61,59,59,59,58,58,58,58,57,56,56,56,55,55,55, 55,54,54,53,53,52,52,51,51,50,50,50,50,49,49,48,48,48,46,46,46, 46,43,42,42,42,40,39,39,39,39,39,38,36,36,36,35,35,34,34,33,32, 31,31,29,27,26,26,26,25,25,24,24,24,23,22,22,21,21,20,20,19,19, 18,18,17,17,17,17,17,15,15,14,14,14,13,13,12,12,12,12,12,10,10, 10,10,10,10,10,9,8,5,4,4,4,1 }; const int n3c3w1_c[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,99,99,98,98,97,96,96,95,95,94,94,94,93,91,90, 90,89,89,89,89,88,88,88,88,88,88,87,85,85,84,84,84,83,83,82,82, 81,80,80,78,78,78,78,78,78,78,77,77,77,76,76,76,75,75,74,74,74, 74,74,73,73,72,70,67,67,67,66,66,66,66,66,65,65,65,63,63,63,62, 62,61,61,61,61,61,60,60,59,58,57,56,54,54,54,53,52,52,51,50,50, 49,48,48,48,47,47,47,47,46,46,46,45,45,45,42,42,39,39,39,38,38, 37,37,37,36,36,35,34,34,34,33,33,31,31,31,31,31,29,28,28,27,27, 26,26,26,26,26,26,25,25,25,24,23,22,22,22,21,21,21,21,20,20,19, 16,16,16,15,15,15,14,14,13,13,12,12,12,11,10,10,10,9,9,9,8,7, 7,6,6,6,5,5,5,3,3,3,2,1 }; const int n3c3w1_d[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,98,97,97,96,96,96,95,95,95,94,94,93, 92,92,92,91,91,90,89,87,87,86,86,86,86,86,85,84,84,83,83,81,80, 80,79,78,78,77,76,76,76,73,72,72,71,70,70,67,67,67,66,66,65,63, 63,62,62,61,60,60,59,58,57,56,56,56,55,55,55,55,54,54,54,53,53, 53,52,52,51,51,50,50,50,49,48,48,47,46,46,44,44,44,44,44,43,41, 41,40,40,40,39,39,39,39,36,36,36,36,36,35,35,35,35,33,33,33,32, 32,32,32,31,30,30,29,29,29,29,28,28,26,26,26,25,25,25,25,25,24, 23,23,22,22,22,22,21,21,21,21,21,20,20,20,20,20,19,18,17,17,17, 17,15,15,15,14,13,13,12,12,12,12,11,10,10,9,9,9,8,8,8,7,7,6,6, 5,4,4,4,3,3,3,2,1,1 }; const int n3c3w1_e[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,99,98,98,98,98,97,97,97,97,95,95,94,94,93,93, 92,92,91,91,90,90,90,90,89,89,89,89,88,88,87,86,85,84,84,84,84, 83,83,82,82,82,82,81,80,79,78,78,77,76,76,75,74,74,74,73,72,71, 71,70,70,70,70,70,70,69,69,68,68,68,67,66,65,64,64,63,63,62,62, 61,60,59,57,57,57,56,55,55,55,55,54,54,53,53,52,52,52,52,50,48, 48,48,47,47,46,46,45,45,44,44,43,43,43,42,42,42,42,41,41,40,40, 39,39,36,35,34,33,32,32,31,30,29,29,28,28,27,27,24,24,24,24,23, 23,23,23,23,23,21,21,20,20,19,19,18,17,17,17,16,16,15,15,15,15, 14,14,13,13,13,12,12,12,12,11,11,11,10,10,9,9,8,8,8,8,7,7,7,6, 5,4,4,3,3,1,1,1,1 }; const int n3c3w1_f[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,98,98,98,98,96,96,95,95,93,92,92,92,91,89,89, 88,88,88,87,87,87,87,86,86,86,85,85,84,83,83,82,80,80,80,79,79, 78,78,77,76,76,75,75,74,74,73,73,73,72,71,70,70,70,69,69,69,69, 68,68,66,66,66,66,65,64,64,64,64,64,64,63,63,63,62,62,61,60,60, 59,58,58,58,58,58,58,57,57,55,55,55,53,52,52,52,51,51,50,50,50, 49,49,49,49,49,48,48,46,46,45,45,45,44,43,42,42,42,41,41,40,40, 40,39,39,39,37,37,37,36,36,36,36,35,35,35,33,33,33,33,32,32,31, 31,31,31,30,29,29,29,29,28,27,27,27,26,26,24,22,22,22,21,21,20, 19,18,17,17,16,16,15,14,14,13,12,11,11,11,11,10,9,8,7,7,7,7,7, 6,6,5,4,4,4,3,3,2,1 }; const int n3c3w1_g[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,97,97,97,96,96,96,96,95,95,95,95,95,94,94,92,92,91,91, 90,89,87,86,86,86,86,85,84,84,84,84,83,83,81,81,81,80,78,77,77, 76,75,75,74,74,73,73,73,72,71,71,71,70,70,69,68,66,65,65,64,64, 64,64,63,63,63,62,61,61,61,60,60,60,60,59,58,58,58,58,58,58,57, 57,55,55,55,54,54,53,52,52,51,51,51,51,51,51,50,49,49,49,48,47, 46,46,45,45,44,44,44,43,43,43,41,41,40,40,40,39,37,36,36,35,35, 35,35,34,34,34,33,32,31,31,30,30,30,29,29,28,28,27,27,27,27,25, 25,24,23,22,22,21,21,21,21,21,21,21,20,19,18,17,17,16,16,15,15, 14,14,13,13,13,13,13,12,11,10,9,9,8,8,6,6,5,5,5,5,4,4,4,3,3,3, 2,2,2,1,1,1,1 }; const int n3c3w1_h[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,98,98,97,96,96,96,96,96,96,95,94,94,94,93,92,91, 91,90,89,89,89,88,87,86,86,86,86,85,85,85,84,84,84,84,84,84,83, 82,82,81,80,78,78,77,77,77,77,77,76,76,75,75,74,74,74,74,70,70, 70,69,69,69,68,68,68,68,67,66,66,66,65,65,65,64,64,64,64,64,63, 63,62,62,60,58,57,56,56,56,56,56,56,55,55,55,55,55,53,53,51,51, 51,50,50,49,47,47,47,44,43,43,43,42,42,40,40,38,38,38,37,37,37, 36,36,35,34,34,34,33,33,33,33,32,32,30,30,29,28,28,27,27,26,26, 26,25,25,25,25,25,24,24,23,23,22,22,21,21,21,19,19,19,18,17,17, 16,16,15,14,14,14,13,13,13,13,12,11,11,10,10,9,9,9,8,8,8,7,7, 7,6,4,4,4,4,3,2,1,1 }; const int n3c3w1_i[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,98,97,96,94,93,93,93,92,92,91,90, 89,89,88,88,88,88,88,88,88,86,86,86,86,86,85,85,84,84,84,83,83, 83,83,83,83,82,82,81,79,79,76,76,76,76,75,75,75,75,75,75,74,74, 73,72,71,71,71,68,68,67,67,67,66,66,66,65,65,64,64,63,63,63,62, 62,62,61,60,60,60,58,58,57,57,56,56,55,55,55,54,54,54,54,53,51, 50,50,49,48,48,47,47,47,46,46,45,45,44,43,43,41,40,40,39,39,39, 37,37,37,36,34,33,32,31,31,31,31,30,30,29,29,29,29,29,28,27,24, 24,23,23,23,23,23,22,22,21,21,20,19,19,18,18,17,17,17,17,16,16, 16,15,15,15,15,15,14,14,14,13,12,12,12,12,11,11,11,10,8,8,7,6, 6,5,5,5,5,5,4,4,4,3,2,1 }; const int n3c3w1_j[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 99,99,99,98,98,98,96,95,95,94,94,94,93,93,92,92,92,91,91,90,88, 86,86,85,85,84,84,84,83,82,82,82,81,81,81,80,80,79,79,79,78,78, 78,77,77,77,76,74,74,73,73,72,71,71,71,71,70,70,68,68,68,67,66, 66,66,66,66,65,64,63,63,63,62,61,60,60,59,58,58,58,57,57,57,57, 56,55,54,53,53,51,51,51,51,50,50,50,49,47,47,47,46,46,45,45,45, 45,45,44,43,43,42,42,41,41,40,40,39,39,37,37,36,36,35,35,34,34, 34,34,34,33,32,32,32,31,31,29,28,27,27,26,26,26,25,25,25,25,25, 25,25,25,22,22,22,21,21,21,21,21,21,19,19,19,18,17,17,17,17,17, 17,16,16,15,14,14,14,13,13,12,11,10,10,10,10,9,8,7,6,5,4,4,4, 4,3,3,3,3,3,3,2,2 }; const int n3c3w1_k[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,99,99,98,98,98,97,96,95,94,93,93,93,92,91,91,91,91, 91,90,90,88,88,88,87,87,87,86,86,85,85,84,84,84,83,83,82,81,81, 81,81,77,77,76,76,75,74,74,74,73,73,72,72,71,71,70,69,69,69,69, 68,68,66,66,65,64,63,63,63,62,61,61,59,59,59,58,58,57,57,57,57, 55,55,53,53,52,52,49,49,49,48,48,47,47,46,46,46,46,45,45,44,43, 43,43,41,40,40,40,39,39,38,38,38,37,37,35,35,35,34,34,33,33,32, 31,31,29,29,28,28,27,26,25,25,24,24,24,23,23,23,23,23,23,22,22, 22,21,20,19,19,19,18,18,18,18,18,17,15,15,14,13,13,13,12,11,10, 9,9,8,8,8,8,8,8,7,7,6,6,6,5,5,5,5,4,4,4,4,4,4,4,4,4,3,3,2,1,1, 1,1 }; const int n3c3w1_l[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,97,97,96,95,95,95,94,92,91,91,91,91,90,90,89,89, 89,88,88,87,87,87,86,86,86,85,85,85,85,85,84,84,83,83,81,81,81, 80,80,80,79,79,79,78,78,77,77,77,77,76,75,74,74,74,72,72,71,71, 70,69,68,68,67,65,64,64,63,63,63,62,62,62,62,61,61,60,60,60,60, 60,60,59,59,59,59,58,58,57,56,55,55,55,55,54,53,53,52,52,52,51, 51,51,51,50,50,49,49,48,45,45,43,42,42,41,40,40,39,39,38,38,37, 36,36,35,35,34,34,34,33,33,32,31,31,31,31,30,29,29,29,29,29,28, 28,28,27,26,26,25,25,24,24,24,22,22,21,20,19,19,19,19,18,18,18, 15,15,15,14,14,13,13,12,12,11,10,10,9,9,8,8,8,7,7,7,6,6,6,5,5, 5,4,3,3,2,1,1,1 }; const int n3c3w1_m[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,99,98,97,97,96,96,95,94,93,93,93,92,92,92,92,92,92, 91,91,91,91,90,90,89,89,89,89,86,86,86,85,85,84,83,83,83,82,82, 82,81,81,80,80,80,79,78,77,77,77,77,76,76,76,76,75,75,73,72,72, 71,70,70,70,70,68,68,68,68,68,67,65,65,64,64,62,62,61,60,60,59, 59,59,59,59,58,58,57,57,56,56,56,56,55,54,53,53,53,53,52,52,52, 51,51,51,50,50,50,50,49,49,49,49,49,49,48,48,48,47,46,46,46,45, 44,43,42,42,42,41,39,37,37,36,36,35,35,35,34,34,33,33,32,32,31, 31,31,30,29,29,29,29,28,28,27,26,25,25,25,25,24,23,23,23,23,23, 22,22,22,21,18,18,18,17,16,16,16,15,14,14,13,13,12,11,11,11,11, 9,8,8,5,4,4,3,2,2,2,1,1 }; const int n3c3w1_n[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,98,98,97,97,96,95,95,95,95,94,94,93,92,92,92,92,91, 90,88,87,87,87,87,87,87,87,86,86,85,85,84,84,84,82,82,82,82,81, 81,81,81,80,80,80,80,79,79,78,78,77,76,75,75,75,75,73,72,72,71, 71,71,70,70,70,69,69,68,67,66,66,66,65,64,63,62,62,62,61,61,61, 60,59,59,57,57,56,56,55,55,53,53,52,51,51,51,51,50,50,49,49,49, 49,48,47,47,47,47,47,47,47,46,46,46,45,45,45,45,45,43,43,43,43, 42,41,40,38,38,38,38,36,36,36,35,35,34,34,33,33,32,32,31,30,30, 28,28,28,27,27,27,26,26,25,25,22,21,20,19,19,18,17,17,17,17,16, 14,14,14,13,13,13,12,12,11,11,11,10,10,9,8,7,6,6,4,4,4,4,4,4, 3,3,3,3,3,1,1,1,1 }; const int n3c3w1_o[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,98,98,97,97,96,96,96,95,95,94,92,92,91,91,91,91,91, 91,90,90,90,89,89,88,88,87,87,86,85,82,81,81,81,81,80,80,80,80, 79,79,78,78,78,78,77,77,77,77,76,75,74,74,74,74,74,73,73,73,73, 73,71,70,70,70,69,69,69,69,68,68,67,66,64,64,64,63,61,59,58,58, 57,57,55,54,54,52,52,52,52,52,51,50,50,48,48,47,47,47,46,45,45, 45,44,43,43,43,42,41,40,40,39,39,38,38,38,38,36,36,34,34,34,33, 33,32,32,32,32,31,31,31,30,30,30,28,28,26,26,26,26,26,26,25,25, 25,25,24,24,23,23,23,20,20,20,20,20,18,17,16,16,16,16,15,15,14, 13,13,12,12,12,11,11,11,10,10,10,9,9,8,8,6,5,5,4,4,4,4,4,3,3, 3,2,2,2,1,1,1,1 }; const int n3c3w1_p[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,98,98,97,97,96,96,96,95,95,94,94,94, 94,93,92,91,91,90,90,90,90,90,90,89,89,88,87,85,85,85,83,83,83, 82,82,82,81,81,81,80,80,79,79,79,78,78,77,77,77,76,76,76,75,75, 75,73,73,72,72,72,71,71,70,70,70,69,68,67,67,67,67,67,66,66,65, 65,64,64,64,63,62,62,61,61,61,61,60,60,60,58,58,58,56,55,54,54, 53,53,53,53,51,51,49,49,49,48,48,48,47,46,46,45,44,44,42,42,42, 42,42,41,41,41,41,41,40,40,39,38,38,37,36,36,34,34,34,34,33,32, 32,32,31,31,31,29,29,28,27,26,26,25,25,24,23,22,21,21,21,21,20, 19,19,18,17,17,16,16,15,15,14,13,13,13,12,11,11,11,10,10,9,9, 8,8,8,7,7,6,5,5,4,3,3,2,1 }; const int n3c3w1_q[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,98,98,97,97,97,97,97,96,96,96,96,94,94,94,93,93,92,91,91, 90,90,90,89,89,89,88,87,87,86,86,85,85,83,83,83,83,82,82,82,81, 80,79,79,78,78,78,78,77,77,77,77,77,77,76,75,74,74,73,72,72,72, 71,70,70,69,69,69,67,67,66,66,66,66,66,66,66,66,64,63,62,62,62, 61,61,61,60,60,60,59,59,59,58,58,57,56,56,56,55,54,54,54,54,54, 54,54,53,53,53,53,53,51,51,51,50,50,50,50,49,49,48,47,46,46,45, 45,45,44,44,44,43,43,42,41,41,40,40,40,39,39,39,38,38,37,37,37, 36,36,36,36,36,34,34,34,34,33,30,29,29,28,28,27,27,27,25,25,25, 25,24,24,23,22,22,22,22,19,18,18,16,16,15,14,13,13,13,11,11,10, 10,8,7,5,5,5,4,4,2,1,1,1 }; const int n3c3w1_r[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,99,99,98,97,97,97,96,96,96,94,94,94,94,93,92, 91,91,91,90,90,90,89,88,88,87,87,86,86,86,86,86,85,84,82,81,81, 78,78,78,77,77,77,76,76,74,74,74,73,72,72,71,70,69,69,69,68,68, 68,68,68,67,66,66,66,65,64,64,64,64,63,61,60,60,59,58,57,57,55, 55,55,54,54,52,52,52,51,51,50,49,48,48,47,47,47,46,46,46,46,43, 43,43,43,43,42,42,42,41,41,41,40,40,40,40,40,39,39,39,39,38,38, 38,37,37,37,37,36,36,35,34,33,33,32,31,31,31,31,30,29,29,29,28, 28,28,25,25,23,23,22,22,22,20,20,20,19,19,19,17,17,16,16,16,15, 14,13,13,12,12,11,10,10,9,9,9,9,8,8,8,8,8,7,7,6,6,6,6,5,5,5,4, 4,3,2,2,1,1 }; const int n3c3w1_s[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 99,99,97,96,96,95,95,95,95,94,94,94,93,93,93,93,93,92,92,91,91, 90,90,90,89,89,89,87,86,86,86,86,85,84,84,84,84,83,83,83,78,78, 75,75,75,75,74,74,71,71,70,70,70,70,69,69,69,69,69,69,68,67,67, 67,67,67,65,65,65,64,64,63,62,62,62,61,61,60,59,59,59,59,58,57, 57,57,57,56,56,56,55,55,54,54,54,54,54,54,54,53,53,51,50,49,49, 49,49,49,48,47,47,47,44,43,42,41,40,40,40,40,39,39,38,38,38,38, 38,37,37,36,36,35,35,33,33,33,33,32,32,32,31,31,30,30,30,30,29, 29,28,28,28,28,27,27,27,27,26,26,25,25,25,24,24,24,24,23,23,22, 20,17,17,17,17,16,16,16,14,13,12,12,11,11,10,9,9,8,7,7,6,6,6, 5,4,4,2,2,2,2,1,1 }; const int n3c3w1_t[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,99,98,98,98,98,98,98,97,97,97,96,95,94,94,94,94,94,92,91, 91,91,90,89,88,88,88,87,87,86,86,86,86,85,85,85,84,84,83,83,83, 82,82,80,80,80,80,80,79,79,78,77,77,76,75,74,74,73,73,72,71,71, 70,69,69,69,68,68,67,67,67,67,66,66,66,65,63,63,63,62,61,61,61, 61,61,60,59,59,58,57,57,56,56,56,56,55,55,53,53,52,52,50,50,49, 49,47,47,47,46,46,46,46,45,44,44,43,42,42,42,41,41,41,41,40,40, 40,39,39,37,37,37,37,37,36,36,35,35,35,35,34,33,33,33,32,32,31, 31,30,30,29,27,25,25,23,23,22,22,22,21,21,20,20,19,19,19,19,19, 18,18,18,17,17,16,16,14,14,14,13,12,12,11,10,10,9,9,8,7,7,6,5, 5,5,4,4,4,2,2,2,1,1 }; const int n3c3w2_a[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,98,98,98,97,97,97,97,97,97,96,96,96, 95,94,94,93,93,93,93,93,92,92,91,91,90,89,89,88,88,88,87,87,87, 86,86,86,85,85,85,84,84,84,83,82,81,81,80,80,79,79,79,79,79,78, 76,76,76,76,75,75,75,75,75,75,74,73,73,73,73,72,72,72,72,72,71, 71,70,70,70,70,69,68,68,68,67,67,65,65,65,64,64,64,64,63,63,63, 63,62,62,62,62,61,60,60,59,59,59,58,58,58,58,56,56,56,56,56,56, 56,56,55,53,52,52,51,51,50,50,50,49,49,49,48,48,47,47,46,46,45, 45,44,44,44,43,43,43,42,42,42,41,41,40,40,39,37,37,37,37,36,36, 35,35,35,34,34,31,30,29,29,29,29,29,28,28,28,28,27,27,26,26,25, 25,25,24,24,23,22,21,21,21,21,21,20,20 }; const int n3c3w2_b[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,98,98,97,97,95,95,95,94,93,92,92, 91,91,90,90,89,89,89,89,89,89,88,87,87,86,86,86,86,85,84,83,83, 82,82,82,81,81,81,81,81,80,80,80,79,79,79,78,77,77,76,76,75,74, 74,73,73,73,73,73,72,72,70,70,70,70,70,69,68,68,68,68,68,67,66, 66,66,66,66,66,65,65,65,65,65,64,64,64,64,63,63,62,62,61,59,59, 59,59,58,58,56,56,56,56,56,55,55,55,55,54,54,54,54,54,54,53,53, 53,53,53,52,51,51,51,50,49,49,49,49,48,48,48,47,47,47,46,46,46, 46,46,45,45,44,44,44,42,42,42,41,39,38,38,38,37,37,36,36,36,36, 35,34,34,33,33,32,32,32,31,31,31,30,30,29,29,29,29,28,28,27,26, 25,23,23,23,22,22,22,22,22,21,21,21,21 }; const int n3c3w2_c[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,98,98,97,96,96,96,96,96,96,95,95,94,94,94,94,93, 93,93,93,93,93,92,92,92,90,89,89,89,89,87,87,86,86,86,86,85,85, 84,84,84,84,83,83,83,83,83,81,81,81,80,80,79,79,79,79,78,78,77, 77,77,76,76,76,74,74,74,74,73,73,73,73,73,72,70,70,69,69,69,69, 68,67,66,66,66,66,65,65,65,64,64,63,62,62,61,61,60,60,60,58,58, 57,57,57,57,56,56,55,55,55,55,55,54,54,54,54,54,53,53,53,53,52, 51,51,51,50,50,50,50,50,49,49,48,48,46,46,45,44,44,44,43,43,43, 40,40,40,40,40,39,39,38,38,37,37,37,37,37,36,35,35,34,34,33,33, 33,33,32,32,32,32,31,31,30,29,29,29,29,29,28,28,27,27,27,27,26, 26,26,25,24,23,22,22,22,21,21,21,20 }; const int n3c3w2_d[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,98,98,98,96,95,95,94,94,94,93,93,92,92,89,89,89,89, 88,88,88,88,87,87,87,87,86,86,86,85,84,84,83,83,83,83,83,82,81, 80,80,80,79,79,79,78,78,77,77,77,77,77,77,75,74,74,74,73,73,72, 72,71,71,71,71,71,71,70,69,68,68,67,66,66,66,65,65,65,65,65,64, 64,64,64,62,62,62,62,61,61,61,60,60,60,59,59,59,59,58,58,58,58, 57,57,57,57,56,56,56,55,54,54,54,54,54,53,53,53,53,52,51,50,50, 50,49,48,48,48,48,48,48,47,47,45,45,45,44,44,43,43,43,43,43,42, 42,41,41,41,40,40,40,40,40,39,39,38,38,38,37,37,36,36,36,35,35, 34,34,33,33,32,32,31,31,31,30,29,29,28,27,26,25,25,25,24,24,24, 24,24,23,22,22,22,21,21,21,20,20,20 }; const int n3c3w2_e[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,99,97,97,96,96,96,95,95,95,95,94,94,93,93,93,93,92,92,91, 90,90,90,90,90,90,90,90,89,89,88,88,88,87,86,86,86,84,84,84,84, 83,83,81,81,80,80,80,78,78,78,77,77,77,76,75,75,75,74,73,73,73, 72,71,71,71,70,70,70,69,69,69,68,67,67,67,66,66,65,64,64,63,63, 63,62,62,62,62,62,62,61,61,61,60,60,60,59,59,59,58,58,58,58,57, 57,57,56,55,55,55,55,53,53,53,52,51,51,51,51,50,50,50,49,49,49, 49,48,47,46,46,45,45,45,44,44,44,44,43,43,43,43,43,42,41,41,41, 40,40,40,40,40,39,39,39,39,39,38,37,37,36,36,35,34,34,34,34,33, 33,32,32,32,31,31,31,31,30,30,30,29,28,27,27,26,25,25,25,24,24, 24,23,23,23,22,22,22,22,21,21,21,20 }; const int n3c3w2_f[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,99,99,98,98,97,97,97,96,95,95,95,95,95,94,94, 94,94,93,93,93,93,92,90,89,89,89,89,88,88,88,87,87,87,86,85,85, 85,84,84,84,83,83,82,82,82,82,82,81,81,80,80,80,79,79,79,79,78, 78,78,76,75,75,74,74,74,73,72,72,72,72,72,72,71,70,70,70,69,68, 68,68,66,65,65,64,64,64,62,61,61,60,59,59,58,58,57,57,57,56,56, 55,55,55,55,54,54,54,53,53,52,52,52,52,51,51,51,50,50,50,50,50, 49,49,48,48,47,47,46,46,46,46,45,45,44,44,44,44,44,44,44,43,43, 43,43,43,43,43,42,42,42,41,41,41,41,40,40,39,39,38,38,38,37,37, 36,36,35,35,35,35,34,34,34,33,31,31,31,30,30,30,30,30,29,28,27, 26,26,25,25,24,24,22,22,21,20,20,20,20 }; const int n3c3w2_g[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,98,98,98,97,97,96,96,95,94,93,93, 93,92,91,90,90,90,89,89,88,88,88,88,88,87,87,87,87,86,86,85,85, 85,84,84,84,84,84,83,83,83,82,81,81,80,80,79,78,77,77,77,77,76, 76,75,75,75,75,74,74,74,73,73,73,73,72,71,70,70,70,70,69,68,68, 68,68,68,67,67,67,67,66,66,65,65,65,64,63,63,63,63,63,63,62,62, 62,60,60,59,59,59,58,57,56,55,55,54,53,53,52,51,50,50,50,50,49, 48,48,48,48,48,47,47,47,47,46,46,45,44,44,43,43,43,43,43,43,42, 42,41,41,39,39,38,38,37,37,37,36,36,36,35,34,34,34,34,33,33,32, 31,31,31,31,30,30,30,30,30,29,28,27,27,26,26,26,25,25,25,25,25, 25,24,24,24,23,23,22,21,21,21,20,20,20 }; const int n3c3w2_h[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,98,98,97,97,97,96,94,94,94, 94,94,94,94,93,93,91,91,91,90,89,89,89,88,88,87,87,87,86,86,86, 86,86,86,86,85,85,85,85,84,84,83,83,82,82,81,81,81,80,80,79,79, 78,78,77,77,76,75,75,75,74,74,74,74,74,73,73,72,71,71,70,69,68, 68,67,67,66,66,66,66,65,65,65,65,65,64,63,63,63,63,63,61,61,61, 60,60,60,60,59,59,58,58,58,57,57,56,56,56,55,54,54,53,53,52,52, 52,51,50,50,48,48,47,46,46,44,44,44,44,44,43,43,43,43,42,41,41, 41,40,40,40,40,39,39,39,39,38,38,38,38,38,38,38,37,37,36,36,36, 35,35,34,34,33,32,32,32,32,31,31,30,30,30,29,28,27,27,26,26,26, 26,25,25,25,24,23,22,22,22,21,21,20,20 }; const int n3c3w2_i[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,99,99,99,99,98,98,98,96,96,96,95,95,95,95,95,95,95, 95,94,94,92,92,92,92,92,92,92,92,92,91,89,89,87,87,86,86,86,85, 85,85,84,84,84,83,83,83,82,82,81,81,81,81,79,79,79,79,77,76,75, 75,74,74,73,72,70,69,69,69,69,69,69,69,69,68,67,67,64,64,64,64, 64,64,63,63,63,63,63,62,62,62,62,61,59,58,58,57,57,56,55,55,54, 54,52,52,52,52,52,51,51,50,50,50,48,47,46,46,45,45,45,45,45,45, 45,44,44,44,44,43,42,42,41,41,41,41,41,41,40,40,39,39,38,38,38, 37,37,36,36,36,35,35,35,35,35,35,35,35,34,34,34,34,33,33,32,31, 31,31,31,31,30,30,30,29,29,28,28,28,28,28,27,26,26,26,26,25,24, 24,23,23,23,22,22,22,22,21,21,20,20 }; const int n3c3w2_j[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 99,99,99,99,99,99,98,98,98,97,97,97,97,96,96,96,95,95,95,95,95, 95,94,94,94,93,93,92,92,92,92,92,91,91,90,90,87,87,87,87,87,86, 86,85,84,84,84,83,83,83,83,82,82,82,82,82,82,81,80,80,79,78,78, 77,76,76,75,75,74,74,73,73,72,72,72,71,71,71,70,70,69,69,69,68, 68,68,68,68,67,67,66,66,66,65,65,65,64,64,64,64,63,63,61,60,59, 59,59,59,58,58,57,57,57,57,56,56,55,55,54,54,54,54,54,53,52,52, 52,52,50,50,49,49,49,48,48,48,48,48,48,47,47,47,47,46,45,44,44, 43,43,43,43,43,42,41,41,40,40,40,40,40,39,38,37,36,36,35,34,34, 33,33,32,32,31,30,30,29,28,28,28,28,28,27,26,26,25,24,23,23,23, 23,23,22,22,22,21,21,21,21,21,20 }; const int n3c3w2_k[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,98,98,98,98,97,97,96,96,96,95,95,94, 94,93,93,93,92,91,91,91,91,91,90,89,89,89,89,89,88,88,88,88,88, 87,87,86,86,86,86,85,85,85,84,84,84,83,83,83,82,82,82,82,82,81, 81,80,80,80,80,79,79,79,79,79,79,78,75,75,75,74,74,73,73,73,73, 73,71,71,70,70,68,68,67,67,67,67,67,66,65,65,65,65,64,64,63,62, 62,62,62,61,61,60,59,58,58,57,56,56,55,54,54,53,52,52,52,52,52, 51,51,51,51,51,51,51,48,48,47,47,46,46,46,46,46,45,45,44,43,43, 43,43,43,42,42,41,39,39,39,38,36,34,34,33,33,33,33,33,32,32,31, 31,31,30,30,30,29,29,29,29,28,28,28,28,28,27,27,26,26,26,26,26, 25,25,25,25,24,24,22,22,21,21,21,21,20 }; const int n3c3w2_l[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,99,99,98,98,98,98,97,97,97,97,97,96,96,96,95, 95,94,94,94,93,93,92,91,91,90,90,89,89,89,89,89,88,87,85,85,85, 85,85,84,83,83,83,82,82,81,81,80,80,80,80,79,79,79,79,78,78,76, 75,75,74,74,74,74,74,73,73,73,72,71,70,70,69,69,69,69,68,67,67, 67,67,66,66,66,65,64,64,64,63,63,63,63,62,62,61,61,60,60,60,60, 60,60,58,58,57,56,56,56,56,56,56,55,55,55,54,54,53,51,51,51,51, 51,50,50,50,49,48,48,47,46,46,46,45,45,45,45,45,44,44,43,42,41, 41,41,40,40,40,39,39,39,39,38,38,37,37,37,37,36,35,35,35,34,34, 34,33,33,32,30,30,30,30,30,29,29,28,28,28,27,26,26,26,25,25,25, 25,24,24,24,24,23,23,23,23,23,22,21 }; const int n3c3w2_m[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,98,98,97,97,97,96,96,96,96,96,96,95,95, 94,93,93,93,93,92,92,92,91,91,91,91,91,91,91,90,89,89,89,88,86, 86,86,85,85,85,85,84,84,83,83,82,82,82,82,80,80,80,80,80,79,79, 79,78,77,77,77,74,74,73,73,73,73,73,73,72,71,71,70,70,69,69,69, 69,69,68,68,68,67,66,65,65,65,64,64,64,63,62,61,61,61,61,61,60, 60,60,59,58,57,57,57,57,56,56,56,56,56,55,55,55,54,54,54,54,54, 53,53,52,52,52,51,50,50,50,50,49,49,49,48,47,47,46,46,45,45,45, 44,44,44,44,44,43,42,42,41,38,38,38,38,38,37,37,37,35,35,35,35, 35,33,32,32,32,32,31,31,31,31,30,30,29,29,29,29,28,27,26,26,25, 25,25,25,25,25,24,24,23,23,21,20,20 }; const int n3c3w2_n[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,98,98,97,97,97,96,94,94,93,93,92,91,90,90,89,89, 89,89,89,88,88,88,87,87,87,87,86,86,86,86,85,85,83,83,83,82,82, 82,82,81,80,80,80,80,78,77,77,76,76,74,73,73,73,73,72,72,72,71, 71,71,70,70,70,69,69,69,68,68,68,68,67,67,66,66,66,65,65,65,65, 64,64,64,64,63,62,60,59,58,58,58,57,57,57,57,57,57,56,55,55,53, 52,52,52,51,50,50,49,48,48,48,48,48,48,48,47,46,46,46,46,45,45, 45,45,44,44,44,44,43,43,43,42,42,42,42,41,40,40,39,39,39,39,38, 38,38,38,38,38,36,36,35,34,34,33,33,33,33,33,33,32,32,32,32,32, 31,31,31,31,31,30,30,30,30,29,28,27,27,27,26,26,25,25,25,24,24, 23,23,23,22,22,21,21,20,20,20,20,20 }; const int n3c3w2_o[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,99,98,98,97,97,97,97,97,97,96,96,95,94,93,93, 92,91,91,91,90,90,90,90,89,89,89,89,88,88,88,88,87,87,86,86,86, 85,85,85,85,85,84,84,84,84,83,82,82,82,82,82,81,81,81,81,80,79, 79,79,79,78,78,78,78,77,76,76,75,75,74,74,73,71,71,70,70,70,70, 69,69,68,68,68,67,67,67,66,65,65,65,65,63,63,62,61,61,61,61,59, 59,59,59,59,58,58,58,57,57,57,56,56,56,55,55,55,54,54,54,54,53, 53,53,53,53,52,52,51,51,50,50,50,49,48,47,46,45,45,44,43,42,42, 42,41,41,41,41,40,40,39,39,38,37,36,36,35,34,34,34,34,34,34,33, 33,32,31,31,30,30,29,29,29,29,29,28,28,27,26,25,25,25,24,24,24, 23,23,22,22,22,21,21,21,20,20,20,20,20 }; const int n3c3w2_p[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,99,99,99,98,98,98,98,96,96,96,96,95,95,94,93,93,92, 92,92,92,91,91,91,91,90,90,90,89,89,87,87,87,86,85,84,84,84,83, 82,82,82,81,81,80,80,79,79,79,78,78,78,76,76,76,76,75,75,75,73, 73,73,72,72,71,71,71,71,70,70,70,69,69,68,68,68,68,67,67,67,67, 67,67,67,66,66,66,65,65,64,64,64,63,63,63,62,62,62,62,61,61,60, 59,59,59,58,57,57,56,55,55,55,55,55,53,52,52,51,51,51,51,51,50, 50,50,50,49,49,49,48,47,47,46,46,45,44,44,44,44,43,43,41,41,41, 40,40,38,38,37,37,37,37,36,36,36,36,36,35,34,34,34,34,33,33,33, 32,32,32,31,31,31,30,30,29,27,27,27,27,26,26,25,25,25,25,25,24, 24,24,23,23,23,22,22,22,20,20,20,20 }; const int n3c3w2_q[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,99,98,98,98,98,98,97,97,96,96,95,94,94,94,93,93,93, 92,92,91,91,91,91,90,90,89,88,88,88,87,87,87,86,86,86,85,85,84, 84,83,82,80,80,80,79,79,79,79,78,78,77,77,77,76,74,74,73,73,73, 72,71,71,71,70,70,70,70,68,68,68,67,67,67,67,66,66,65,64,64,63, 63,61,61,60,60,60,60,59,59,58,58,58,58,57,57,57,56,56,55,54,51, 51,50,49,48,48,48,47,45,45,45,44,44,44,44,43,43,43,43,43,43,42, 42,42,42,41,41,40,39,39,39,39,38,38,38,38,38,38,38,38,37,37,37, 36,36,35,35,35,35,34,34,34,34,34,33,33,33,33,32,32,31,31,31,30, 30,29,28,28,28,27,25,25,24,24,24,24,24,23,23,23,23,23,22,22,22, 22,22,21,21,21,21,21,21,21,20,20,20 }; const int n3c3w2_r[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,97,96,96,96,95,95,95,95,95,94,94,94,94,93,93, 93,92,92,91,90,89,89,89,88,88,87,87,87,87,86,85,85,84,84,83,83, 83,82,82,81,81,81,80,80,80,80,80,79,78,78,77,77,76,76,75,74,74, 73,73,73,72,71,71,71,70,70,70,69,68,68,68,67,67,67,66,65,65,65, 64,64,63,62,62,62,61,61,61,60,60,60,59,58,58,58,58,58,58,57,57, 57,57,56,56,55,54,53,53,53,53,52,52,52,51,51,50,50,50,49,49,49, 48,46,46,46,46,46,46,44,43,43,43,42,42,42,41,41,40,40,40,39,39, 39,38,38,38,37,37,37,36,36,36,36,35,35,35,35,33,33,33,33,33,32, 32,32,32,32,31,31,30,30,29,29,29,29,29,29,29,29,28,28,28,28,27, 26,26,26,25,24,24,24,23,22,21,21,21 }; const int n3c3w2_s[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,98,98,98,98,97,97,97,96,96,95,95,95,94,94,94,93,92,91,91, 91,90,89,89,88,88,87,87,87,87,87,86,86,86,86,85,85,85,84,84,84, 83,83,82,81,80,80,80,80,80,79,78,78,78,78,77,77,77,77,77,77,77, 76,76,76,74,74,74,74,74,73,73,73,72,71,71,71,69,69,69,69,69,68, 68,67,67,67,66,66,66,65,65,65,65,64,64,64,62,62,62,62,62,61,61, 61,61,59,59,59,57,57,57,56,55,55,54,52,52,52,51,51,50,50,50,50, 49,49,48,48,47,46,46,45,45,45,44,44,44,43,42,41,41,41,40,39,39, 38,37,37,37,37,37,36,36,35,35,35,34,34,34,33,33,33,32,31,31,31, 31,30,30,30,29,29,29,28,28,28,28,27,27,27,27,26,26,25,25,24,24, 24,23,23,23,22,22,22,22,21,21,20,20 }; const int n3c3w2_t[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,99,99,98,97,97,96,95,95,95,94,94,94,93,92,92, 92,91,91,90,90,90,88,88,87,85,85,84,84,84,84,84,84,84,84,84,83, 83,82,82,82,82,82,82,81,81,80,80,79,79,78,78,78,78,78,78,77,77, 77,76,76,75,74,74,74,74,73,73,72,71,70,69,69,69,67,67,66,65,64, 64,62,62,62,61,61,61,60,60,60,60,59,59,58,57,57,56,56,56,56,56, 56,55,55,55,55,54,53,53,53,53,52,52,51,51,49,49,49,49,49,49,49, 48,47,47,47,46,46,45,44,44,44,44,43,43,42,42,42,42,41,39,39,38, 37,37,37,36,36,36,36,35,35,33,33,33,33,33,32,32,32,31,31,31,31, 30,30,30,30,30,30,29,29,29,29,28,28,28,28,26,25,25,25,24,24,24, 23,23,23,23,23,22,22,21,21,21,21,20 }; const int n3c3w4_a[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,98,98,98,98,98,98,97,97,96, 96,96,96,96,95,95,95,94,94,93,93,93,92,92,92,91,90,90,89,89,89, 89,89,89,89,89,89,88,88,87,86,86,86,85,85,85,85,84,84,83,83,82, 82,82,81,80,80,80,80,79,79,78,78,78,78,77,76,76,76,75,74,73,73, 73,73,73,72,72,72,71,68,68,68,68,68,67,66,66,65,65,65,65,65,65, 64,64,63,63,62,62,62,62,60,59,59,59,58,58,58,56,56,56,55,55,55, 54,54,54,54,53,53,53,52,52,52,51,51,51,51,51,50,50,50,50,50,49, 49,49,49,48,48,48,48,47,46,46,45,45,45,45,44,43,43,43,43,42,42, 41,41,41,40,40,40,39,39,39,39,39,38,38,38,37,37,37,36,35,35,34, 34,34,34,33,33,33,33,32,32,31,30,30,30 }; const int n3c3w4_b[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 99,99,98,98,97,97,97,96,96,96,96,95,95,95,94,94,93,93,92,92,91, 91,91,91,91,90,89,89,89,88,88,87,87,87,86,86,86,86,86,86,86,84, 84,83,82,82,82,82,81,81,81,81,80,80,80,79,79,79,79,78,78,78,78, 77,77,77,77,77,76,76,75,75,75,75,74,74,74,73,72,72,72,72,72,72, 72,71,71,70,70,70,69,69,69,69,69,68,68,68,68,67,67,67,67,67,67, 65,65,64,63,63,62,62,62,62,62,61,61,61,60,60,59,58,57,57,56,55, 55,55,55,53,53,52,52,52,52,51,51,51,51,50,50,50,49,49,49,48,48, 48,48,47,47,46,45,45,45,44,44,44,44,44,43,43,43,43,42,42,42,42, 42,42,41,40,40,39,38,38,38,37,37,36,36,36,36,36,35,35,35,34,34, 33,33,33,32,32,32,31,31,31,31,30 }; const int n3c3w4_c[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,99,98,98,98,97,97,97,97,97,97,96,96,96,96,96,95,95,95,95, 95,95,94,94,94,94,94,94,93,93,92,92,92,92,91,91,90,89,89,89,89, 88,88,88,88,87,87,87,87,86,85,84,84,83,83,83,83,82,82,82,82,81, 80,79,79,79,79,77,77,77,76,76,74,74,74,73,73,73,73,72,72,72,71, 71,71,71,71,71,71,70,69,69,69,69,68,68,67,67,66,65,65,64,63,63, 63,63,62,62,62,62,60,60,59,59,59,59,59,58,58,58,58,58,58,57,57, 56,56,56,56,55,55,54,53,53,53,52,52,52,52,51,51,50,50,50,49,49, 48,48,48,48,47,47,46,46,46,46,46,45,45,44,43,43,43,43,42,41,41, 39,38,38,38,38,38,37,37,37,37,37,37,36,36,36,36,35,35,35,35,34, 34,34,34,34,33,33,33,32,32,31,31,30 }; const int n3c3w4_d[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,98,98,98,97,96,96,96,96,95,95,95,94, 94,94,94,94,93,92,92,92,92,91,91,91,90,90,90,90,88,87,87,86,86, 86,86,85,85,85,83,83,82,82,82,82,81,81,81,80,80,79,79,79,79,79, 78,78,78,78,78,78,77,76,75,75,75,75,75,75,74,74,73,73,73,73,72, 72,72,71,70,70,69,68,68,68,67,66,65,65,65,65,64,64,63,63,63,63, 63,62,61,61,60,60,60,59,59,59,59,58,58,56,56,56,56,56,56,55,55, 55,55,55,54,54,54,53,53,53,52,52,52,51,51,51,51,50,50,50,49,48, 48,48,48,48,48,48,48,47,47,47,47,47,46,46,46,45,45,45,45,44,43, 43,43,42,42,42,41,40,38,37,37,37,37,36,36,36,36,35,34,34,34,33, 33,33,33,33,32,32,32,32,32,32,30,30,30 }; const int n3c3w4_e[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,98,98,97,96,96,95,94,94,93,93,93,93,93,92,92,91, 90,90,90,90,89,89,89,88,88,88,88,87,87,87,87,86,86,85,85,85,84, 84,83,83,83,82,81,81,80,80,80,79,79,78,78,78,77,77,77,77,76,76, 75,75,75,75,74,74,74,74,73,73,73,72,71,71,71,71,70,70,69,68,68, 68,68,68,68,68,67,67,67,66,66,66,65,64,64,64,64,63,63,63,63,62, 62,61,61,61,60,60,58,58,58,58,58,57,57,56,56,56,56,56,56,55,55, 55,54,54,54,53,53,52,52,52,52,51,51,51,50,50,50,49,49,49,48,48, 47,47,47,47,46,46,46,46,46,45,44,44,44,44,44,43,43,42,42,42,42, 41,41,41,39,39,39,39,39,39,38,38,37,37,37,37,36,35,35,34,34,34, 34,34,33,33,33,33,32,32,31,30,30,30 }; const int n3c3w4_f[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,98,98,98,98,98,97,97,97,97,96,96,95,94,94,93, 93,93,92,92,92,91,90,90,87,87,87,86,86,86,86,85,85,84,83,83,83, 82,82,81,81,80,80,80,80,80,80,80,79,79,79,79,79,79,78,78,78,76, 75,75,74,73,73,72,71,71,71,71,71,70,69,69,69,68,68,67,67,67,66, 66,66,66,66,66,66,66,65,65,65,63,63,63,63,62,62,62,62,61,61,60, 60,60,60,60,60,58,58,58,58,58,58,57,56,56,56,56,55,55,54,54,54, 53,53,53,52,52,51,51,51,49,49,49,48,48,48,48,48,48,47,46,46,46, 46,45,45,44,44,44,43,43,42,42,42,42,41,41,41,40,40,40,40,39,39, 39,39,39,39,39,38,38,38,38,37,36,36,36,36,36,36,35,35,35,35,34, 34,33,33,32,31,31,31,31,30,30,30,30 }; const int n3c3w4_g[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,98,98,98,98,98,98,98,97,97,97,97,97, 96,95,94,94,94,93,93,92,92,92,91,91,91,91,91,90,90,90,89,89,89, 89,89,88,88,88,88,88,87,87,87,87,86,86,86,86,85,85,84,84,84,84, 84,84,83,83,83,83,82,82,81,81,81,80,80,80,80,79,78,77,77,77,76, 76,76,76,76,76,76,75,75,75,75,74,74,74,74,74,72,72,71,71,71,70, 70,69,68,68,68,68,68,67,67,66,66,65,65,65,64,63,63,62,62,61,61, 61,60,60,60,60,60,60,59,59,59,58,58,58,58,57,57,56,56,55,55,55, 55,54,54,54,54,54,54,52,52,51,50,50,49,49,49,48,47,47,47,47,46, 46,46,45,44,44,43,43,42,42,40,40,39,38,38,38,38,37,37,36,36,35, 35,35,35,35,35,34,34,32,31,31,31,31,30 }; const int n3c3w4_h[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,99,99,99,97,97,96,95,95,94,94,94,94,93,92,92,92,92,92,92, 92,91,91,91,91,90,90,89,89,89,89,88,87,87,86,86,86,85,85,85,84, 84,84,83,83,83,82,82,82,82,81,81,81,81,79,79,77,77,76,76,76,76, 75,75,74,74,74,74,73,72,71,71,70,70,68,68,67,67,67,66,66,66,65, 65,64,63,63,63,62,62,62,62,62,61,61,61,61,60,60,60,60,60,60,60, 58,58,57,57,57,56,56,56,56,56,55,55,55,55,54,54,53,53,53,53,53, 52,52,52,52,52,51,51,51,51,51,51,50,50,50,50,49,49,49,48,48,48, 48,48,47,47,47,47,46,46,45,45,45,44,44,44,43,43,43,42,42,42,41, 40,40,39,39,39,39,38,38,37,37,37,37,37,36,36,35,35,35,35,35,34, 34,34,34,33,33,33,32,31,31,30,30,30 }; const int n3c3w4_i[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,97,97,97,96,96,96,96,96,95,95,95,95,94,94,93, 93,93,93,92,92,92,92,92,91,91,91,90,90,90,90,89,89,89,89,89,88, 88,88,88,88,88,87,87,86,86,85,85,85,85,85,84,84,84,83,83,83,82, 81,81,81,80,79,79,79,79,79,79,78,78,78,78,78,77,77,76,76,75,75, 75,75,74,74,74,73,72,72,72,72,71,71,71,70,70,70,70,69,69,69,69, 69,68,67,67,67,67,66,66,66,65,65,65,64,63,63,63,63,62,62,62,61, 61,61,61,60,60,59,59,58,58,58,58,56,56,55,55,55,53,53,52,52,52, 52,51,51,50,49,48,48,48,48,47,46,46,46,46,45,45,45,44,44,43,43, 42,42,41,41,40,40,40,40,39,39,38,38,38,38,37,37,37,36,36,36,35, 35,35,34,34,33,32,32,32,32,31,31,30 }; const int n3c3w4_j[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,98,97,97,97,96,96,96,95,95,95,95,94,94,94,94,94,94, 93,93,93,93,93,93,92,91,91,91,90,90,90,89,89,89,87,87,86,86,85, 85,85,85,85,84,84,83,83,83,83,82,82,82,82,81,81,81,81,81,81,81, 80,80,78,78,78,78,77,77,77,76,76,75,75,75,75,74,74,74,74,73,73, 73,71,71,71,71,70,70,69,69,68,68,67,67,67,66,66,66,65,64,63,63, 63,62,61,61,61,61,61,61,60,60,60,60,58,58,58,58,57,57,57,57,56, 56,56,56,56,56,55,54,53,53,53,53,52,52,52,52,51,51,50,50,49,49, 49,48,48,48,48,48,48,47,47,46,46,46,46,46,44,44,44,43,43,43,42, 42,42,41,41,39,39,39,38,37,37,37,36,36,36,34,32,32,32,32,32,31, 31,31,31,31,31,31,31,31,31,30,30,30 }; const int n3c3w4_k[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,98,98,98,98,97,97,97,96,96,96,96,96,95, 95,95,94,94,94,92,92,92,92,92,92,91,91,90,90,90,90,90,90,89,89, 88,88,88,87,87,86,86,85,85,85,84,84,84,84,83,82,82,81,81,79,79, 78,77,77,77,77,77,76,76,75,75,74,74,74,73,73,73,73,73,73,72,71, 70,70,70,70,70,69,69,69,69,68,68,67,67,67,66,66,65,65,64,64,63, 63,63,62,62,62,62,62,60,60,60,60,59,59,59,58,58,58,58,58,58,57, 57,57,56,56,56,56,55,55,55,54,54,54,53,53,53,53,53,53,52,51,50, 49,49,49,49,49,48,48,48,47,47,47,47,47,47,46,45,45,45,44,44,43, 43,43,42,42,41,41,41,41,40,39,39,39,38,38,38,37,37,37,36,36,36, 35,35,35,34,33,33,33,33,32,31,31,30 }; const int n3c3w4_l[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,98,98,98,97,97,97,97,96,96,96,96,96,95,95,95, 95,94,94,93,93,92,92,91,91,91,90,90,90,90,89,89,89,88,88,88,87, 86,86,86,86,85,85,85,84,84,84,84,83,83,83,83,83,82,82,82,82,82, 81,81,81,81,80,80,80,80,79,79,78,78,77,77,77,76,75,75,74,74,74, 73,73,73,72,72,71,71,71,71,70,70,69,68,67,65,65,64,64,64,63,63, 63,62,62,62,62,60,60,60,60,59,59,59,58,58,58,58,57,56,56,56,56, 55,55,54,54,54,53,53,53,53,53,53,52,52,52,52,52,50,50,50,50,50, 50,49,49,48,48,48,47,47,46,45,45,45,44,44,44,44,44,43,43,43,43, 43,42,42,42,42,41,41,40,40,40,39,39,38,37,36,36,36,36,35,35,34, 34,33,33,32,32,32,31,31,31,30,30,30 }; const int n3c3w4_m[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,98,98,98,98,97,96,95,94,94,94,94,93,93,93,93, 93,92,92,92,91,90,90,90,90,90,90,89,89,88,88,87,87,86,86,86,86, 86,85,85,85,85,84,84,83,83,83,82,82,82,82,82,81,81,80,80,79,79, 79,79,79,79,78,78,78,77,77,76,76,76,76,75,75,75,74,74,74,74,74, 73,73,73,73,72,72,71,69,69,69,69,68,68,68,67,67,66,65,65,65,63, 63,63,62,61,61,61,61,60,60,59,59,59,59,58,58,58,58,58,56,56,56, 55,55,54,54,54,53,53,53,53,53,52,52,52,52,51,51,51,51,51,50,50, 49,49,49,48,48,47,46,46,46,46,45,45,45,44,44,44,42,42,42,41,41, 39,39,38,38,38,38,38,37,37,37,37,37,37,37,36,36,36,36,35,35,35, 34,34,34,33,32,31,30,30,30,30,30,30 }; const int n3c3w4_n[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,98,98,97,97,97,97,96,95,95,93,93,93, 93,92,91,91,90,90,89,89,89,88,88,88,87,87,87,86,86,86,86,86,85, 85,85,84,84,84,84,84,84,83,83,83,82,82,82,81,81,81,80,80,79,79, 79,78,78,78,78,78,77,77,76,75,75,75,75,75,75,74,74,74,74,74,72, 71,71,71,71,71,71,70,69,69,69,68,67,66,65,65,65,64,64,63,63,62, 62,62,61,60,59,59,59,59,58,58,58,57,57,57,57,56,56,56,56,55,54, 54,53,52,52,51,50,49,49,49,49,48,48,48,48,48,47,47,47,46,46,46, 46,46,45,45,45,45,44,44,44,44,44,44,43,43,43,42,42,42,41,41,41, 41,40,40,40,40,40,40,39,39,38,38,37,37,36,36,35,34,34,34,34,34, 33,33,33,33,33,33,32,32,32,32,31,30,30 }; const int n3c3w4_o[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,98,98,98,98,97,97,97,96,96,96,96,96,96, 95,94,94,93,92,92,92,91,91,91,91,90,90,90,89,89,89,89,89,87,87, 87,86,86,86,86,86,85,85,85,83,83,82,82,81,81,81,80,80,79,79,78, 78,78,78,77,77,77,77,76,76,76,75,75,75,75,73,73,73,72,72,71,71, 70,70,70,69,69,68,68,67,67,67,67,66,65,64,64,64,64,63,63,63,63, 62,62,61,61,61,61,60,60,60,60,59,59,59,59,59,58,58,58,58,57,57, 57,57,56,56,55,55,55,55,54,54,53,53,53,51,51,51,50,50,50,50,50, 49,49,48,47,47,47,47,47,46,45,45,44,44,43,42,42,41,41,41,40,40, 40,40,39,39,37,37,37,37,37,36,36,36,35,35,35,35,35,34,34,33,33, 33,33,32,31,31,31,31,31,31,31,30,30,30 }; const int n3c3w4_p[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,99,99,97,97,97,96,95,95,95,94,94,94,93,93,93,92,92, 92,92,92,92,91,91,91,91,90,90,89,88,88,86,85,85,83,83,83,82,82, 81,81,80,80,80,79,79,79,77,77,77,77,77,77,77,77,77,76,76,76,75, 75,74,74,74,74,74,74,73,73,72,72,72,71,71,70,70,70,68,68,68,67, 67,67,67,67,66,66,66,66,66,65,65,65,65,64,64,64,64,63,63,62,62, 62,62,62,62,61,61,61,60,60,60,60,60,59,59,58,58,58,58,57,57,57, 56,56,56,55,54,54,54,54,54,53,53,53,53,52,52,51,51,50,50,50,50, 50,49,49,49,48,48,48,47,47,46,46,46,45,45,45,44,44,44,43,43,42, 41,41,40,39,38,38,38,38,37,37,37,36,36,35,35,35,34,34,34,34,33, 33,33,33,33,32,32,31,30,30,30,30,30 }; const int n3c3w4_q[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,99,98,98,98,98,98,96,96,96,95,95,95,95,95,94, 94,94,92,92,92,91,91,91,90,89,89,88,88,86,86,85,85,85,84,83,83, 82,82,81,81,81,81,80,80,79,79,79,79,79,79,79,78,78,78,78,78,77, 77,77,77,77,77,77,76,75,75,75,74,73,73,73,73,72,72,72,71,71,71, 70,70,70,68,68,67,67,66,66,66,66,66,66,65,65,65,65,65,64,63,63, 63,63,63,62,62,62,62,62,62,61,61,61,61,61,60,60,59,59,57,56,56, 56,56,56,55,55,55,54,53,53,52,52,52,51,50,50,50,50,50,49,49,48, 48,48,47,47,46,46,46,46,45,44,44,44,44,44,43,43,43,42,42,41,41, 41,41,41,41,41,40,40,40,40,39,38,38,38,38,38,38,37,37,36,36,35, 35,34,34,33,33,33,33,33,32,32,32,30 }; const int n3c3w4_r[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,98,98,98,98,98,98,97,97,97,96,95,95, 94,93,92,92,92,92,91,91,91,91,91,90,90,90,90,90,89,89,88,88,88, 87,86,85,85,85,85,84,83,83,83,81,80,80,80,79,79,79,79,78,78,78, 78,78,78,77,77,77,77,76,76,76,76,76,75,75,75,74,73,73,73,73,73, 73,72,72,71,71,70,69,69,68,67,67,67,67,66,66,65,65,65,64,62,62, 61,61,61,61,61,61,60,59,59,59,59,59,58,58,58,58,57,57,57,57,57, 57,56,56,56,55,55,55,54,54,54,54,54,54,53,53,53,52,51,50,50,50, 49,49,49,48,48,47,47,46,46,45,45,45,44,44,44,43,42,42,42,41,41, 41,40,40,39,39,39,38,38,37,37,36,36,35,34,33,33,33,33,33,33,32, 32,32,32,32,31,31,31,31,31,30,30,30,30 }; const int n3c3w4_s[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 98,98,98,97,97,97,96,96,96,94,94,94,93,93,93,93,92,90,90,89,88, 87,87,87,86,86,86,86,86,85,85,85,84,84,83,83,82,82,81,81,80,80, 80,80,78,78,78,77,77,77,77,77,77,76,76,75,75,75,74,74,74,73,73, 73,72,72,72,71,71,71,71,71,71,71,71,71,70,69,69,69,68,68,68,68, 67,67,66,66,66,66,66,66,65,64,64,64,64,63,63,63,63,62,62,62,62, 61,61,61,60,60,60,59,58,58,58,57,57,56,56,55,55,55,54,54,54,53, 53,53,53,53,53,52,52,52,52,51,51,50,50,50,50,50,50,49,49,48,48, 47,47,47,47,47,46,46,45,45,44,43,43,43,42,42,41,41,41,41,40,40, 39,39,39,38,38,38,37,37,37,37,36,36,36,35,34,33,33,33,33,33,32, 32,32,32,32,31,31,31,31,30,30,30 }; const int n3c3w4_t[] = { 150, // Capacity 200, // Number of items // Size of items (sorted) 100,100,99,99,99,98,98,98,98,98,97,97,96,96,96,96,94,93,93,92, 92,90,90,89,89,89,88,88,88,88,88,88,87,87,87,87,86,86,85,85,84, 83,82,82,81,81,80,80,80,80,80,80,79,79,79,78,78,77,77,76,76,76, 75,75,75,75,75,74,74,74,74,73,72,72,72,71,71,71,71,71,70,70,69, 69,69,69,68,67,66,66,66,65,65,65,64,62,61,61,61,61,61,61,60,60, 60,59,59,59,59,58,58,58,57,57,56,56,56,56,54,54,54,54,53,53,53, 53,53,53,52,52,52,51,51,51,50,49,49,49,48,48,47,47,47,47,46,46, 46,46,45,45,45,44,43,43,43,43,42,42,41,41,41,41,41,40,40,40,40, 40,39,39,38,38,37,37,37,37,37,36,36,36,36,35,35,35,35,35,35,34, 34,34,34,34,34,33,33,32,31,31,30,30 }; const int n4c1w1_a[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,99,99,99,99,98,98,98,98,97,97,97,97,97,97,97,96,96,96,96, 96,96,96,95,95,95,95,95,94,94,94,94,93,93,93,92,92,92,91,91,91, 91,90,90,90,89,89,89,89,89,88,88,88,88,87,87,87,87,87,87,86,86, 86,86,86,86,85,85,85,84,84,83,83,83,83,83,83,82,82,82,82,81,81, 81,81,80,80,80,80,80,79,79,79,78,78,78,78,78,78,77,77,77,76,76, 76,76,76,75,75,75,75,75,75,74,74,74,74,73,73,73,73,73,73,73,72, 72,72,72,71,71,71,71,71,70,70,70,70,70,70,70,70,70,69,69,69,69, 68,68,67,67,67,67,67,66,66,66,65,65,65,64,64,64,64,63,63,63,63, 63,63,62,62,62,62,62,62,62,61,61,61,60,60,60,60,60,60,59,59,59, 58,58,58,58,58,58,57,57,57,57,57,56,56,56,56,56,55,55,54,54,54, 54,54,54,54,53,53,53,53,53,52,52,52,51,51,51,51,50,50,50,50,50, 49,49,49,48,48,48,48,48,48,47,47,47,46,46,46,46,46,46,45,45,45, 45,44,44,44,44,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42,42, 42,41,41,41,41,41,40,40,40,40,39,39,39,39,38,38,38,38,38,38,37, 37,37,37,37,37,37,37,36,36,36,36,36,36,35,35,35,35,35,35,34,34, 34,34,33,33,33,33,33,32,32,32,32,32,31,31,31,31,31,31,31,31,31, 30,30,30,30,29,29,29,29,29,28,28,28,28,28,28,28,27,27,27,27,27, 27,27,27,26,26,26,26,26,26,26,25,25,25,25,24,24,24,24,24,24,24, 23,23,23,23,23,22,22,22,22,22,22,21,21,21,21,20,20,20,20,20,20, 19,19,19,19,19,19,19,19,18,18,18,18,18,17,17,17,17,17,17,17,16, 16,15,15,15,15,15,15,15,15,14,14,14,14,13,13,13,13,13,13,13,13, 13,12,12,12,11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10, 9,9,9,9,9,8,8,8,7,7,7,7,7,7,6,6,5,5,5,4,4,4,4,4,4,3,3,3,2,2,2, 2,2,1,1,1,1,1,1 }; const int n4c1w1_b[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,99,99,98,98,98,98,98,98, 98,97,97,97,97,97,97,96,96,96,95,94,94,93,93,93,93,93,93,93,92, 92,92,92,92,92,91,91,91,91,91,91,91,90,90,90,90,90,90,90,90,90, 90,90,89,89,89,88,88,88,87,87,86,86,86,86,85,85,85,85,85,84,84, 84,84,84,84,83,83,83,82,82,82,82,82,81,81,80,80,80,80,80,80,79, 79,79,79,78,78,78,78,77,77,77,77,77,77,77,77,77,76,76,76,76,76, 75,75,75,75,75,75,74,74,74,73,73,73,73,72,72,72,72,72,72,72,71, 71,71,70,70,70,70,70,69,69,69,68,68,68,68,67,67,67,67,67,66,66, 66,66,66,65,65,65,65,65,65,65,64,64,64,64,64,64,63,63,63,63,63, 63,63,62,62,62,62,62,62,62,62,62,62,61,61,61,61,61,61,60,60,60, 60,60,60,60,60,60,59,59,59,59,59,59,59,59,58,58,57,57,57,56,56, 56,56,56,55,55,55,55,55,54,54,54,54,54,53,53,52,52,52,52,51,51, 51,51,50,49,49,49,49,49,49,49,49,49,48,48,48,48,48,48,47,47,47, 47,47,47,47,46,46,46,46,46,45,45,45,44,44,44,44,44,44,44,44,44, 43,43,43,43,43,43,43,42,42,42,41,41,41,41,41,41,41,41,40,40,40, 40,40,40,39,39,39,39,39,38,38,38,38,37,37,37,37,37,37,37,36,36, 36,36,36,36,36,36,35,35,35,35,35,35,35,35,34,34,33,33,33,32,32, 32,32,32,31,31,31,30,30,30,30,30,30,30,30,30,29,29,28,28,28,28, 27,27,26,26,26,26,26,26,26,26,26,26,26,25,25,25,25,25,24,24,24, 24,23,23,23,22,22,22,22,22,22,21,21,21,21,20,20,20,20,20,19,19, 19,19,19,19,18,18,18,18,18,17,17,17,16,16,16,16,16,16,15,15,15, 15,15,15,15,14,14,14,14,13,13,12,12,12,12,12,12,12,11,11,11,11, 11,11,11,10,10,9,9,9,9,8,8,8,8,7,7,7,7,7,6,5,5,5,4,4,4,4,3,3, 3,3,3,3,3,3,2,2,2,1,1,1 }; const int n4c1w1_c[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,99,99,99,98,98,98,98,98,98,98,98,97,97,97,97,97,97, 97,97,97,97,97,96,96,96,96,96,95,95,95,95,95,95,94,93,93,93,92, 92,92,92,92,92,92,92,91,91,91,90,90,89,89,89,88,88,87,87,87,87, 87,87,87,86,86,86,85,85,84,84,84,83,83,83,83,83,82,82,82,82,82, 82,82,81,81,81,81,81,80,80,80,80,80,79,79,79,79,79,79,78,78,77, 77,77,77,77,77,76,75,75,75,74,74,74,74,73,73,73,73,73,73,73,72, 72,71,71,71,71,71,71,71,70,70,70,70,70,69,68,68,68,68,68,67,67, 67,66,66,66,66,65,65,65,65,65,65,65,65,64,64,64,64,64,64,64,64, 64,64,64,63,63,63,63,63,62,62,61,61,61,60,60,60,60,59,59,59,59, 58,58,58,58,57,57,57,57,56,56,56,56,56,56,55,55,55,55,55,55,55, 55,55,55,54,54,53,53,53,53,52,52,52,52,51,51,51,51,51,51,50,50, 50,50,50,50,50,49,49,49,49,49,49,49,48,48,47,47,46,46,46,45,45, 45,45,44,44,44,44,43,43,43,43,43,42,42,42,42,42,42,42,42,42,42, 41,41,41,41,40,40,40,40,39,39,39,39,39,38,38,38,38,38,38,38,38, 37,37,37,37,37,37,37,37,37,36,36,36,36,36,35,35,35,35,35,35,35, 34,34,34,34,34,33,33,33,33,33,33,33,33,32,32,32,32,31,31,31,31, 31,31,31,31,30,30,30,30,30,29,29,29,29,28,28,28,28,27,27,26,26, 26,26,25,25,25,25,25,24,24,24,24,24,24,23,23,23,23,23,23,22,22, 22,22,22,21,21,21,21,20,20,20,20,20,19,19,19,19,19,19,19,19,19, 19,18,18,18,18,17,17,17,17,17,17,17,17,17,17,16,16,16,16,16,16, 15,15,15,15,15,15,15,15,15,14,14,14,14,13,13,13,13,13,12,12,12, 12,11,11,11,11,10,10,10,10,10,9,9,9,9,9,9,9,9,9,9,8,8,8,8,8,7, 7,7,7,7,7,7,7,6,6,6,6,5,5,5,5,5,5,4,4,4,4,4,4,4,3,3,3,3,3,2,2, 2,2,1 }; const int n4c1w1_d[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,98,98,97,97,97,97,97,97, 97,96,96,96,96,96,95,95,95,95,95,95,94,94,94,94,94,93,93,93,93, 93,93,93,92,92,92,92,92,92,91,91,91,91,90,90,90,90,89,89,89,89, 89,89,89,89,88,88,88,88,88,88,88,88,88,88,87,87,87,87,86,86,86, 86,85,85,85,85,84,84,84,84,84,84,84,83,83,83,83,83,83,83,82,81, 81,81,81,81,81,81,80,80,80,79,79,79,79,78,78,78,78,77,77,77,77, 76,76,76,76,76,75,74,74,74,74,74,73,73,72,72,72,72,71,71,70,70, 70,70,69,69,69,69,69,68,68,68,68,68,68,68,68,67,67,67,67,67,66, 66,65,65,65,64,64,63,63,63,63,63,63,63,63,63,63,62,62,61,61,61, 60,60,60,60,59,59,59,58,58,58,57,57,56,56,56,56,56,56,56,55,55, 55,55,54,54,54,54,54,53,53,53,53,52,52,52,51,51,51,51,51,51,51, 51,51,51,50,50,50,50,50,50,50,50,50,49,49,49,49,48,48,47,46,46, 46,46,46,46,46,45,45,45,44,44,44,44,43,43,43,43,43,43,42,42,42, 42,42,42,42,42,42,42,42,41,41,41,41,41,40,40,40,40,39,39,39,39, 39,39,38,38,38,38,37,37,37,37,37,37,37,36,36,35,35,35,35,34,34, 33,33,33,33,33,33,33,33,33,32,32,32,32,32,32,32,32,32,32,32,31, 31,31,31,31,30,30,30,30,30,30,29,29,29,29,28,28,28,27,27,27,27, 26,26,26,26,26,26,25,25,25,25,25,25,24,24,24,24,24,23,23,23,23, 22,22,22,22,22,22,21,21,21,21,21,21,21,21,20,20,20,20,20,19,19, 19,19,19,19,19,19,18,18,17,17,17,17,17,16,16,16,16,16,16,15,15, 15,15,14,14,14,14,14,14,13,13,13,13,13,13,13,12,12,12,12,12,12, 12,11,11,11,11,11,11,10,10,10,10,10,9,9,9,9,9,8,8,7,7,7,7,7,7, 7,7,6,6,6,6,5,5,5,5,5,4,4,4,4,4,4,4,4,3,3,3,3,2,2,2,2,2,2,2,1, 1,1,1,1,1 }; const int n4c1w1_e[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,99,99,99,98,98,98,98,98,98,97,97,97,97,97,97,97,96, 96,96,96,96,96,96,96,95,95,95,95,95,95,94,94,94,94,93,93,93,93, 93,92,92,92,92,90,90,90,90,90,90,90,89,89,89,89,89,89,88,88,88, 88,88,88,88,88,87,87,86,86,86,86,86,85,85,85,85,84,84,84,83,83, 83,83,82,82,82,82,82,82,82,81,81,81,81,81,81,80,80,80,79,79,79, 79,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,77,76,76, 76,76,76,76,75,75,75,74,74,74,74,74,74,73,73,73,73,73,73,72,72, 72,72,72,72,72,71,71,71,71,71,71,70,70,70,70,70,70,70,70,69,69, 69,68,68,68,68,68,68,68,67,67,67,67,67,67,66,66,66,66,66,66,65, 65,65,64,64,64,63,63,63,63,63,63,63,63,63,63,63,62,62,62,62,61, 60,60,60,60,60,60,59,59,59,58,58,58,58,58,57,57,57,57,57,57,56, 56,56,56,56,55,55,55,55,54,54,54,54,54,54,54,54,53,53,53,53,53, 53,52,52,52,52,52,52,52,51,51,51,51,51,51,51,51,51,50,50,50,50, 50,50,50,49,49,49,49,48,48,48,48,48,48,47,47,47,47,47,46,46,46, 46,46,45,45,45,45,44,44,44,43,43,43,43,43,42,42,42,41,41,41,40, 40,40,40,39,39,39,39,39,38,38,38,38,38,38,37,37,36,36,36,36,35, 35,34,34,34,34,33,33,33,33,32,32,32,32,32,32,31,31,31,31,31,31, 30,30,30,30,30,30,30,29,29,29,29,28,28,28,28,28,28,27,27,27,26, 26,25,25,25,24,24,24,24,24,24,23,23,23,23,23,23,23,22,22,22,22, 21,21,21,21,21,20,20,20,20,19,19,19,19,18,18,18,18,17,17,17,17, 17,17,16,16,16,16,16,16,16,16,16,16,15,15,15,14,14,14,14,14,13, 13,13,13,12,12,12,12,12,12,12,11,11,11,11,10,10,10,10,9,9,9,9, 8,8,8,7,7,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,4,4,4,3,3,2,2,2,2, 2,1,1,1,1,1,1 }; const int n4c1w1_f[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,98,98,98,98,98,97,97,97,97,97,97,96, 96,96,96,95,95,95,95,95,94,94,93,93,93,93,93,93,92,92,92,92,92, 92,91,91,91,91,91,91,90,90,90,90,90,90,90,90,89,89,89,89,89,89, 88,88,88,87,87,87,87,87,87,87,86,86,86,86,86,86,86,86,85,85,84, 84,84,84,84,84,84,84,83,83,83,83,83,83,82,82,81,81,81,81,81,81, 80,79,79,79,79,79,79,78,78,78,78,77,77,77,77,77,77,76,76,76,76, 76,75,75,75,75,75,74,74,74,74,73,73,73,73,72,72,71,71,71,71,71, 71,71,71,71,71,70,70,70,70,70,70,70,69,69,69,68,68,68,68,68,67, 67,66,66,66,66,66,66,66,66,65,65,65,65,65,65,65,65,64,64,64,64, 64,63,63,63,63,63,63,63,62,62,62,61,61,61,61,61,61,61,60,60,60, 60,60,60,59,59,59,59,59,59,59,59,58,58,58,58,57,57,57,57,57,57, 57,57,56,56,56,56,56,55,55,55,55,55,53,53,53,53,52,52,52,51,51, 51,51,51,51,50,50,50,50,50,49,49,49,49,49,49,49,49,49,48,48,48, 47,47,47,47,47,47,47,47,46,46,46,46,46,45,45,45,45,45,45,44,44, 44,43,43,43,43,42,42,42,42,42,42,41,41,41,41,41,41,40,40,40,40, 40,40,39,39,39,39,39,38,38,38,38,38,37,37,37,37,37,37,37,37,37, 37,36,36,36,36,36,36,36,36,36,35,34,34,33,33,33,33,32,32,32,32, 32,32,32,32,32,32,32,32,31,31,31,31,31,31,31,30,30,30,30,29,29, 29,29,28,28,28,28,28,28,28,27,27,27,27,27,26,26,26,26,26,26,26, 25,25,25,25,24,24,24,24,24,24,24,24,24,23,23,23,23,23,23,22,22, 22,21,21,21,21,20,20,20,20,20,20,19,19,19,19,18,18,17,17,17,17, 17,17,17,17,16,15,15,15,14,14,13,13,13,12,12,12,12,11,11,11,11, 11,10,10,10,10,10,9,9,8,8,8,7,7,7,7,7,6,6,6,6,5,5,5,5,4,4,4,3, 3,3,2,2,2,2,2,2,1,1,1,1 }; const int n4c1w1_g[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,99,99,99,99,98,98,98,97,97,97,97,97,97,96,96,96,96,96,96, 96,95,95,95,95,95,94,94,94,94,94,94,94,93,93,93,92,92,92,91,91, 91,90,90,90,90,90,90,89,89,89,89,89,89,89,89,88,88,88,88,88,88, 88,88,88,88,88,87,87,87,87,87,86,86,86,86,86,85,85,85,85,85,85, 85,85,85,84,84,84,84,83,83,83,82,82,82,81,81,81,81,80,80,80,80, 80,80,80,80,80,79,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78, 78,77,77,77,77,76,76,76,75,75,75,75,74,74,74,74,74,74,73,73,73, 73,72,72,72,72,71,70,70,70,70,69,69,69,69,68,68,68,68,68,68,68, 67,67,67,67,67,67,67,67,67,67,66,66,66,66,66,66,66,65,65,64,64, 64,64,63,62,62,62,62,61,61,61,60,60,60,60,60,60,59,59,59,59,58, 58,58,58,58,58,58,58,58,57,57,57,57,57,57,56,56,56,56,55,55,55, 54,54,54,54,53,53,53,53,53,52,52,52,52,51,51,51,51,51,50,50,50, 50,49,49,49,49,49,49,48,48,48,48,48,48,48,48,47,47,47,47,46,46, 46,46,46,45,45,45,45,44,44,44,44,44,44,44,44,44,44,43,43,43,43, 43,43,43,42,42,42,42,42,41,41,41,40,40,40,39,39,39,39,39,39,38, 38,38,38,38,38,38,38,37,37,37,37,36,36,36,36,36,35,35,35,34,34, 34,33,33,33,33,33,33,32,31,31,31,31,31,30,30,30,30,30,30,30,29, 29,28,28,28,28,28,28,28,27,27,27,27,27,27,26,26,26,26,26,26,26, 26,26,26,26,26,25,25,24,24,24,23,23,21,21,21,21,21,21,20,20,20, 20,20,19,19,19,19,19,18,18,18,18,18,18,18,17,17,17,17,17,17,17, 17,17,17,16,16,16,16,16,16,15,15,15,15,15,14,14,14,14,14,13,13, 13,12,12,12,12,12,12,12,12,11,11,11,11,11,10,10,9,9,9,9,9,9,9, 9,8,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,4,4,4,4,4,3,3,2,2,2,2,2, 2,1,1,1,1,1 }; const int n4c1w1_h[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,99,99,99,99,98,98,98,97,97,97,97,96,96,96,96,96,96,96, 95,95,95,94,94,94,93,93,92,92,92,92,92,92,92,92,92,91,91,91,91, 91,90,90,90,90,90,90,89,89,89,89,89,89,88,88,88,88,88,88,88,88, 88,88,87,87,86,86,86,86,85,85,85,84,84,84,84,83,83,83,83,83,82, 82,82,82,82,82,82,81,81,81,80,80,80,80,79,79,79,79,79,79,78,78, 78,77,77,77,76,76,76,76,76,76,76,75,75,75,75,75,75,75,74,74,74, 74,74,74,74,74,74,74,73,73,73,73,72,72,72,72,72,72,72,72,71,71, 70,70,69,69,69,69,69,69,69,68,68,68,68,67,67,67,67,67,67,66,66, 66,66,66,66,66,66,66,66,65,65,63,63,63,63,63,63,63,63,63,62,62, 62,62,62,62,62,62,61,61,61,60,60,60,60,60,60,60,59,59,59,59,59, 59,59,58,58,58,58,58,58,57,57,57,56,56,56,56,55,55,55,54,54,53, 53,53,53,52,52,52,52,52,52,52,52,52,51,51,51,51,51,51,50,50,50, 50,50,50,49,48,48,48,48,48,48,47,47,47,47,47,47,46,46,46,46,46, 46,45,45,44,44,43,43,43,42,42,42,42,42,41,41,41,41,40,40,40,40, 40,40,39,39,39,39,39,38,38,38,38,38,37,37,37,37,36,36,36,36,36, 36,36,36,36,35,35,35,34,34,34,34,34,33,33,33,33,32,32,32,32,32, 32,32,32,32,32,32,31,31,31,31,30,30,30,30,30,30,29,29,29,29,29, 29,29,28,28,28,28,28,28,27,27,27,26,26,26,26,26,26,26,26,25,25, 25,25,24,24,23,23,23,23,23,22,22,22,22,21,21,21,21,21,21,21,21, 20,20,20,20,20,20,20,20,19,19,19,19,19,18,18,18,18,17,17,17,17, 17,16,16,16,16,16,15,15,14,14,14,14,14,14,14,14,14,14,14,13,13, 12,12,12,12,12,12,12,11,11,11,11,10,10,10,10,10,10,9,9,9,8,8, 8,8,8,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,5,5,5,5,5,5,4,4,4,3,3,3,3, 2,2,2,1,1,1,1 }; const int n4c1w1_i[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,99,99,99,98,98,98,98,98, 98,98,97,97,97,97,97,96,96,95,95,95,95,94,94,93,93,93,93,92,92, 92,92,92,91,91,91,91,91,90,90,90,90,90,90,90,90,89,89,89,88,88, 88,88,88,88,88,87,87,87,87,87,87,86,86,86,86,86,86,86,85,85,85, 85,85,84,84,84,84,84,83,83,82,82,82,82,82,82,82,81,81,81,81,81, 81,80,80,80,80,80,79,78,78,78,78,77,77,77,77,77,76,76,76,76,76, 75,75,75,75,75,75,75,74,74,74,74,74,74,73,73,73,73,73,73,73,72, 72,72,72,70,70,70,69,69,69,69,69,68,68,68,68,68,68,67,67,66,66, 66,65,65,65,65,65,64,64,64,63,63,63,63,63,63,63,63,63,62,62,62, 62,62,61,61,60,60,59,59,59,59,59,59,58,58,58,58,58,58,58,58,58, 58,57,57,56,56,56,56,55,55,55,55,55,55,54,54,54,54,54,53,53,53, 53,53,53,53,53,52,52,52,52,51,51,51,51,51,50,50,50,50,50,50,50, 50,50,50,50,50,49,49,49,49,49,48,48,48,48,48,48,48,48,48,47,47, 47,47,47,47,46,46,46,46,45,45,45,45,44,44,44,44,44,43,43,43,43, 42,42,42,42,41,41,41,41,41,41,41,41,41,41,41,41,41,40,40,40,40, 40,40,39,39,39,39,39,39,39,39,39,38,38,38,38,38,38,37,37,37,37, 37,37,37,37,36,36,36,35,35,35,35,34,34,34,34,34,34,34,34,33,33, 33,32,32,32,32,32,32,32,32,32,32,32,32,31,31,31,31,31,31,31,29, 29,29,29,28,28,28,28,28,28,28,27,27,27,27,26,26,25,25,25,25,24, 24,23,23,23,23,23,23,23,22,22,21,21,20,20,20,20,20,19,19,19,19, 18,18,18,18,18,18,17,17,17,17,16,16,15,15,15,14,14,14,14,14,14, 14,14,14,13,13,13,13,13,12,12,12,11,11,11,11,11,10,10,10,9,9, 9,9,9,9,8,7,7,7,7,7,6,6,6,6,6,6,5,5,5,5,4,4,4,4,3,3,2,2,2,2,2, 2,2,2,1,1,1,1,1,1 }; const int n4c1w1_j[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,99,99,98,98,97,97,97,97, 97,97,97,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,94, 93,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,92,92,92,91, 91,91,91,90,90,90,90,90,90,90,89,88,88,88,88,88,87,87,87,87,87, 87,86,86,86,86,85,85,85,85,84,84,84,84,84,83,83,83,83,83,83,83, 82,82,82,82,82,81,81,81,81,81,81,80,80,80,80,80,80,79,79,79,78, 78,78,78,78,78,78,78,78,77,77,77,77,77,77,77,76,76,76,76,76,76, 75,75,75,75,75,75,74,74,74,74,73,73,73,73,72,72,72,72,71,71,71, 71,71,71,70,70,70,70,70,69,69,69,69,69,69,68,68,67,67,67,67,67, 66,66,66,66,66,65,65,65,65,65,65,65,64,64,64,64,64,64,64,64,64, 64,63,63,63,63,63,63,63,63,63,63,63,62,62,62,62,61,61,61,60,60, 60,60,60,60,59,59,59,59,59,59,58,58,58,58,58,58,58,58,58,58,58, 57,57,57,57,57,57,56,56,56,55,55,55,55,55,55,55,54,54,54,54,54, 53,53,53,52,52,52,52,52,52,52,52,52,51,51,51,51,50,49,49,48,48, 48,48,48,47,47,46,46,46,45,45,45,45,45,45,45,45,44,44,44,44,44, 43,43,43,43,43,42,42,42,41,41,40,39,39,39,39,39,39,38,38,38,37, 37,37,36,36,36,36,36,36,36,35,35,34,34,34,33,33,33,33,33,33,33, 33,33,32,32,31,31,31,31,31,31,31,30,30,30,30,30,30,29,29,29,29, 28,28,28,27,27,27,27,27,27,26,26,26,25,25,25,25,24,24,24,24,24, 24,24,24,23,23,23,23,23,23,23,22,22,22,22,22,22,22,21,21,20,20, 20,20,20,19,19,19,19,18,18,18,18,18,18,18,17,16,16,16,16,16,15, 15,14,14,14,14,14,14,13,13,13,13,13,13,13,12,11,10,10,10,9,8, 8,8,8,8,8,8,7,7,7,6,6,6,6,5,5,5,5,5,5,5,5,5,5,4,4,3,3,3,3,3,3, 3,3,3,3,2,2,2,1,1 }; const int n4c1w1_k[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,98,98,98,97,97,97,97,97,97,96,96, 96,95,95,94,94,94,94,94,93,93,93,93,93,93,92,92,92,92,91,91,91, 90,90,90,90,90,90,89,89,89,89,89,88,88,87,87,87,86,86,86,86,86, 85,85,85,85,85,85,85,84,84,84,84,83,83,83,83,83,83,82,82,81,81, 81,81,81,80,80,80,80,80,80,80,80,79,79,79,79,78,78,78,78,78,78, 78,78,77,77,77,77,76,76,76,76,75,75,75,75,74,74,74,74,74,74,74, 74,73,73,73,73,73,73,72,72,72,72,72,72,71,71,71,71,71,70,70,70, 70,69,69,69,69,69,69,69,68,68,68,68,68,68,68,67,67,67,67,67,66, 66,66,66,66,66,65,65,65,64,64,64,64,64,64,63,63,63,63,62,62,62, 61,61,61,61,61,61,60,60,60,60,60,60,60,60,59,59,58,58,58,58,58, 58,58,58,58,58,57,57,57,56,56,56,55,55,55,55,55,55,54,54,54,54, 54,53,53,53,53,53,53,53,52,52,52,52,52,51,51,51,50,50,50,50,50, 50,49,49,49,49,49,49,49,49,49,49,49,49,48,48,47,47,46,46,46,46, 46,46,46,46,46,46,46,45,45,45,44,44,44,43,43,43,43,43,42,42,42, 42,42,42,41,41,41,40,40,40,40,40,40,40,39,39,39,39,39,39,38,38, 37,37,37,37,37,37,36,36,36,36,36,35,35,35,35,35,35,35,35,35,34, 34,34,33,33,33,33,33,32,32,32,32,32,31,31,31,30,30,30,30,30,30, 30,29,29,29,29,29,29,28,28,28,28,28,28,28,28,28,27,27,27,27,27, 26,26,26,26,26,25,25,25,24,24,23,23,23,22,22,22,22,22,22,22,22, 22,22,21,21,21,21,20,20,20,19,19,19,19,19,18,18,18,17,17,17,17, 17,17,17,17,17,16,16,16,16,16,15,15,15,15,14,14,14,14,13,13,13, 12,12,12,12,12,11,11,10,10,10,10,10,10,10,8,8,8,8,8,8,8,7,7,7, 6,6,6,6,6,6,5,5,5,5,5,5,5,5,4,4,4,4,4,3,3,3,3,3,3,2,2,2,2,2,1, 1,1,1,1,1,1 }; const int n4c1w1_l[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,99,98,97,97,97,96,96,96, 96,96,96,96,96,95,95,95,95,94,94,94,94,94,94,93,93,93,93,92,91, 91,91,91,91,90,90,89,89,89,89,88,88,88,88,87,87,87,87,87,87,87, 86,86,86,86,86,85,85,85,85,85,85,85,85,85,85,85,85,84,84,84,84, 84,83,83,82,82,82,82,82,81,81,81,81,81,80,80,80,79,79,79,79,79, 79,79,78,78,78,78,78,78,77,77,77,77,77,77,76,76,76,76,76,76,76, 75,75,75,75,75,74,74,74,74,74,74,74,74,74,73,73,73,73,73,72,72, 72,72,72,71,71,71,71,71,71,70,70,70,69,69,69,69,69,69,68,68,68, 68,68,68,68,68,67,67,67,67,66,66,66,66,66,66,66,65,65,65,65,65, 64,64,64,64,64,63,63,63,62,62,62,62,62,62,62,62,61,61,61,61,60, 60,60,59,59,59,58,58,58,58,58,58,58,57,57,57,57,57,57,56,56,56, 56,56,56,56,55,55,55,55,54,54,54,54,53,53,53,53,52,52,52,52,52, 52,51,51,51,51,51,51,50,50,49,49,49,49,49,48,48,48,48,48,47,47, 47,47,47,46,46,46,45,45,44,44,44,44,44,44,43,43,43,43,42,42,42, 42,42,42,42,42,41,41,41,41,41,40,40,40,39,39,39,38,38,38,38,38, 38,37,37,37,37,36,36,36,36,36,36,36,36,35,35,35,35,35,35,34,34, 34,34,34,34,34,34,34,33,33,33,32,31,31,31,31,31,31,30,30,30,30, 30,29,29,29,29,29,29,29,28,28,28,27,27,27,27,26,26,26,26,26,26, 25,25,25,25,25,25,24,24,24,24,24,24,23,23,23,23,23,23,22,22,22, 22,21,21,21,21,21,21,21,21,19,18,18,18,18,18,18,18,17,17,17,17, 17,17,17,17,17,16,16,16,16,15,15,15,15,15,15,15,15,15,14,14,14, 13,13,13,13,12,12,12,12,12,11,11,10,10,10,10,10,10,10,9,9,9,9, 9,8,8,7,7,7,7,7,7,6,6,6,6,5,5,5,5,5,4,4,4,4,4,4,3,3,3,3,3,3,3, 2,2,2,2,1,1,1,1 }; const int n4c1w1_m[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,98,98,97, 97,97,96,96,95,95,95,94,94,94,94,94,94,94,93,93,93,93,93,93,93, 92,92,92,92,91,91,91,90,90,90,90,90,90,89,89,89,89,89,88,88,88, 88,88,88,87,87,87,87,87,86,86,86,86,86,86,85,84,84,84,83,83,83, 83,83,83,83,82,82,82,82,82,82,82,81,81,81,81,81,81,81,80,80,79, 79,79,79,79,78,78,78,78,78,78,78,77,77,77,76,76,76,76,75,75,75, 74,74,74,73,73,73,73,73,73,73,72,72,72,72,72,72,72,72,71,71,70, 70,70,70,70,70,69,69,69,69,68,68,68,67,67,67,67,67,66,66,66,66, 66,64,64,64,64,63,63,63,63,63,63,63,62,62,62,62,61,61,60,60,60, 60,60,60,60,60,60,60,59,59,58,58,58,58,58,58,57,57,57,57,56,56, 56,56,56,56,54,53,53,53,53,52,52,52,52,52,52,52,52,52,51,51,51, 50,50,50,49,49,49,49,49,49,49,49,49,49,48,48,47,47,46,46,46,46, 46,46,46,45,45,45,45,45,45,45,44,44,44,44,43,43,42,42,42,42,42, 42,42,42,41,41,41,41,41,41,41,41,41,40,40,40,39,39,39,39,38,38, 38,38,38,38,37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,36, 35,35,35,34,34,34,34,34,33,33,33,33,33,33,32,32,32,32,32,32,32, 32,31,31,31,30,30,30,30,30,30,30,29,29,29,29,29,28,28,28,28,28, 28,28,28,27,27,27,26,26,26,26,26,26,26,26,26,25,25,25,25,25,25, 25,25,24,24,24,24,24,23,23,23,23,23,23,23,22,22,22,22,21,21,21, 20,20,20,20,19,19,19,19,18,18,18,18,18,18,17,17,17,17,17,17,17, 17,16,16,16,16,16,15,15,15,15,15,15,15,14,14,14,14,14,14,13,13, 13,12,12,12,12,12,12,11,11,11,11,11,11,11,11,11,10,10,10,9,9, 9,9,8,8,8,8,7,7,7,7,7,7,6,6,6,6,5,5,5,5,5,4,4,4,4,4,4,4,4,3,3, 3,3,3,2,2,2,2,1,1,1 }; const int n4c1w1_n[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,98,98,98,98,98,98,97,97, 97,97,97,97,97,96,96,96,96,95,95,95,95,94,94,94,94,94,94,94,94, 94,93,93,93,93,92,92,92,92,91,91,91,90,90,90,89,89,89,89,89,89, 89,88,88,87,87,87,87,87,86,86,86,86,86,85,85,84,84,84,84,84,83, 83,83,83,83,83,83,83,83,82,82,82,82,82,81,81,81,81,81,80,80,80, 80,79,79,79,79,79,78,78,78,78,77,77,76,76,76,76,76,76,75,75,75, 75,75,75,75,75,75,75,74,74,73,73,73,73,73,73,72,72,72,72,72,71, 71,71,71,70,70,70,70,69,69,69,68,68,68,68,68,68,68,68,68,67,67, 67,67,66,66,66,66,66,66,66,66,66,65,64,64,64,64,64,64,64,64,63, 63,63,63,63,63,63,62,62,62,62,62,62,62,62,61,61,61,61,61,61,61, 60,59,59,59,59,58,58,58,58,57,57,57,57,57,56,55,55,55,55,55,55, 54,54,54,54,54,54,54,53,53,53,53,53,53,53,52,52,52,51,51,51,51, 51,51,51,50,50,50,50,50,50,49,49,49,49,49,49,49,48,48,48,47,47, 46,46,45,45,45,45,45,45,45,45,44,44,44,44,44,44,44,43,43,42,42, 42,42,42,41,41,41,41,41,41,40,40,40,40,40,39,39,39,39,38,38,38, 37,37,37,37,36,36,36,36,35,35,35,35,35,34,34,34,34,34,34,34,34, 34,33,33,33,33,33,33,33,32,32,32,31,31,31,31,30,30,30,30,29,29, 29,29,28,28,28,28,28,28,28,27,27,27,26,26,26,26,25,25,25,25,24, 24,24,24,23,23,23,23,23,23,22,22,22,22,22,21,21,21,21,21,20,20, 20,19,19,19,19,19,19,19,18,18,18,18,18,18,18,17,17,17,17,17,16, 15,15,15,15,15,15,15,14,14,14,14,14,13,13,13,13,13,13,13,12,12, 12,12,12,12,12,11,11,11,10,10,10,10,10,10,10,10,9,9,9,9,9,8,8, 8,7,7,7,7,7,7,7,6,6,5,5,5,5,5,4,4,4,4,4,3,3,3,3,3,2,2,2,2,2,2, 2,2,1,1,1,1,1,1 }; const int n4c1w1_o[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,99,99,98,98,98,98,98,98,98,98,97,97,97, 97,97,97,96,96,96,96,95,95,95,95,94,94,94,94,93,93,93,93,93,92, 92,92,92,91,91,91,90,90,90,90,90,90,90,90,90,90,90,89,89,89,88, 88,88,88,87,87,87,87,87,87,87,87,87,86,86,86,86,86,86,86,85,85, 85,85,85,85,84,84,84,83,83,83,83,83,82,82,82,82,82,82,82,81,81, 81,81,81,81,81,81,81,81,80,80,80,80,79,79,79,79,79,79,79,78,78, 78,78,78,78,77,77,77,77,77,76,76,76,76,76,76,76,75,75,75,74,74, 74,74,73,73,73,73,73,72,72,72,72,72,71,71,71,71,69,69,69,69,69, 69,68,68,67,67,67,67,67,66,66,66,66,65,65,65,65,65,64,64,63,62, 62,62,62,61,61,61,61,60,60,60,60,60,60,60,60,59,59,59,59,59,59, 59,59,58,58,58,58,57,57,57,57,57,57,57,57,56,55,55,55,55,54,53, 53,53,53,53,53,53,53,53,52,52,52,52,52,52,52,51,51,51,51,50,50, 50,49,49,49,49,49,49,49,49,49,48,48,48,48,48,48,47,47,47,47,47, 47,47,46,46,46,46,45,45,45,45,44,44,44,44,44,44,44,44,43,43,43, 43,43,43,42,42,42,42,42,42,41,41,41,41,40,40,40,40,39,39,38,38, 37,37,37,37,37,37,37,36,36,36,36,35,35,35,35,35,35,34,34,34,34, 34,34,33,33,33,33,33,32,32,32,31,31,31,31,31,31,30,29,29,29,29, 29,28,28,28,28,28,28,27,27,26,26,26,26,26,26,25,25,25,25,25,24, 24,24,24,24,23,23,23,23,22,22,22,21,21,21,21,21,21,20,20,20,20, 20,19,19,19,18,18,18,18,17,17,16,16,16,16,16,16,16,15,15,15,15, 15,15,15,15,15,15,15,15,14,14,14,14,14,14,13,13,13,13,13,13,12, 12,12,12,12,12,11,11,11,11,10,10,9,9,9,9,8,8,8,8,8,8,7,7,7,7, 7,7,7,6,6,6,6,6,6,6,5,5,4,4,4,4,4,4,3,3,3,3,3,3,3,2,2,2,1,1,1, 1,1,1,1 }; const int n4c1w1_p[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,98,98,97,97,97,97,97,97,97, 96,96,96,96,96,95,95,95,95,95,95,94,94,94,94,94,94,93,93,93,93, 93,92,92,92,91,91,91,91,91,91,90,90,90,90,90,90,90,90,89,89,89, 89,89,89,89,89,88,88,88,88,88,88,88,87,87,87,87,86,86,86,86,86, 85,85,85,85,85,84,84,84,84,84,83,83,83,83,83,83,82,82,82,82,81, 81,81,81,81,81,81,80,80,80,80,80,80,79,78,78,78,78,78,77,77,77, 77,77,77,77,76,76,76,76,76,76,76,76,75,75,75,75,75,75,74,74,74, 74,73,73,73,73,72,72,72,72,72,72,72,71,71,71,71,71,71,70,70,70, 70,70,70,70,69,69,69,69,69,68,68,68,68,68,67,66,66,66,65,65,65, 65,65,65,65,64,64,63,63,63,63,63,62,62,62,62,62,62,61,61,61,61, 61,60,60,60,60,60,60,60,59,59,59,59,59,59,59,59,59,59,59,58,58, 58,58,58,57,57,57,57,57,56,56,56,56,56,56,56,56,56,56,55,55,55, 55,54,54,54,54,54,52,52,52,52,52,51,51,51,51,50,50,50,50,49,49, 49,49,49,49,49,48,48,48,47,47,47,47,47,46,46,46,46,46,46,45,45, 45,45,44,44,44,44,43,43,43,43,42,42,41,41,41,41,41,40,40,40,39, 39,39,39,38,38,38,38,37,37,37,37,37,36,36,36,35,35,34,34,34,33, 33,33,32,32,32,32,32,32,32,31,30,30,30,30,30,30,30,30,30,29,29, 29,29,29,29,29,29,28,28,28,28,28,28,27,27,27,27,27,26,26,26,26, 26,25,25,25,25,24,24,24,24,24,23,23,23,23,23,22,22,22,22,21,21, 21,21,21,20,20,20,20,20,20,20,20,19,19,19,19,19,18,18,17,17,16, 16,16,16,16,15,15,15,15,15,15,15,14,14,14,14,14,13,13,13,12,12, 12,12,12,12,11,11,11,11,11,11,10,10,10,10,9,9,9,9,9,9,9,8,8,8, 8,8,8,8,7,7,7,6,6,6,6,6,6,6,6,6,6,5,5,4,4,4,3,3,3,3,2,2,2,2,1, 1,1,1,1,1,1 }; const int n4c1w1_q[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,98,98,98,98,97,97,97,97,96,96,96,96,96, 96,96,96,96,95,95,95,94,94,94,94,94,94,94,93,93,93,93,92,92,92, 91,91,91,90,90,90,89,89,89,89,89,89,89,88,88,88,88,87,87,87,87, 87,86,86,86,86,86,86,86,86,86,85,85,85,85,84,84,84,84,84,84,84, 83,83,83,83,83,83,82,82,82,82,82,81,81,81,81,81,81,81,81,80,80, 80,79,79,79,79,78,78,78,78,78,77,77,77,77,77,77,77,77,77,77,77, 76,76,76,75,75,75,75,75,75,74,74,74,73,73,73,73,73,73,73,72,72, 72,72,72,72,71,71,71,71,71,70,70,70,70,70,69,69,69,69,69,68,68, 68,68,68,68,68,68,67,67,67,67,67,67,67,67,66,66,66,66,66,66,66, 66,66,65,65,65,65,65,65,64,64,64,64,64,64,63,63,63,63,63,63,62, 62,62,62,62,62,62,61,61,61,61,61,61,61,61,61,60,60,60,60,60,60, 59,59,59,59,59,58,57,57,57,57,56,56,56,56,56,56,56,56,56,55,55, 55,54,54,54,54,53,53,53,53,53,53,53,53,52,52,51,51,51,51,51,51, 51,51,50,50,50,50,50,50,49,49,49,49,49,48,48,48,48,47,47,47,47, 46,46,45,45,45,44,44,43,43,43,42,42,42,41,41,41,41,41,41,41,40, 40,39,39,39,39,39,39,39,38,38,37,37,37,36,36,36,36,36,36,36,36, 36,35,35,35,35,34,34,34,34,34,34,34,33,33,32,32,32,32,32,32,32, 32,31,31,30,30,30,30,29,29,28,28,28,28,28,28,28,28,27,27,27,27, 27,26,26,26,26,25,25,25,25,25,25,25,24,24,24,24,24,23,23,23,22, 21,21,21,21,20,20,20,20,20,20,19,19,19,19,18,18,18,18,18,18,17, 17,17,16,16,16,16,16,15,15,15,15,15,14,14,14,14,13,13,13,13,13, 13,13,13,13,12,12,12,12,11,11,11,10,10,10,9,9,8,8,7,7,7,6,6,6, 6,6,5,5,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,2,2,2,2,1,1, 1,1,1,1,1 }; const int n4c1w1_r[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,98,98,98,98,98,98,97,97,97,96,96,96, 96,96,95,95,95,95,95,95,95,94,94,94,94,94,93,93,93,92,92,92,92, 92,92,92,91,91,91,90,90,90,90,90,89,89,89,89,89,89,88,88,88,88, 88,88,87,87,87,86,86,86,86,85,85,84,84,84,84,84,84,84,84,83,83, 83,83,83,83,82,82,81,81,81,81,80,80,80,80,80,80,80,79,79,79,78, 78,78,78,78,78,77,77,76,76,76,76,76,75,75,75,75,75,75,75,74,74, 74,74,74,73,73,73,73,73,73,72,71,71,71,71,71,71,70,70,70,70,70, 70,69,69,69,69,69,68,68,68,68,68,67,67,67,67,67,67,67,67,67,66, 66,65,65,65,65,65,64,64,64,64,63,63,63,63,62,62,62,62,62,62,61, 61,61,61,61,61,61,60,60,60,60,60,60,59,59,59,59,59,59,59,59,59, 58,58,58,58,58,57,57,57,56,56,56,56,56,56,56,56,55,55,55,55,55, 54,54,54,54,53,53,53,53,53,52,52,52,51,51,51,51,50,50,50,49,49, 49,48,48,48,48,48,47,47,47,47,46,46,46,46,46,46,45,45,45,45,45, 45,45,45,45,44,44,44,44,44,43,43,43,43,43,43,43,43,42,42,42,42, 42,42,42,42,41,41,40,40,40,40,40,40,39,39,39,39,39,39,38,38,38, 38,38,38,38,37,37,37,37,37,37,37,36,36,35,35,35,35,35,35,34,34, 34,34,34,34,34,33,33,33,33,33,33,33,33,33,33,32,32,32,32,32,31, 31,31,31,31,30,30,30,29,29,29,29,28,28,28,28,28,28,28,28,27,27, 27,27,26,26,26,26,25,25,25,25,25,25,25,25,25,24,24,24,23,22,21, 21,21,21,21,21,21,21,20,20,20,20,20,20,20,20,19,19,19,19,19,19, 18,18,18,18,18,18,17,17,17,17,17,17,16,16,16,16,15,15,15,15,15, 15,14,14,14,14,14,14,14,14,13,13,12,12,12,12,12,11,11,11,11,10, 10,9,9,9,9,9,8,8,8,8,8,8,7,7,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5, 4,4,4,4,4,3,3,3,2,1 }; const int n4c1w1_s[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,99,99,99,99,99,99,99,99,99,99,98,98,98,98,98,98,98,98,98, 97,96,96,96,96,96,96,96,95,95,95,95,95,95,95,94,94,93,92,92,92, 92,91,91,91,91,91,91,90,90,90,90,90,89,89,88,88,88,88,88,88,88, 88,87,87,87,87,87,86,86,86,86,85,85,85,85,85,85,85,85,85,84,84, 84,84,83,83,83,83,83,82,82,82,82,82,82,82,82,82,81,81,81,81,81, 81,81,80,80,80,80,80,79,79,79,79,79,78,78,78,78,78,78,78,78,78, 78,77,77,77,77,77,77,77,77,76,76,76,76,75,75,75,75,74,74,74,74, 73,73,73,73,73,73,72,71,71,71,70,70,70,69,69,69,69,69,69,68,68, 68,68,68,68,68,68,67,67,66,66,66,66,66,66,66,66,66,66,66,65,65, 65,65,65,65,65,64,64,64,64,64,63,63,63,63,63,62,62,62,62,62,62, 61,61,61,61,61,61,61,60,60,60,60,60,60,60,59,59,59,59,59,59,59, 58,58,57,57,57,57,55,54,54,54,54,53,53,53,53,52,52,52,51,51,50, 50,50,50,49,49,48,48,48,48,47,47,47,46,46,46,46,46,46,45,45,44, 44,44,44,44,44,44,44,44,44,43,43,43,43,43,43,42,42,42,42,41,41, 41,41,41,41,40,40,40,40,39,39,39,39,39,39,39,39,39,39,38,38,38, 38,38,38,37,37,37,36,36,36,36,36,35,35,35,35,35,35,35,35,34,34, 34,34,34,33,33,33,32,32,32,32,32,31,31,31,31,31,30,30,30,29,29, 29,29,29,29,28,28,27,27,27,27,27,27,27,27,26,26,26,26,26,25,25, 25,24,24,24,24,23,23,23,23,23,23,23,22,22,22,22,22,21,21,21,21, 21,21,20,20,20,20,20,20,19,19,19,19,19,19,19,18,18,18,17,17,17, 17,17,17,17,17,17,17,17,16,16,16,16,16,16,16,15,15,15,14,14,14, 14,14,14,13,13,13,13,13,13,12,11,11,11,11,10,10,10,10,9,9,9,9, 8,8,8,8,8,7,7,7,6,6,6,6,6,6,5,5,4,4,4,3,3,3,3,3,3,3,3,3,2,2,2, 2,2,2,1,1,1,1 }; const int n4c1w1_t[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,99,99,99,99,98,98,98,98, 98,97,97,97,97,97,97,97,97,96,96,96,95,95,95,94,94,94,93,93,93, 93,93,92,92,92,92,91,91,91,91,90,90,90,90,90,90,90,89,89,88,88, 88,88,88,87,87,87,87,87,86,86,86,86,86,86,86,86,86,86,86,85,85, 84,84,84,84,84,84,83,83,83,82,82,82,82,82,82,81,81,81,81,81,81, 81,81,80,80,80,80,80,80,79,79,79,79,79,79,79,78,78,78,77,76,76, 76,76,76,75,75,75,75,75,74,74,74,74,73,73,73,73,73,72,72,72,72, 71,71,71,71,71,71,71,70,70,70,70,70,70,69,69,69,69,69,69,69,68, 68,68,68,68,67,67,67,67,67,66,65,65,65,65,65,65,64,64,63,63,63, 62,62,62,61,61,61,61,60,60,60,60,60,59,59,59,59,59,58,58,58,58, 58,58,58,58,57,57,57,57,57,57,56,56,56,56,55,55,55,54,54,54,54, 54,54,54,54,54,53,53,53,53,52,52,52,52,52,51,51,51,51,51,51,51, 50,50,50,50,50,50,50,50,50,50,49,49,49,49,49,49,48,48,48,48,47, 47,47,46,46,46,46,46,46,46,46,46,46,45,45,45,45,45,44,44,44,43, 43,43,43,43,43,42,42,42,42,42,41,40,40,40,40,40,40,39,39,39,38, 38,38,38,38,38,38,38,37,37,37,37,37,36,35,35,35,35,34,34,34,34, 34,34,33,33,33,33,32,31,31,31,30,30,30,30,29,29,29,29,29,29,28, 28,28,28,27,27,27,27,27,27,27,27,26,26,26,26,26,26,26,25,25,25, 25,25,24,24,24,24,23,23,23,23,23,23,22,22,21,21,21,21,21,20,20, 20,20,20,20,19,19,18,18,18,18,17,17,17,17,16,16,16,15,15,15,14, 14,14,14,13,13,12,12,12,12,12,12,12,12,12,12,12,11,11,11,11,11, 11,10,10,10,10,9,9,9,9,9,9,9,9,9,9,9,9,8,8,8,8,7,7,7,6,6,6,6, 5,5,5,5,5,5,5,4,4,4,3,3,3,3,3,3,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1, 1,1 }; const int n4c1w2_a[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,98,98,98,98,98,97,97,97,97,97,97, 97,97,97,97,97,96,96,96,96,96,96,96,96,95,95,95,95,95,95,94,94, 94,94,94,94,94,93,93,93,93,92,92,92,92,92,91,91,91,91,91,91,91, 90,90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,89,88,88,88,88, 88,88,88,88,88,88,88,88,87,87,87,87,87,86,86,86,86,86,86,86,86, 86,85,85,85,85,85,85,85,84,84,84,84,84,84,84,83,83,83,83,83,83, 82,82,82,82,82,81,81,81,80,80,80,80,80,80,80,80,80,80,79,79,79, 79,78,78,78,78,78,78,78,77,77,77,77,77,77,77,77,76,76,76,76,75, 74,74,73,73,73,72,72,72,72,72,72,72,71,71,71,71,71,71,71,71,71, 71,71,70,70,70,70,70,70,70,70,70,70,69,69,69,69,68,68,68,68,68, 68,67,67,67,67,67,66,66,66,66,66,65,65,65,65,64,64,64,63,63,63, 63,63,62,62,62,62,62,62,62,62,62,61,61,61,61,61,61,61,61,61,61, 60,60,60,60,60,59,59,58,57,57,57,57,57,57,57,57,56,56,56,56,56, 55,55,55,55,55,55,55,54,54,54,54,54,54,53,53,53,53,53,52,52,52, 52,52,51,51,51,51,51,51,50,50,50,50,50,49,49,49,49,49,49,48,48, 48,48,48,48,48,48,48,48,48,47,47,47,47,47,47,47,47,47,47,47,46, 46,46,46,46,46,45,45,45,45,45,44,44,44,44,44,43,43,43,43,42,42, 42,42,42,42,41,41,41,41,40,40,40,40,40,40,40,39,39,39,38,38,38, 38,38,38,38,38,38,38,38,38,37,37,37,37,37,37,37,37,37,37,37,37, 36,36,36,36,36,36,36,35,35,35,35,35,35,35,34,34,33,33,33,33,33, 33,32,32,32,32,32,32,32,31,31,31,31,31,31,31,31,31,31,30,29,29, 29,29,29,29,29,29,28,28,28,28,28,27,27,27,27,27,27,27,27,27,26, 26,26,26,26,26,26,25,25,25,24,24,24,24,24,24,23,23,23,22,22,22, 22,22,22,21,21,21,21,21,21,21,20,20,20,20,20,20,20,20,20 }; const int n4c1w2_b[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,99,99,99,98,98,98, 98,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,95,95,95,95,94, 94,94,94,93,93,93,93,93,92,92,92,92,92,92,91,91,91,91,91,91,91, 90,90,90,90,90,90,90,90,90,90,90,89,89,89,89,88,88,88,88,88,87, 87,87,87,87,87,87,87,86,86,86,86,85,85,85,85,85,85,84,84,84,84, 83,83,83,83,82,82,82,82,82,82,82,81,81,81,80,80,80,80,80,80,80, 80,80,80,80,79,79,79,79,79,79,79,79,78,78,78,78,78,77,77,77,77, 77,77,77,77,77,76,76,76,76,76,76,75,75,75,75,75,74,74,74,74,74, 74,74,74,74,74,74,74,73,73,73,73,73,72,72,72,72,72,72,72,72,72, 72,72,72,71,71,71,71,71,71,71,70,70,70,70,70,69,69,69,69,69,69, 68,68,68,68,68,68,67,67,67,67,67,67,67,67,67,67,66,66,66,66,66, 65,65,65,65,65,65,64,64,64,64,63,63,63,63,63,62,62,62,62,62,62, 62,61,61,61,61,61,61,61,60,60,60,60,60,60,59,59,59,59,59,59,59, 59,59,58,58,58,58,58,58,58,57,57,57,57,57,57,57,56,56,56,56,56, 56,56,56,55,55,55,55,55,55,54,54,54,54,54,54,54,54,53,53,53,53, 53,52,52,52,52,52,51,51,51,51,51,51,51,51,50,50,50,50,50,50,49, 49,48,48,48,48,48,48,47,47,47,47,47,47,47,47,47,46,46,46,46,46, 46,46,46,45,45,45,44,44,44,44,43,43,43,43,43,43,43,43,42,42,42, 42,42,41,41,41,41,41,40,40,40,40,40,40,39,39,39,39,39,39,39,39, 39,38,38,37,37,37,37,36,36,36,36,36,35,35,35,35,35,35,35,35,34, 34,34,34,33,33,33,33,33,33,33,32,32,32,32,32,31,31,31,31,31,31, 30,30,30,30,30,30,30,30,30,29,29,29,28,28,28,28,28,28,28,28,28, 28,28,27,27,27,27,27,26,26,26,25,25,25,25,25,25,25,25,25,25,24, 24,24,24,24,24,23,23,23,23,23,23,22,22,22,21,20,20,20,20,20,20 }; const int n4c1w2_c[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,99,98,98,98,98,98,98,98, 97,97,97,96,96,96,96,95,95,95,95,94,94,93,93,93,93,93,93,93,93, 93,92,92,92,92,92,91,91,91,91,91,91,91,90,90,90,90,90,89,89,89, 89,89,89,89,89,88,88,88,87,87,86,86,86,86,86,86,86,86,86,86,85, 85,85,85,85,85,85,85,85,84,84,83,83,83,83,83,82,82,82,82,82,82, 82,81,81,80,80,80,80,80,80,80,80,80,80,79,79,79,79,79,79,79,79, 79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,77, 77,76,76,76,76,76,76,76,76,76,76,76,75,75,75,75,75,75,74,74,74, 74,74,74,74,74,74,73,73,73,73,73,72,72,72,71,71,71,71,71,70,70, 70,70,70,70,69,68,68,67,67,67,67,67,67,66,66,66,66,66,66,66,66, 66,66,66,66,65,65,65,65,65,65,65,64,64,64,64,64,64,63,63,63,63, 62,62,62,62,62,61,61,61,60,60,60,60,60,60,60,59,59,59,59,59,59, 59,59,58,58,58,58,58,58,58,57,57,57,57,57,57,57,57,56,56,56,56, 56,56,55,55,55,55,54,54,54,54,54,54,54,54,53,53,53,53,53,53,52, 52,52,52,52,52,52,52,52,52,52,52,52,52,51,51,51,51,50,50,50,50, 50,50,49,49,49,49,49,49,49,49,49,49,48,48,47,47,47,47,47,47,47, 46,46,46,46,46,46,46,45,45,45,45,44,44,44,44,44,44,43,43,43,43, 42,42,42,42,42,41,41,41,41,41,41,41,41,40,40,40,40,40,40,40,40, 40,40,39,39,39,39,39,39,38,38,38,38,37,37,37,37,37,37,37,37,37, 36,36,36,36,36,36,36,36,36,36,35,35,35,35,35,35,35,34,34,34,34, 34,34,34,33,33,33,33,33,32,32,32,31,31,31,31,31,31,31,31,31,31, 31,30,30,30,30,30,30,30,30,30,30,29,29,29,29,29,29,28,28,28,28, 28,28,27,27,27,27,27,27,27,27,26,26,26,26,25,25,25,24,24,24,24, 24,24,23,23,23,23,23,23,22,22,22,21,21,21,21,20,20,20,20 }; const int n4c1w2_d[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,99,99,99,99,98,98,98,98, 98,97,97,97,97,97,97,96,96,96,96,96,96,95,95,95,95,95,95,94,94, 94,94,94,94,94,94,93,93,93,92,92,92,92,92,92,92,91,91,91,91,91, 91,91,90,90,90,90,90,89,89,89,89,89,88,88,88,88,87,87,87,87,87, 86,86,86,86,86,86,86,86,85,85,85,85,85,85,84,84,84,84,84,84,84, 84,84,84,83,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,82,81, 81,81,81,81,80,80,80,80,80,79,79,79,79,79,79,79,79,79,79,78,78, 78,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,75,75,75,75,75, 75,75,75,75,74,74,74,74,74,73,73,73,73,73,72,72,72,72,72,72,71, 71,70,70,70,70,69,69,69,69,69,69,69,69,69,69,69,68,68,68,68,68, 67,67,67,67,66,66,66,66,66,65,65,65,65,65,65,65,65,65,65,64,64, 64,64,64,64,64,63,63,63,63,63,63,63,63,62,62,62,62,62,62,62,61, 61,61,61,61,61,61,61,61,61,60,60,60,60,60,60,59,59,59,59,59,59, 59,59,59,58,58,58,58,58,58,58,58,57,57,57,57,57,57,57,57,56,56, 56,56,55,55,55,55,55,55,54,54,54,54,54,54,54,54,53,53,53,53,53, 52,52,52,52,51,51,51,51,50,50,49,49,49,49,49,49,49,49,49,48,48, 48,48,47,47,47,47,47,47,47,47,47,47,46,46,46,46,45,45,45,45,45, 45,44,44,43,43,43,43,43,43,43,43,42,42,41,41,41,41,41,40,40,40, 40,40,40,39,39,39,39,38,38,38,37,37,37,37,37,37,37,36,36,36,36, 36,36,36,36,36,36,36,36,35,35,35,34,34,34,34,34,33,33,32,32,32, 32,32,32,32,31,31,31,30,30,30,30,29,29,29,29,29,29,29,29,29,28, 28,28,28,28,28,28,28,28,28,27,27,27,27,27,27,26,26,26,26,26,26, 26,26,26,25,25,25,25,25,24,24,24,24,24,23,23,23,22,22,22,22,22, 22,22,22,22,21,21,21,21,21,20,20,20,20,20,20,20,20,20,20 }; const int n4c1w2_e[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,98,98,98,98,98,98,98,98, 98,98,97,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,95,95, 95,95,95,94,94,94,94,93,93,93,93,93,92,92,92,92,92,92,91,91,91, 91,91,91,90,90,90,90,90,90,90,90,90,89,89,89,88,88,88,88,87,87, 87,87,87,87,86,86,86,86,85,85,85,85,85,85,84,84,84,83,83,83,83, 82,82,82,82,82,82,82,81,81,81,81,81,81,81,81,81,81,81,81,81,81, 81,81,81,80,80,80,80,79,79,79,78,78,78,78,77,77,77,77,76,76,76, 76,75,75,75,75,75,74,74,74,74,74,74,74,74,73,73,73,73,73,73,72, 72,72,72,72,71,71,71,71,70,70,70,70,70,69,69,69,69,69,69,68,68, 68,68,68,68,68,68,68,68,68,67,67,67,67,67,66,66,66,66,65,65,65, 65,65,65,64,64,64,64,64,64,64,64,64,64,64,64,64,64,63,63,63,63, 63,62,62,62,62,61,61,61,61,61,61,61,61,61,60,60,59,59,59,59,59, 58,58,58,58,58,58,57,57,57,57,57,56,56,56,56,55,55,55,55,55,55, 55,54,54,54,53,53,53,53,53,53,53,53,52,52,52,52,52,52,52,52,52, 52,51,51,51,51,51,51,50,50,50,50,50,50,50,49,49,48,48,48,48,48, 48,47,47,47,47,47,47,47,46,46,46,46,46,46,46,45,45,45,45,45,45, 45,45,45,45,44,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,41, 41,41,41,41,41,41,41,40,40,40,40,40,40,40,40,40,39,39,39,39,39, 39,39,39,38,38,38,37,37,37,37,37,37,37,37,37,36,36,36,36,36,36, 35,35,35,35,35,35,35,35,35,34,33,33,33,33,33,33,33,33,33,33,32, 32,32,32,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,29, 29,28,28,28,28,27,27,27,27,27,27,27,27,26,26,26,26,26,25,25,25, 25,25,25,25,25,25,24,24,24,24,24,24,23,23,23,23,23,23,23,23,22, 22,22,22,22,22,22,21,21,21,21,21,20,20,20,20,20,20,20,20 }; const int n4c1w2_f[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,99,99,98,98,98,98, 98,98,97,97,97,97,97,97,97,96,96,96,96,96,96,96,95,95,95,95,94, 94,94,94,93,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,92, 91,91,91,91,91,91,90,90,90,90,89,89,89,89,89,89,89,88,88,88,88, 88,88,88,87,87,87,87,87,86,86,86,86,86,86,86,86,85,85,85,85,85, 85,84,84,84,84,84,84,84,84,83,83,83,82,82,82,82,82,82,81,81,80, 80,80,80,79,79,79,79,79,79,79,79,79,79,78,78,78,78,77,77,76,76, 76,76,76,76,76,76,76,76,75,75,75,75,75,75,75,74,74,74,74,74,74, 74,73,73,73,73,73,72,72,72,72,72,72,72,72,71,71,71,71,71,71,71, 70,70,70,70,70,70,70,69,69,69,69,69,69,69,69,68,68,68,68,68,67, 67,67,67,67,66,66,66,66,66,66,66,65,65,65,65,65,65,65,64,64,64, 64,64,64,64,64,64,64,63,63,63,63,63,63,62,62,62,62,62,61,61,61, 61,61,61,60,60,60,60,60,60,60,59,59,59,59,59,59,59,59,59,59,58, 58,58,57,57,57,57,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55, 55,55,55,54,54,54,54,53,53,53,53,53,53,52,52,52,52,51,51,51,51, 51,51,51,51,51,51,50,50,50,50,50,49,49,49,48,48,48,48,48,48,47, 47,47,47,47,46,46,46,46,46,45,45,45,45,44,44,44,44,43,43,43,43, 43,43,43,43,43,43,42,42,42,42,42,42,42,42,42,41,41,41,41,41,41, 41,40,40,40,40,40,40,40,40,39,39,39,39,39,38,38,38,38,38,38,38, 38,37,37,37,37,37,37,37,37,37,36,36,36,35,35,35,35,35,35,34,34, 33,33,33,33,33,33,33,33,33,32,32,32,32,32,31,31,31,31,31,31,31, 31,31,31,31,31,31,30,30,30,30,30,30,30,29,29,29,28,28,28,28,28, 28,27,27,27,26,26,26,26,26,25,25,25,25,24,24,24,24,24,23,23,23, 23,23,22,22,22,22,21,21,21,20,20,20,20,20,20,20,20,20,20,20 }; const int n4c1w2_g[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,99,99,99,99,98,98,98,98,98,98,97, 97,97,97,97,97,96,96,96,96,96,95,95,95,95,95,95,95,95,95,94,94, 94,94,94,94,94,93,93,93,93,93,93,92,92,92,92,92,92,91,91,91,90, 90,90,90,90,90,89,89,89,89,89,89,89,88,88,88,88,88,87,87,87,86, 86,86,86,85,85,85,85,85,85,84,84,84,83,83,82,82,82,82,82,82,82, 82,81,81,81,81,81,81,81,81,80,80,80,80,80,80,80,80,80,80,80,79, 79,79,79,79,78,78,78,78,78,78,77,77,76,76,76,76,76,76,76,75,75, 75,75,75,75,75,75,74,74,74,74,74,74,74,73,73,73,73,73,73,72,72, 72,72,72,72,72,72,71,71,71,71,70,70,70,70,70,70,70,69,69,69,68, 68,68,68,67,67,67,67,66,66,66,66,66,66,66,66,66,65,65,65,65,65, 65,65,64,64,64,64,64,63,63,63,63,62,62,62,62,62,62,61,61,61,61, 61,61,60,60,60,59,59,59,59,59,59,59,59,58,58,58,58,58,58,58,57, 57,57,56,56,56,56,56,55,55,55,55,55,55,55,55,55,55,55,54,54,54, 54,54,54,53,53,53,53,53,53,52,52,52,52,52,52,51,51,51,51,50,50, 50,50,50,50,49,49,49,49,49,49,49,49,49,48,48,48,48,48,48,48,48, 48,47,47,46,46,46,46,45,45,45,45,45,45,45,45,45,45,44,44,44,44, 44,44,44,43,43,43,43,43,43,42,42,42,42,42,42,42,42,41,41,41,41, 41,41,41,41,41,40,40,40,40,40,40,40,40,39,39,39,39,38,38,38,38, 38,38,37,37,37,37,37,37,37,37,36,36,36,36,36,36,36,35,35,35,35, 35,35,35,35,35,35,35,34,34,34,34,34,34,34,34,34,34,34,33,33,33, 33,33,33,33,33,33,33,32,32,32,31,31,31,31,31,31,30,30,30,30,30, 30,30,29,29,29,29,29,29,29,29,28,28,28,28,28,28,27,27,27,26,26, 26,26,26,26,26,25,25,25,25,25,25,24,24,24,24,24,23,23,23,22,22, 22,22,22,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20 }; const int n4c1w2_h[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,98,98,98,97,97,97,97,97,97,96,96, 96,96,96,96,95,95,95,95,95,95,95,95,95,95,94,94,94,94,94,94,94, 94,94,93,93,93,93,92,92,92,92,92,92,91,91,91,91,91,90,90,90,90, 90,89,89,89,89,89,88,88,88,88,88,87,87,87,87,86,86,86,86,85,85, 85,85,85,85,84,84,84,84,84,84,83,83,83,83,83,83,83,83,82,82,82, 82,82,82,82,82,81,81,81,80,80,80,80,80,80,80,79,79,79,79,78,78, 78,77,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,75,75,75,75, 75,75,75,75,74,74,74,74,74,73,73,73,73,73,72,72,72,72,72,72,71, 71,71,71,71,70,70,70,70,70,70,70,70,69,69,69,69,69,69,69,69,68, 68,68,68,68,68,68,68,68,68,67,67,67,67,67,67,67,67,66,66,66,66, 66,66,66,65,65,65,65,65,65,64,64,64,64,64,64,64,64,63,63,63,63, 63,63,62,62,62,62,62,62,61,61,61,61,61,60,60,60,60,60,60,59,59, 59,59,59,59,59,59,59,58,58,58,58,58,58,58,58,58,58,58,57,57,56, 56,56,56,56,56,56,56,56,55,55,55,55,55,55,54,54,53,53,53,53,53, 53,52,52,52,52,52,52,51,51,51,51,51,51,51,50,50,50,50,49,49,49, 49,49,49,49,49,49,49,49,49,48,48,48,48,48,48,48,48,48,47,47,47, 46,46,46,46,46,46,46,46,45,45,45,45,45,45,45,44,44,44,44,44,44, 44,44,43,43,43,43,42,42,42,42,42,41,41,41,41,41,41,41,41,41,41, 41,40,40,39,39,39,39,39,39,39,38,38,38,38,38,38,37,37,37,37,37, 37,37,36,36,36,36,35,35,35,35,35,34,34,34,34,33,33,33,33,33,33, 33,33,33,33,33,32,32,32,32,32,32,31,31,31,31,31,30,30,30,30,30, 30,30,30,30,30,29,29,29,29,29,29,28,28,28,27,27,27,27,27,27,26, 26,26,26,26,26,26,26,26,25,25,25,25,25,24,24,24,23,23,23,23,23, 22,22,22,22,22,22,22,21,21,21,20,20,20,20,20,20,20,20,20 }; const int n4c1w2_i[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,98,98,98,98,97,97,97,97,96,96,96, 96,96,96,96,96,96,95,95,95,95,95,94,94,94,94,94,94,94,93,93,93, 93,93,92,92,92,92,92,92,92,91,91,91,91,91,90,90,90,90,89,89,89, 89,89,89,89,89,89,89,89,89,89,89,88,88,87,87,87,87,87,86,86,86, 86,86,86,86,86,86,85,85,85,85,85,84,84,84,84,84,83,83,83,83,82, 82,82,82,82,82,82,82,81,81,81,81,81,81,80,80,80,80,80,79,79,79, 79,79,79,79,79,79,79,78,78,78,78,77,77,77,77,77,76,76,76,76,76, 75,75,75,75,75,75,75,75,75,75,75,74,74,74,74,73,73,73,73,73,73, 73,72,72,72,72,72,72,72,71,71,71,71,71,71,71,71,70,70,70,70,69, 69,69,69,69,69,69,68,68,68,68,67,67,67,66,66,66,66,66,66,65,65, 64,64,64,64,64,64,64,64,63,63,63,63,63,63,63,63,63,62,62,62,62, 61,61,61,61,61,61,60,60,60,60,59,59,59,59,59,59,59,58,58,58,58, 57,57,57,57,57,56,56,56,56,56,56,56,56,56,55,55,55,55,55,55,54, 54,54,54,54,53,53,53,53,53,53,53,53,52,52,52,52,52,52,52,51,51, 50,50,50,50,49,49,49,49,49,49,48,48,48,48,48,47,47,46,46,46,46, 46,46,46,45,45,45,45,45,45,45,45,45,44,44,44,43,43,43,43,43,43, 43,43,43,43,42,42,42,42,41,41,41,41,40,39,39,39,39,39,39,39,39, 39,38,38,38,38,37,37,37,37,37,37,37,37,37,37,36,36,36,36,35,35, 35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,34,34,33,33,33,33, 33,33,33,33,33,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,31, 31,31,31,31,31,30,30,30,30,30,29,29,29,28,28,28,28,28,28,27,27, 27,27,27,27,26,26,26,26,26,26,26,25,25,25,25,25,25,25,25,25,25, 25,25,25,24,24,24,24,24,24,24,24,24,24,23,23,23,23,23,23,23,23, 22,22,22,22,22,22,22,21,21,21,21,21,20,20,20,20,20,20,20 }; const int n4c1w2_j[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,99,99,99,98,98,98,98,98,97,97,97, 97,97,97,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95, 95,94,94,94,94,94,94,93,93,93,93,93,93,93,92,92,92,92,92,92,91, 91,91,91,91,91,91,90,90,90,90,90,90,89,88,88,88,88,88,88,88,87, 87,87,87,87,87,87,86,86,86,86,86,85,85,85,85,84,84,84,84,84,83, 83,83,83,83,82,82,82,82,82,82,82,82,82,82,82,82,81,81,81,81,81, 80,80,80,80,80,79,79,79,79,79,79,79,79,79,79,79,78,78,78,78,77, 77,77,77,77,77,77,76,76,76,76,76,76,75,75,75,75,74,74,74,74,74, 73,73,73,73,73,73,73,73,72,72,72,71,71,71,71,71,71,71,71,70,70, 70,70,69,69,69,69,68,68,68,68,68,68,68,67,67,67,67,67,66,66,66, 66,66,65,65,65,65,65,65,65,65,65,64,64,64,64,64,64,64,64,64,64, 64,63,63,63,62,62,62,62,62,62,62,61,61,61,60,60,60,60,60,59,59, 59,59,59,59,58,58,58,58,57,57,57,57,57,56,56,56,56,56,56,56,55, 54,54,54,54,54,54,54,54,54,54,53,53,53,53,53,53,53,52,52,52,52, 52,51,51,51,51,51,51,51,50,50,50,50,50,50,49,49,49,49,48,48,48, 47,47,47,46,46,46,46,46,46,46,46,45,45,45,45,45,45,44,43,43,43, 43,43,43,43,42,42,42,42,42,41,41,41,41,41,41,41,41,41,41,41,40, 40,40,40,40,40,40,40,40,39,39,39,39,39,39,39,39,39,39,39,38,38, 38,38,38,38,38,37,37,37,37,37,36,36,36,36,36,36,35,35,35,35,35, 34,34,34,34,34,34,33,33,33,33,33,32,32,32,32,32,32,32,31,31,31, 31,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30,29, 29,29,29,29,29,28,28,28,28,28,28,28,28,28,28,27,27,27,27,26,26, 26,26,26,25,25,25,25,25,25,25,25,25,24,24,24,24,24,24,23,23,22, 22,22,22,22,22,22,22,21,21,21,21,21,20,20,20,20,20,20,20 }; const int n4c1w2_k[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,97,97, 97,97,97,97,97,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,94, 93,93,93,93,93,92,92,92,92,92,92,91,91,91,91,90,90,90,90,90,90, 89,89,89,89,89,89,89,89,88,88,88,88,88,88,88,88,88,88,87,87,87, 87,87,87,86,86,86,86,86,86,86,85,85,84,84,84,84,84,84,84,84,83, 83,83,83,82,82,82,82,82,82,82,82,81,81,81,81,81,81,80,80,80,80, 80,80,79,79,79,79,79,78,78,78,78,78,78,77,77,77,77,77,77,77,77, 76,76,76,76,75,75,75,75,75,75,75,75,74,74,74,74,74,74,73,73,73, 73,73,73,73,73,73,72,72,72,71,71,71,71,71,71,71,71,70,70,70,70, 70,70,69,69,69,69,69,69,69,69,68,68,68,68,68,67,67,67,67,67,67, 67,67,67,66,66,66,66,66,66,65,65,65,65,65,65,65,64,64,64,64,64, 63,63,63,63,63,63,62,62,61,61,61,61,61,61,61,60,60,60,60,60,60, 59,59,59,59,59,59,59,59,58,58,58,58,58,58,58,57,57,57,57,57,57, 56,56,56,56,55,55,55,55,55,55,55,55,55,54,54,54,54,53,53,53,52, 52,52,52,52,52,51,51,51,51,51,51,51,51,51,51,50,50,50,49,49,48, 48,48,48,47,47,47,47,47,47,46,46,46,45,45,45,45,45,45,45,45,45, 44,44,44,44,44,44,44,43,43,43,43,43,43,43,43,43,42,42,42,42,41, 41,41,41,41,40,40,40,39,39,39,39,39,39,38,38,38,38,38,38,38,38, 37,37,37,36,36,36,36,36,36,36,36,35,35,35,35,35,35,35,35,35,35, 34,34,34,34,34,33,33,33,33,33,33,33,33,33,33,33,33,33,32,32,32, 32,32,32,32,32,31,31,31,31,31,30,30,30,30,30,30,30,30,30,30,30, 29,29,29,29,29,29,29,29,29,29,29,28,28,28,28,27,27,27,26,26,25, 25,25,25,25,25,25,25,25,25,24,24,24,24,24,24,24,24,24,24,24,23, 23,23,23,22,22,22,22,22,22,22,22,22,21,21,21,21,20,20,20,20 }; const int n4c1w2_l[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,98, 98,98,98,98,98,97,97,97,97,97,97,97,96,96,96,96,96,96,95,95,95, 95,95,95,95,95,94,94,94,93,93,93,92,92,92,91,91,91,91,91,91,90, 90,90,90,89,89,89,89,89,89,89,89,88,88,88,88,88,88,88,88,88,88, 87,87,87,86,86,86,86,86,86,86,85,85,85,85,85,85,85,84,84,84,84, 84,84,84,84,84,83,83,83,83,83,83,83,83,83,83,82,82,82,82,82,82, 81,81,81,81,81,81,81,80,80,80,79,79,78,78,78,78,78,78,78,78,78, 77,77,77,77,77,77,77,77,77,76,76,76,75,75,74,74,74,74,74,74,73, 73,73,73,73,73,72,72,72,72,71,71,71,71,71,71,71,70,70,70,70,69, 69,69,69,69,69,69,69,68,68,68,68,68,68,68,68,67,67,67,66,66,66, 66,65,65,65,65,65,65,65,65,64,64,64,64,64,63,63,63,63,63,63,62, 62,62,62,62,62,62,62,62,61,61,61,61,61,61,61,60,60,60,60,60,60, 60,60,60,59,59,59,59,58,58,58,58,58,58,58,58,57,57,57,57,57,57, 57,57,57,57,56,56,56,56,56,56,56,56,56,56,56,56,55,55,55,54,54, 54,53,53,53,53,53,53,52,52,52,52,52,52,52,52,51,51,51,51,51,51, 50,50,50,50,50,50,49,49,49,49,49,49,48,48,48,48,48,47,47,47,47, 47,47,46,46,46,46,46,46,45,45,45,45,45,45,45,44,44,44,44,44,44, 43,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42,41,41,40,40, 40,39,39,39,39,39,39,39,39,39,38,38,38,38,38,38,38,38,38,37,37, 37,36,36,36,36,36,35,35,35,35,35,35,34,34,34,34,34,33,33,33,33, 33,33,33,33,32,32,31,31,31,31,30,30,30,30,30,29,29,29,29,29,29, 29,28,28,28,28,28,27,27,27,27,27,27,27,27,26,26,26,26,26,26,25, 25,25,25,25,25,25,24,24,24,24,24,24,23,23,23,23,23,23,23,22,22, 22,22,22,22,22,22,22,21,21,21,21,21,21,21,21,20,20,20,20,20,20 }; const int n4c1w2_m[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,98, 98,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,97,96,96,96, 96,95,95,95,95,95,95,95,95,94,94,94,94,94,94,94,93,93,92,92,92, 92,92,91,91,91,91,91,91,91,90,90,90,90,89,89,89,89,88,88,88,88, 88,87,87,87,87,86,86,86,86,85,85,85,85,85,84,84,84,83,83,83,83, 83,83,83,82,82,82,82,82,82,81,81,81,81,81,81,81,81,81,80,80,80, 80,80,79,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,78, 78,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,75,75,75,75,74, 74,74,74,74,73,73,73,73,73,72,72,72,72,72,72,72,72,72,72,71,71, 71,71,71,70,70,70,70,70,69,69,69,69,69,69,69,68,68,68,68,68,68, 68,68,68,68,68,68,67,67,67,67,67,66,66,66,66,66,66,66,66,65,65, 65,65,65,65,65,64,64,64,64,64,64,63,63,63,63,63,63,63,63,63,63, 62,62,62,62,62,62,62,61,61,61,61,61,61,61,61,61,60,60,60,60,60, 59,59,59,59,59,59,59,59,58,58,58,58,57,57,57,57,56,56,56,56,56, 56,55,55,55,54,54,53,53,53,53,53,53,53,53,53,53,52,52,52,52,52, 51,51,51,51,50,50,50,50,50,50,49,49,49,49,48,48,48,48,48,48,47, 47,47,47,47,47,47,46,46,46,46,46,46,46,46,46,46,46,46,46,45,45, 45,45,45,45,44,44,44,44,44,44,44,44,43,43,43,43,43,43,43,42,42, 42,42,42,42,42,42,41,41,41,40,40,40,40,40,39,39,39,39,38,38,38, 37,37,37,37,37,36,36,36,36,36,36,35,35,35,35,35,35,35,34,34,34, 33,33,33,33,33,33,32,32,32,32,32,32,31,31,31,31,31,31,31,30,30, 30,30,30,30,30,30,30,30,30,30,29,29,29,29,28,28,28,28,28,28,28, 28,28,27,27,27,27,27,27,26,26,25,25,25,25,24,24,24,24,24,24,24, 23,23,23,22,22,22,22,22,22,22,21,21,21,21,21,21,20,20,20,20 }; const int n4c1w2_n[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,98,98, 98,98,98,98,98,97,97,97,97,97,97,96,96,96,96,96,96,96,95,95,95, 95,95,95,94,94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,92,92, 92,92,92,92,92,92,91,91,91,91,91,91,91,90,90,90,90,90,90,90,90, 89,89,89,89,89,89,89,89,89,88,88,88,88,88,88,88,87,87,87,87,87, 87,86,86,86,86,85,85,85,85,85,85,85,85,85,84,84,84,84,84,83,83, 83,83,82,81,81,81,81,81,80,80,80,80,79,79,79,79,79,79,79,78,78, 78,78,78,77,77,77,77,76,76,76,76,76,76,75,75,75,75,74,74,73,73, 73,73,73,72,72,72,72,72,72,71,71,71,71,71,70,70,70,70,70,70,69, 69,69,69,69,68,68,68,68,68,68,68,67,67,67,66,66,66,66,66,66,66, 66,65,65,64,64,63,63,63,63,63,63,63,63,63,63,63,62,62,62,62,61, 61,61,61,61,61,61,60,60,60,60,59,59,59,59,59,58,58,58,58,58,57, 57,57,57,57,57,56,56,56,56,56,56,56,56,55,55,55,55,55,55,55,55, 54,54,54,54,54,54,53,53,53,53,53,53,53,53,53,52,52,52,52,52,52, 52,52,52,52,51,51,51,51,51,51,51,50,50,50,50,50,50,50,50,49,49, 49,49,49,49,49,49,48,48,48,48,47,47,46,46,46,45,45,45,45,44,44, 44,44,44,44,44,44,44,44,44,43,43,43,42,42,42,42,42,42,42,41,41, 41,41,41,41,41,41,40,40,40,40,40,40,40,40,39,39,39,39,39,39,38, 38,38,38,38,38,38,38,38,38,37,37,37,37,37,37,37,36,36,36,36,36, 35,35,35,34,34,34,34,34,34,34,34,34,33,33,33,33,33,33,33,33,32, 32,32,32,32,32,32,32,31,31,31,31,31,31,31,31,30,30,30,30,30,30, 30,30,30,30,29,29,29,29,29,29,29,28,28,28,28,27,27,27,26,26,26, 26,26,26,26,25,25,25,25,25,24,24,24,24,24,23,23,23,23,23,22,22, 22,22,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20,20,20,20 }; const int n4c1w2_o[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,99,98,98,98,98,98, 98,97,97,97,97,97,97,96,96,96,96,96,96,96,95,95,95,95,95,95,95, 95,94,94,94,94,93,93,93,93,93,92,92,91,91,91,91,91,91,91,90,90, 90,89,89,89,89,89,89,89,88,88,88,88,88,88,88,88,88,88,87,87,87, 87,87,86,86,86,86,86,86,86,86,86,86,86,86,85,85,85,85,85,85,84, 84,84,84,84,84,84,84,84,84,84,84,83,83,83,83,83,83,83,82,82,82, 82,81,81,81,81,81,81,81,81,81,81,80,80,80,80,80,80,79,79,79,78, 78,78,78,78,78,77,77,77,77,77,77,76,76,76,76,76,76,76,75,75,75, 75,75,75,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73,72,72,72, 71,71,71,71,71,71,71,71,71,69,69,68,68,68,68,68,68,68,68,68,67, 67,66,66,66,65,65,65,65,65,64,64,64,64,64,64,64,64,63,63,63,63, 63,63,62,62,62,62,62,62,62,61,61,61,61,61,61,61,61,60,60,60,60, 60,60,60,60,60,59,59,59,59,58,58,58,58,58,58,57,57,57,57,57,57, 56,56,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,54,54,54,54, 53,53,53,53,53,53,53,52,52,52,52,52,52,52,52,51,51,51,51,51,50, 50,50,50,50,50,49,49,49,49,49,48,48,48,48,48,47,47,47,47,47,47, 47,47,47,47,47,47,47,46,46,46,46,46,46,45,45,45,45,45,45,45,44, 44,44,44,44,44,44,43,43,43,42,42,42,42,42,42,42,41,40,40,40,40, 40,40,39,39,39,39,39,39,38,38,38,38,38,37,37,37,37,37,36,36,36, 36,36,36,35,35,35,35,34,34,34,34,33,33,33,32,32,32,32,32,32,32, 32,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,29,29, 29,29,29,29,29,29,29,29,29,29,28,28,28,28,28,28,27,27,27,27,27, 27,27,26,26,26,26,26,25,25,25,25,25,25,25,25,24,24,24,24,24,23, 23,23,23,22,22,22,22,21,21,21,21,21,21,21,21,20,20,20,20,20 }; const int n4c1w2_p[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,98,98,98,98,98,98,98,98,98,98,97, 97,97,97,96,96,96,96,95,95,95,95,95,95,94,94,94,94,94,94,94,94, 94,94,94,94,93,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,91, 91,91,91,90,90,90,90,89,89,89,89,89,89,88,88,88,87,87,87,87,86, 86,86,86,85,85,84,84,84,84,84,84,84,84,84,84,83,83,83,83,83,83, 83,83,82,82,82,82,82,82,81,81,81,81,81,81,80,80,80,80,80,80,80, 80,79,79,79,79,79,78,78,78,77,77,77,77,77,77,77,76,76,76,76,76, 75,75,75,75,74,74,74,74,74,73,73,73,73,73,73,73,73,73,73,72,72, 72,72,72,72,72,72,72,71,71,71,71,71,71,71,70,70,70,70,70,70,70, 70,70,69,69,69,69,69,69,69,69,69,69,69,68,68,68,68,68,67,67,67, 67,67,67,66,66,66,66,65,65,65,65,65,65,65,64,64,64,64,64,63,63, 63,63,63,63,62,62,62,62,62,62,62,61,61,61,61,61,61,61,61,61,60, 60,60,60,60,60,59,59,59,59,59,58,58,58,58,58,58,57,57,57,57,57, 57,57,57,57,56,56,56,56,56,56,55,55,54,54,54,54,54,54,54,54,54, 54,54,54,53,53,53,53,53,53,52,52,52,52,51,51,51,51,51,51,50,50, 50,50,49,49,49,48,48,48,48,48,48,48,48,48,48,47,47,47,47,47,46, 46,46,46,46,46,46,46,45,45,45,45,45,45,45,45,44,44,44,43,43,43, 43,43,43,43,42,42,42,42,42,42,42,41,41,41,41,41,41,41,40,40,40, 40,40,40,39,39,39,39,39,39,39,39,39,38,38,38,38,38,38,37,37,37, 37,37,37,37,37,37,37,36,36,36,36,36,36,36,35,35,34,34,34,34,34, 34,33,33,33,33,32,32,32,32,32,31,31,31,31,31,31,31,30,30,30,30, 30,30,30,30,30,30,29,29,29,29,29,29,28,28,28,28,28,27,27,27,27, 27,27,26,26,26,26,26,25,25,25,25,25,25,25,25,24,24,24,23,23,23, 23,23,23,22,22,21,21,21,21,21,21,20,20,20,20,20,20,20,20 }; const int n4c1w2_q[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,99,99,99,99,99,98,98,98,98, 97,97,97,97,97,97,96,96,96,96,96,96,96,96,95,95,95,94,94,94,94, 94,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,92,91,91,91, 91,91,91,91,91,90,90,90,90,90,89,89,89,89,89,89,89,89,89,89,88, 88,88,88,87,87,87,87,87,86,86,86,86,86,86,85,85,85,85,84,84,84, 84,84,84,84,84,83,83,82,82,82,82,82,82,82,81,81,81,81,81,81,81, 80,80,80,80,80,80,80,80,79,79,79,79,79,79,79,78,78,78,78,77,77, 77,77,77,77,77,77,76,76,76,76,76,76,76,76,76,76,75,75,75,75,74, 74,74,74,74,74,74,74,74,74,74,74,73,73,73,73,73,72,72,72,72,72, 71,71,71,71,71,71,71,71,71,71,71,70,70,70,70,70,70,69,69,69,69, 69,68,68,68,68,68,67,67,67,66,66,66,66,66,66,66,66,65,65,65,65, 65,65,65,65,64,64,64,63,63,63,62,62,62,62,61,61,61,61,61,61,61, 61,61,60,60,60,60,59,59,59,59,59,59,59,58,58,57,57,57,57,57,57, 57,57,57,57,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,55,54, 54,54,54,54,54,54,54,54,53,53,53,53,53,52,52,52,51,51,51,51,50, 50,50,50,50,50,50,50,50,50,49,49,49,48,48,48,48,48,48,48,48,47, 47,47,46,46,46,46,46,46,46,46,45,45,45,45,45,45,45,44,44,44,44, 44,44,44,44,44,43,43,42,42,42,42,42,41,41,41,41,41,41,40,40,40, 40,40,40,40,40,39,39,39,39,39,39,39,39,39,38,38,38,37,37,37,37, 37,37,36,36,36,36,36,36,36,35,35,35,35,34,34,34,34,34,34,34,34, 34,34,33,33,33,33,33,32,32,32,31,31,31,31,31,31,31,30,30,30,30, 30,30,29,29,29,29,29,28,28,28,28,28,28,28,27,27,27,27,27,26,26, 26,26,26,26,25,25,25,25,24,24,24,24,24,24,24,23,23,23,23,23,23, 23,22,22,22,22,22,22,22,21,21,21,21,20,20,20,20,20,20,20,20 }; const int n4c1w2_r[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,99, 99,99,99,98,98,98,98,98,97,97,97,96,96,96,96,96,96,96,96,96,96, 96,95,95,95,94,94,93,93,93,93,93,93,93,92,92,92,92,92,92,92,91, 91,91,90,90,90,89,89,89,89,89,89,89,89,89,89,89,88,88,88,88,88, 88,88,88,88,87,87,87,87,87,87,87,87,86,86,86,86,86,86,86,86,85, 85,85,84,84,84,84,84,83,83,83,83,83,83,83,83,82,82,82,82,82,82, 81,81,81,80,80,80,80,80,79,79,79,79,78,78,78,78,78,78,78,78,78, 78,78,77,77,77,77,77,77,77,76,76,76,76,75,75,75,75,75,75,75,75, 75,74,74,74,74,74,74,74,74,73,73,73,73,73,73,72,72,72,72,71,71, 71,71,71,70,70,70,70,70,70,70,70,69,69,69,69,69,69,69,68,68,68, 68,68,67,67,67,67,67,67,67,67,67,67,66,66,66,66,65,65,65,65,65, 65,65,64,64,64,64,64,64,64,64,64,63,63,63,63,62,62,62,62,62,61, 61,61,61,60,60,60,60,59,59,59,59,59,58,58,58,58,58,58,58,58,58, 58,58,57,57,57,57,56,56,56,56,56,56,56,55,55,55,55,55,54,54,54, 54,53,53,52,52,52,52,52,52,52,52,51,51,51,51,51,51,50,50,50,50, 49,49,49,49,49,49,49,49,49,49,49,49,48,48,48,48,48,48,48,47,47, 46,46,46,46,46,46,46,46,46,46,46,45,45,44,44,44,44,44,44,43,43, 43,43,43,43,43,43,43,42,42,42,42,42,42,42,42,42,42,41,41,41,41, 40,40,40,40,40,40,40,40,39,39,39,39,38,38,38,38,38,38,37,37,37, 37,37,37,36,36,36,36,36,35,35,35,35,35,34,34,34,34,34,34,34,33, 33,33,33,33,33,33,33,32,31,31,31,31,30,30,30,30,30,30,30,29,29, 29,29,29,29,29,29,28,28,28,28,27,27,27,27,27,26,26,26,26,26,26, 25,25,25,25,25,25,25,24,24,24,24,24,24,23,22,22,22,22,22,22,22, 22,22,21,21,21,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20 }; const int n4c1w2_s[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,99,99,98,98,98,98,98,98, 98,98,98,98,97,97,97,97,97,97,97,97,96,96,96,95,95,95,95,95,94, 94,94,94,94,93,93,93,93,93,93,93,93,92,92,92,92,91,91,91,91,91, 91,91,91,91,90,90,90,89,89,89,89,89,89,89,89,89,89,89,89,89,89, 88,88,88,88,88,87,87,87,87,87,87,87,86,86,86,85,85,85,85,85,85, 85,85,85,84,84,84,84,84,84,83,83,83,83,83,83,83,83,83,83,82,82, 82,82,82,82,82,81,81,80,80,79,79,79,79,79,79,78,78,78,77,77,77, 77,76,76,76,76,76,75,75,74,74,73,73,73,73,73,73,73,73,73,72,72, 72,72,72,72,72,71,71,71,71,70,70,70,69,69,69,69,69,69,69,69,69, 68,68,68,68,68,68,68,68,68,68,68,67,67,67,67,66,66,66,66,66,65, 65,65,65,65,65,65,65,64,64,64,64,64,63,63,63,63,63,63,63,63,63, 63,63,62,62,62,62,62,62,62,61,61,61,61,61,60,60,59,59,59,59,59, 59,59,59,58,58,58,58,58,58,58,57,57,57,57,57,57,57,57,57,57,56, 56,56,56,56,56,56,55,55,55,55,55,55,54,54,54,54,54,54,54,53,53, 53,53,52,52,52,52,52,51,51,51,51,51,50,50,50,49,49,49,49,48,47, 47,47,47,47,46,46,46,46,45,45,45,45,45,45,45,44,44,44,44,44,44, 44,44,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42,42,41,41, 41,41,41,40,40,40,40,40,40,40,40,39,39,39,39,39,39,39,39,39,39, 39,38,38,38,38,38,38,38,38,38,38,38,38,37,37,37,37,37,37,36,36, 36,36,36,36,36,36,35,35,35,35,35,35,35,34,34,34,34,33,33,33,33, 33,32,32,32,32,32,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30, 29,29,29,29,29,29,29,28,28,28,28,28,28,28,28,27,27,27,27,27,27, 26,26,26,26,26,26,26,26,26,25,25,25,25,25,25,25,25,24,24,24,24, 23,23,23,23,23,23,23,22,22,22,22,21,21,21,21,21,20,20,20 }; const int n4c1w2_t[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,99,98,98,98, 98,98,98,98,97,97,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95, 95,95,94,94,94,94,94,93,93,93,93,93,93,93,92,92,92,92,92,92,92, 91,91,91,91,91,91,90,90,90,90,90,90,89,89,89,89,89,89,89,89,89, 89,88,88,87,87,87,87,87,86,86,86,86,85,85,85,84,84,84,84,84,83, 83,83,83,83,83,83,82,82,82,81,80,80,80,80,80,80,80,80,80,80,79, 79,79,79,79,78,78,78,78,78,78,78,77,77,77,76,76,76,76,76,76,76, 76,75,75,75,75,75,75,75,74,74,74,74,74,74,74,74,74,74,74,74,73, 73,73,73,73,73,73,72,72,72,72,72,72,72,72,72,71,71,71,71,71,71, 71,70,70,70,70,70,70,69,69,69,69,69,69,69,68,68,68,67,67,67,67, 67,67,67,67,66,66,66,65,65,65,65,65,65,65,65,65,64,64,64,64,64, 64,63,63,63,63,62,62,62,62,62,62,62,61,61,61,61,61,61,61,61,61, 60,60,60,60,60,60,60,60,59,59,59,59,59,59,59,58,58,58,58,57,57, 57,57,57,56,56,55,55,55,55,55,55,55,55,55,54,54,54,54,54,54,54, 54,53,53,53,53,53,53,53,53,52,52,52,52,51,51,51,51,51,51,51,51, 51,50,50,50,50,50,50,50,49,49,49,49,49,49,49,48,48,48,48,47,47, 47,47,47,47,47,46,46,46,46,46,46,46,45,45,45,45,45,45,45,45,45, 45,45,45,44,44,44,44,44,44,44,44,43,43,43,43,43,43,43,43,42,42, 42,42,42,42,41,41,41,41,41,41,40,40,40,40,40,39,39,39,39,39,38, 38,38,38,38,38,37,37,36,36,36,36,36,36,36,36,36,36,35,35,35,34, 34,34,33,33,33,32,32,32,32,32,32,32,32,32,32,31,31,31,31,31,31, 30,30,30,30,29,29,29,29,29,28,28,28,28,27,27,27,26,26,26,26,26, 25,25,25,25,25,25,24,24,24,24,23,23,23,23,22,22,22,22,22,21,21, 21,21,21,21,21,21,21,21,20,20,20,20,20,20,20,20,20,20,20 }; const int n4c1w4_a[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,99,98,98,98,98,98,97,97, 97,97,97,97,97,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95, 95,95,95,95,95,95,94,94,94,94,94,94,93,93,93,93,93,93,92,92,92, 92,92,92,91,91,91,91,91,91,91,91,90,90,90,90,90,90,89,89,89,89, 89,89,89,89,88,88,88,88,88,88,88,88,88,88,88,87,87,87,87,87,87, 87,87,87,87,86,86,86,86,86,86,86,86,85,85,85,85,85,85,85,85,85, 84,84,84,84,84,83,83,83,83,83,83,83,83,83,83,83,82,82,82,82,81, 81,81,81,81,81,81,81,80,80,80,80,80,79,79,79,79,79,79,79,78,78, 78,78,78,78,77,77,77,77,77,76,76,76,76,76,76,76,75,75,75,75,74, 74,74,74,74,74,74,74,74,73,73,73,73,73,73,73,73,73,73,73,73,73, 73,73,73,73,72,72,72,72,72,72,71,71,71,71,70,70,70,70,70,69,69, 69,69,69,69,69,69,69,69,68,68,68,67,67,67,67,67,67,67,67,66,66, 66,66,66,66,65,65,65,65,65,65,65,65,64,64,64,64,64,64,63,63,63, 63,63,63,63,63,62,62,62,62,62,62,62,61,61,61,61,60,60,60,60,60, 60,60,60,60,60,59,59,59,59,59,59,59,59,58,58,58,58,58,58,58,58, 58,57,57,57,56,56,56,56,56,56,56,56,56,56,55,55,55,55,55,54,54, 54,54,54,54,54,53,53,53,53,53,53,53,53,53,52,52,52,52,52,52,51, 51,50,50,50,50,50,50,50,50,50,50,49,49,49,49,48,48,48,48,48,48, 48,48,48,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,46, 46,46,46,46,46,46,45,45,45,45,45,44,44,44,44,44,44,44,44,43,43, 43,43,42,42,42,42,42,42,42,42,42,41,41,41,41,41,40,40,40,40,40, 40,39,39,39,39,39,38,38,38,38,38,38,37,37,37,37,37,36,36,36,36, 36,36,36,36,36,35,35,35,35,35,35,35,35,35,34,34,34,33,33,33,33, 33,33,33,32,32,32,32,32,32,31,31,31,31,31,31,30,30,30,30 }; const int n4c1w4_b[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,98, 98,98,98,98,98,98,98,98,98,98,97,97,97,97,97,97,96,96,96,96,96, 96,96,96,96,95,95,95,95,95,95,94,94,93,93,93,93,93,93,92,92,92, 92,92,92,92,91,91,91,91,91,91,91,91,90,90,90,90,90,90,89,89,89, 89,89,89,89,89,89,89,88,88,88,88,88,87,87,87,87,87,87,87,86,86, 86,86,85,85,85,85,85,84,84,83,83,83,83,83,83,82,82,82,82,81,81, 81,81,81,81,81,81,81,81,81,80,80,80,80,79,79,79,79,79,79,79,78, 78,78,78,78,78,78,77,77,77,77,77,77,76,76,76,76,76,76,76,75,75, 75,75,75,75,75,75,75,74,74,74,74,74,73,73,73,73,73,73,73,72,72, 72,72,72,72,71,70,70,70,69,69,69,69,69,69,69,69,69,68,68,68,68, 68,68,68,68,68,68,67,67,67,67,67,66,66,66,66,66,65,65,65,65,65, 65,65,64,64,64,64,64,64,63,63,63,63,63,63,63,62,62,62,62,62,62, 62,62,62,61,61,61,61,61,61,60,60,60,60,60,60,59,59,59,59,59,59, 58,58,58,58,58,58,58,58,58,58,58,58,58,58,57,57,57,57,57,57,57, 57,56,56,56,56,56,56,56,56,56,55,55,55,55,55,55,55,54,54,53,53, 53,53,53,53,53,53,53,53,53,53,53,52,52,52,52,52,52,52,52,51,51, 51,51,51,51,51,51,51,51,51,51,51,50,50,50,50,50,50,50,49,49,49, 49,49,49,49,49,49,48,48,48,48,48,48,48,48,48,47,47,47,47,47,47, 47,47,47,47,47,46,46,46,46,46,46,46,45,45,45,45,45,45,45,44,44, 44,44,44,44,44,43,43,43,43,43,43,43,43,43,43,43,42,42,42,42,42, 42,42,42,42,41,41,41,41,41,41,41,40,40,39,39,39,39,39,39,38,38, 38,38,37,37,37,37,37,37,37,37,37,36,36,36,36,36,35,35,35,35,35, 35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,34,34,33,33,33,33, 33,33,33,33,33,33,32,32,32,32,32,31,31,31,31,30,30,30,30,30 }; const int n4c1w4_c[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,99,98,98,98,98,98,98,98,98,98,98, 97,97,97,97,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,94, 94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,92,92,92,92,92,92, 92,92,92,91,91,91,91,91,91,90,90,90,90,90,90,90,90,90,90,89,89, 89,89,89,89,89,89,89,89,89,89,88,88,88,88,88,87,87,87,87,87,87, 87,87,86,86,86,86,86,85,85,85,84,84,83,83,83,83,83,82,82,82,82, 82,82,81,81,81,81,80,80,80,80,80,80,80,80,80,80,80,79,79,79,79, 78,78,78,78,78,78,77,77,77,77,77,76,76,76,76,76,76,76,76,76,76, 76,76,75,75,75,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73,73, 73,73,72,72,72,71,71,71,71,71,71,71,71,71,70,70,70,70,70,70,70, 69,69,69,69,69,69,69,69,69,69,68,68,68,68,68,68,67,67,67,67,67, 67,67,67,67,67,67,67,67,67,67,67,66,66,66,66,66,66,66,66,66,66, 65,65,65,65,65,65,65,64,64,64,64,64,64,64,64,64,64,63,63,63,63, 63,63,62,62,62,62,62,62,62,62,62,62,61,61,61,61,61,61,61,60,60, 60,60,60,60,60,60,60,60,59,59,59,59,59,59,59,59,58,58,58,58,58, 58,58,58,58,57,57,57,56,56,56,55,55,55,55,55,55,55,54,54,54,54, 54,54,53,53,53,53,52,52,52,52,51,51,51,51,51,51,51,51,51,51,50, 50,50,50,50,50,50,50,50,50,50,49,49,49,49,49,49,49,49,48,48,48, 48,48,48,47,47,47,47,47,47,46,46,46,46,46,45,45,45,45,45,44,44, 44,44,44,44,44,44,44,43,43,43,43,43,43,43,43,43,42,42,42,42,42, 41,41,41,41,41,41,41,41,41,40,40,40,39,39,39,39,39,39,38,38,38, 38,38,38,38,38,38,37,37,37,37,37,37,37,36,36,36,36,36,36,36,36, 35,35,35,35,34,34,34,34,34,34,33,33,33,33,33,33,33,33,33,33,32, 32,32,32,32,32,31,31,31,31,31,31,31,30,30,30,30,30,30,30 }; const int n4c1w4_d[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,100,99,99,99,99,99, 99,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,96,96,96,96, 95,95,95,95,95,95,95,94,94,94,93,93,93,93,93,93,93,93,92,92,92, 92,92,92,91,91,91,90,90,90,89,89,89,89,89,89,89,89,89,89,88,88, 88,88,88,87,87,87,87,86,86,86,86,86,86,86,86,86,86,86,85,85,85, 85,85,85,85,85,85,85,85,84,84,84,84,83,83,83,83,83,83,83,82,82, 82,82,82,82,81,80,80,80,80,80,80,80,80,80,79,79,79,79,79,78,78, 78,78,78,78,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,76,75, 75,75,75,75,75,75,75,75,74,74,74,74,74,73,73,73,73,73,73,73,73, 73,73,72,72,72,72,71,71,71,71,71,71,71,71,71,70,70,70,70,69,69, 69,69,68,68,68,68,68,68,67,67,67,67,67,66,66,66,66,66,65,65,65, 65,65,65,64,64,64,64,64,64,64,64,64,64,63,63,63,63,63,63,63,62, 62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,61,61,61,61, 61,61,61,61,61,61,60,60,60,60,60,60,60,59,59,59,59,59,59,59,59, 58,58,58,58,58,58,58,58,58,57,57,57,57,57,57,57,56,56,56,56,56, 56,56,55,55,55,55,55,55,55,54,54,54,54,54,54,54,54,53,53,53,53, 53,53,53,53,53,53,53,52,52,52,52,52,52,52,52,52,51,51,51,51,51, 51,51,51,50,50,50,50,50,49,49,49,49,49,49,49,49,49,48,48,48,48, 47,47,47,47,47,47,47,47,46,46,46,46,46,46,46,46,46,45,45,45,45, 45,45,44,44,44,44,44,44,44,44,43,43,43,43,43,43,42,42,42,42,42, 42,42,41,41,41,41,41,41,41,41,40,40,40,40,40,40,39,39,39,39,39, 38,38,38,38,38,38,38,38,38,38,37,37,37,37,37,37,36,36,36,36,36, 36,36,36,36,36,36,36,35,35,35,35,35,35,35,35,34,34,34,34,34,34, 34,33,33,33,33,33,33,33,32,31,31,31,31,31,30,30,30,30,30,30,30 }; const int n4c1w4_e[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,98,98, 98,98,98,98,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,96,96, 96,96,96,96,96,96,96,96,96,95,95,95,95,94,94,94,94,94,93,93,93, 93,93,93,92,92,92,92,92,92,92,91,91,91,91,91,90,90,90,90,90,90, 90,90,89,89,89,89,89,89,89,89,89,89,88,88,88,88,88,88,87,87,87, 87,87,87,86,86,86,86,85,85,85,85,85,85,85,85,85,85,84,84,84,84, 84,84,84,83,83,83,83,83,83,83,82,82,82,82,82,82,82,81,81,81,81, 81,81,80,80,80,80,80,80,80,80,80,80,80,80,80,80,79,79,79,79,79, 79,78,78,78,78,78,78,78,77,77,77,77,77,76,76,76,76,76,76,76,76, 76,76,76,76,76,75,75,75,75,75,75,75,74,74,74,74,74,74,74,74,74, 74,74,74,73,73,73,73,73,73,73,73,72,72,72,72,72,72,71,71,71,71, 71,71,70,70,70,70,70,70,70,70,70,69,69,69,69,69,69,69,69,68,68, 68,68,68,68,67,67,67,67,67,67,67,67,67,67,67,67,67,67,66,66,66, 66,66,66,66,66,65,65,65,65,64,64,64,64,63,63,63,63,63,63,63,63, 63,63,62,62,62,62,62,61,61,61,61,61,60,60,60,60,60,60,59,59,59, 59,59,59,59,59,59,59,59,59,59,58,58,58,58,57,57,57,57,57,57,57, 57,57,56,56,56,56,56,56,55,55,55,55,55,55,54,54,54,54,53,53,53, 53,53,53,53,53,52,52,52,52,51,51,51,51,51,51,50,50,49,49,49,49, 49,49,48,48,48,48,48,48,47,47,47,47,47,47,47,46,46,46,46,46,46, 46,45,45,45,45,45,44,44,44,43,43,43,43,43,43,43,43,43,43,42,42, 42,42,42,42,42,42,42,42,41,41,41,41,41,41,40,40,39,39,39,39,39, 39,39,38,38,38,38,38,38,38,38,37,37,36,36,36,36,36,36,35,35,35, 35,35,35,35,35,34,34,34,34,33,33,33,33,33,33,32,32,32,32,32,32, 32,32,32,32,32,32,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30 }; const int n4c1w4_f[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,99,99,99,99,98,98,98,98,98,97,97,97,97, 97,97,96,96,96,96,96,96,96,94,94,94,94,94,94,93,93,93,93,93,92, 92,92,91,91,91,91,91,90,90,90,90,90,89,89,89,89,89,89,89,88,88, 88,88,88,87,87,87,87,87,87,86,86,86,86,85,85,85,84,84,84,84,84, 84,84,83,83,83,83,83,83,83,83,83,83,82,82,82,82,82,82,81,81,81, 81,81,81,81,81,80,80,80,80,80,80,80,80,80,79,79,79,79,79,79,79, 78,78,78,78,78,78,78,78,78,77,77,77,77,77,77,77,76,76,76,76,76, 76,76,76,76,75,75,75,75,75,75,75,75,75,75,74,74,74,74,74,74,74, 73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,72,72,72, 72,72,72,72,71,71,71,70,70,70,70,69,69,69,69,69,69,69,69,69,69, 69,69,68,68,68,68,68,68,68,68,68,68,68,67,67,66,66,66,66,65,65, 65,65,65,65,65,65,64,64,64,64,64,64,64,64,64,64,64,64,64,63,63, 63,63,63,63,63,63,62,62,62,62,62,61,61,61,61,61,60,60,60,60,60, 60,60,60,60,60,60,60,60,60,60,59,59,59,59,59,59,59,59,59,59,58, 58,58,58,58,58,58,58,58,58,57,57,57,57,57,57,57,57,57,57,57,57, 56,56,56,56,56,56,56,56,55,55,55,55,55,55,55,54,54,54,54,54,54, 54,54,54,54,53,53,53,53,53,53,53,52,52,52,52,52,52,52,52,52,51, 51,51,51,51,51,51,51,51,50,50,50,50,50,50,50,50,50,49,49,49,48, 48,48,48,48,47,47,47,47,47,47,46,46,46,46,46,46,46,46,46,46,45, 45,45,45,44,44,44,44,44,44,44,44,44,44,44,43,43,43,42,42,42,41, 41,41,41,41,40,40,40,40,40,40,40,40,40,40,39,39,39,39,39,39,39, 39,39,38,38,38,38,38,38,37,37,37,37,37,37,37,37,37,36,36,36,36, 36,35,35,35,35,35,35,35,35,34,34,34,34,34,33,33,33,33,32,32,32, 32,32,32,32,32,31,31,31,31,31,31,30,30,30,30,30,30,30 }; const int n4c1w4_g[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,98,98,98,98, 98,98,98,98,97,97,97,97,97,97,97,96,96,96,96,96,96,95,95,95,95, 95,95,95,95,95,94,94,94,94,94,93,93,93,93,93,93,93,93,93,93,92, 92,92,92,92,92,91,91,91,91,91,91,91,90,90,90,90,90,90,89,89,89, 89,89,89,89,89,89,89,89,88,88,88,88,87,87,87,87,87,87,87,86,86, 86,86,86,86,86,86,86,86,85,85,85,85,85,85,84,84,83,83,83,83,83, 82,82,82,82,82,82,82,82,82,82,82,82,82,81,81,81,81,81,81,81,81, 81,80,80,80,80,80,80,79,79,79,79,79,79,79,79,79,78,78,78,78,78, 78,78,78,78,78,77,77,77,77,77,77,77,77,77,77,77,76,76,76,75,75, 75,75,75,75,75,75,75,74,74,74,74,74,74,74,73,73,73,73,73,73,73, 73,73,73,73,72,72,72,72,72,72,72,72,71,71,71,71,71,70,70,70,70, 70,70,69,69,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,67,67, 67,66,66,66,66,66,66,66,65,65,65,65,65,65,65,64,64,64,64,64,63, 63,63,63,63,63,62,62,62,62,62,62,61,61,61,60,60,60,60,60,60,60, 60,60,60,59,59,59,59,59,59,59,59,59,58,58,58,58,58,58,57,57,57, 56,56,56,56,55,55,55,55,55,55,55,54,54,54,54,54,54,54,54,54,54, 53,53,53,53,53,52,52,52,52,52,52,51,51,51,51,51,51,51,51,51,50, 50,50,50,50,50,49,49,49,49,49,49,49,48,48,48,48,48,48,48,48,47, 47,47,47,47,47,47,47,46,46,46,46,46,46,45,45,45,45,44,44,44,44, 44,44,44,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42,42,42,41, 41,41,41,41,41,41,41,41,41,40,40,40,40,40,39,39,39,39,39,39,39, 39,38,38,38,38,37,37,37,37,37,37,36,36,36,36,35,35,35,35,35,35, 35,35,35,34,34,34,34,33,33,33,33,33,33,32,32,32,32,32,32,32,32, 32,32,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30,30 }; const int n4c1w4_h[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,99, 99,99,99,98,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,97, 96,96,96,96,96,95,95,95,95,95,95,95,95,95,95,95,95,94,94,94,94, 94,94,93,93,93,93,93,92,92,92,92,92,92,91,91,91,91,91,91,91,91, 91,91,91,91,91,91,90,90,90,90,90,89,89,89,89,89,89,89,89,88,88, 88,88,88,87,87,87,87,87,87,87,86,86,86,86,86,86,86,86,85,85,85, 85,84,84,84,84,84,84,84,83,83,83,83,82,82,82,82,82,82,82,82,82, 82,82,81,81,81,81,81,81,81,81,80,80,80,80,80,80,80,80,80,80,79, 79,79,79,79,79,79,78,78,78,78,78,78,78,78,77,77,77,76,76,76,76, 76,76,76,76,76,76,76,76,76,75,75,75,75,74,74,74,74,74,74,73,73, 73,72,72,72,71,71,71,71,71,71,71,70,70,70,70,70,70,70,70,70,69, 69,69,69,69,68,68,68,68,68,68,68,67,67,67,67,67,67,66,66,66,66, 66,66,66,66,66,65,65,65,65,65,65,65,65,65,65,64,64,64,64,64,63, 63,63,63,63,63,62,62,62,62,62,61,61,61,61,61,61,61,61,61,60,60, 60,60,60,59,59,59,59,58,58,58,58,58,58,58,58,58,57,57,57,57,57, 57,56,56,56,56,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,55, 54,54,54,54,54,53,53,52,52,52,52,52,51,51,51,51,50,50,49,49,49, 49,49,48,48,48,48,48,48,48,47,47,47,47,46,46,46,46,46,46,45,45, 45,45,45,45,45,45,45,44,44,44,44,44,44,44,44,44,44,43,43,43,43, 43,43,43,43,42,42,42,42,42,42,42,42,42,41,41,41,41,41,41,40,40, 40,39,39,39,38,38,38,38,38,38,38,38,38,38,38,37,37,37,37,37,37, 37,37,36,36,36,36,36,36,36,35,35,35,35,35,35,35,35,34,34,34,34, 34,34,34,34,34,34,33,33,33,33,33,33,33,32,32,32,32,32,32,32,32, 32,31,31,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30 }; const int n4c1w4_i[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,99,99,99,99,98,98, 98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,97,96,96,96,96, 96,96,95,95,95,95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,94, 93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,91,91,91,91,91,91, 91,91,91,91,91,91,91,90,90,90,90,89,89,89,89,89,89,89,89,88,88, 88,88,88,88,87,87,87,87,87,87,87,87,86,86,86,86,86,86,85,85,85, 85,85,85,84,84,84,84,84,84,84,84,83,83,83,83,82,82,82,82,82,82, 81,81,81,81,81,80,80,80,80,80,80,80,80,80,80,80,80,79,79,79,79, 78,78,78,78,78,78,77,77,77,76,76,76,76,76,76,76,76,75,75,75,75, 75,75,75,75,75,75,75,74,74,74,74,74,74,74,73,73,73,72,72,72,72, 72,71,71,71,71,71,71,71,71,71,71,70,70,70,70,70,70,69,69,69,69, 69,69,68,68,68,68,68,68,68,67,67,67,67,67,67,67,66,66,66,66,66, 66,66,66,66,65,65,65,65,64,64,64,64,64,64,64,63,63,63,63,62,62, 62,62,62,62,61,61,61,61,61,61,61,61,61,61,61,60,60,60,60,60,60, 59,59,59,59,59,59,59,59,58,58,58,58,58,58,58,57,57,57,57,57,57, 57,56,56,56,56,56,55,55,55,55,55,55,55,54,54,54,54,53,53,53,53, 53,52,52,52,52,52,52,52,52,52,52,51,51,51,51,51,50,50,50,50,50, 50,49,49,49,49,49,49,49,49,49,48,48,48,48,48,47,47,47,47,47,46, 46,45,45,45,45,45,45,45,44,44,44,44,44,44,44,44,44,44,44,44,44, 43,43,43,43,43,43,43,43,42,42,42,42,42,42,41,41,41,41,41,40,40, 40,40,40,40,40,40,40,40,40,40,39,39,39,39,39,39,39,39,39,39,38, 38,38,37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,36,36,36, 35,35,35,35,35,35,35,34,34,34,34,34,34,34,34,34,34,33,33,33,33, 33,33,32,32,32,32,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30 }; const int n4c1w4_j[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,98, 98,98,98,98,98,98,98,97,97,97,97,96,96,96,96,96,96,96,96,96,96, 96,95,95,95,95,95,95,95,94,94,94,94,94,94,94,93,93,93,93,93,93, 93,93,92,92,92,92,92,92,92,92,92,92,92,92,91,91,91,91,91,91,90, 90,90,90,90,90,90,90,90,90,89,89,89,89,89,89,89,88,88,88,88,88, 87,87,87,87,87,87,87,87,87,87,86,86,86,86,86,86,85,85,85,85,85, 85,85,85,85,85,85,84,84,84,84,84,83,83,83,83,83,83,83,83,83,83, 82,82,82,82,82,82,82,81,81,81,80,80,80,80,80,80,80,80,80,80,80, 80,79,79,79,79,79,79,79,79,79,78,78,78,78,77,77,77,77,77,77,76, 76,76,76,76,76,76,76,76,75,75,75,75,75,75,74,74,74,74,74,74,73, 73,73,73,73,73,73,73,72,72,72,71,71,71,71,71,71,71,70,70,70,70, 70,70,70,70,70,70,70,69,69,69,69,69,69,69,69,68,68,68,68,68,67, 67,67,66,66,65,65,65,65,65,65,65,65,64,64,64,64,64,63,63,63,63, 63,63,63,62,62,62,62,62,62,62,62,62,62,62,61,61,61,61,61,61,61, 61,61,60,60,60,60,60,60,59,59,59,59,59,59,59,59,59,59,59,59,59, 59,58,58,58,58,57,57,57,57,57,57,57,56,56,56,56,56,56,56,56,55, 55,55,55,54,54,54,54,54,54,54,53,53,53,53,53,52,52,52,52,52,52, 52,51,51,51,51,51,51,51,51,51,50,50,50,50,50,50,49,49,49,48,48, 48,48,48,48,48,48,48,48,48,47,47,47,47,46,46,46,46,46,46,46,45, 45,45,45,45,45,45,44,44,44,44,44,44,44,44,43,43,43,43,43,43,42, 42,42,42,42,42,42,41,41,41,41,40,40,40,40,40,40,39,39,39,39,39, 39,39,38,38,38,38,38,38,38,37,37,37,37,37,37,36,36,36,36,36,36, 35,35,35,35,35,35,34,34,34,34,34,34,34,34,34,34,34,34,34,34,33, 33,33,33,32,32,32,32,32,32,31,31,31,31,31,31,30,30,30,30,30 }; const int n4c1w4_k[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,99,98, 98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,96,96,96,96,96,96, 96,96,96,96,95,95,95,95,95,95,95,95,95,94,94,94,93,93,93,93,93, 93,92,92,92,92,92,92,92,91,91,91,91,91,91,91,90,90,90,90,90,89, 89,89,89,89,89,89,89,89,89,88,88,88,88,88,88,88,88,88,88,88,88, 88,88,87,87,87,87,87,87,86,86,86,86,86,86,86,86,86,86,85,85,85, 85,85,84,84,84,84,84,84,84,84,84,84,84,84,84,83,83,83,83,83,83, 83,82,82,82,81,81,81,80,80,80,80,80,79,79,79,79,79,78,78,78,78, 78,78,77,77,77,77,77,77,77,77,77,76,76,76,75,75,75,75,75,75,74, 74,74,74,74,74,74,74,74,73,73,73,73,73,73,73,73,73,73,73,72,72, 72,72,72,72,72,71,71,71,71,71,71,71,71,71,71,70,70,70,70,70,70, 70,70,70,69,69,69,69,69,69,69,69,69,69,69,69,68,68,68,67,67,67, 67,67,67,66,66,66,66,66,66,66,66,65,65,65,65,65,64,64,64,64,64, 64,64,64,64,64,63,63,63,63,63,63,63,63,63,63,62,62,62,62,62,62, 61,61,61,61,60,60,60,60,59,59,59,59,59,59,59,59,59,59,59,59,59, 58,58,58,58,58,58,58,57,57,57,57,57,56,56,56,56,55,55,55,55,55, 55,55,55,55,55,55,54,54,54,54,54,54,54,54,53,53,53,53,53,53,52, 52,52,52,52,51,51,51,51,51,50,50,50,50,50,50,50,50,50,49,49,49, 49,49,49,48,48,48,48,48,48,48,48,47,47,47,46,46,46,46,46,46,46, 46,46,45,45,45,45,45,44,44,44,44,44,44,44,44,44,44,43,43,43,43, 43,43,43,43,43,42,42,42,42,42,42,41,41,41,41,41,40,40,40,40,40, 40,39,39,39,39,39,39,38,38,38,38,38,37,37,37,36,36,36,36,36,36, 35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,33,33,33,33,33,32, 32,32,32,32,32,32,32,31,31,31,31,31,31,30,30,30,30,30,30,30 }; const int n4c1w4_l[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,99, 98,98,98,98,98,98,98,98,98,98,98,98,98,98,97,97,97,96,96,96,96, 96,96,96,95,95,95,95,95,95,95,95,95,95,95,94,94,94,94,94,94,94, 94,94,94,94,93,93,93,93,93,92,92,92,91,91,91,91,91,91,91,90,90, 90,90,89,89,89,89,89,89,88,88,88,88,87,87,87,87,87,87,87,86,86, 86,86,86,86,85,85,85,85,85,85,85,85,85,84,84,84,83,83,83,83,83, 83,83,83,83,83,82,82,82,82,82,81,81,81,81,80,80,80,80,80,80,80, 80,80,80,79,79,79,78,78,78,78,78,77,77,77,77,77,77,77,76,76,76, 76,76,76,76,76,76,76,76,76,76,76,75,75,75,75,75,74,74,74,74,74, 73,73,73,73,73,73,72,72,72,72,72,71,71,71,71,71,71,71,71,71,71, 71,71,70,70,70,70,70,70,70,69,69,69,69,69,69,68,68,68,68,68,68, 67,67,67,67,66,66,66,66,66,66,66,66,66,65,65,65,65,65,65,65,65, 64,64,64,64,64,64,64,64,63,63,63,63,62,62,62,62,62,62,62,62,62, 61,61,61,61,61,61,61,61,60,60,60,60,60,60,60,60,60,60,60,60,60, 60,59,59,59,59,59,59,58,58,58,58,57,57,57,57,57,57,57,57,56,56, 56,56,56,56,56,55,55,55,55,54,54,54,54,53,53,53,53,53,52,52,52, 51,51,51,51,51,51,51,51,50,50,50,50,50,49,49,49,49,49,48,48,48, 48,48,48,48,48,48,48,48,47,47,47,47,47,47,47,47,47,46,46,46,46, 46,46,46,46,46,46,45,45,45,45,44,44,44,44,44,44,44,44,44,43,43, 43,43,43,43,43,43,42,42,42,42,42,42,42,42,41,41,41,41,41,41,41, 41,41,40,40,40,40,40,39,39,39,39,39,39,39,38,38,38,38,38,38,38, 38,38,37,37,37,37,37,36,36,36,36,36,36,36,36,36,36,35,35,35,35, 35,35,35,35,35,34,34,33,33,33,33,33,33,33,33,32,32,32,32,32,32, 32,32,32,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30 }; const int n4c1w4_m[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,98,98,98,98,98,98, 98,98,98,97,97,97,97,96,96,96,96,95,95,95,95,95,95,95,95,94,94, 94,94,94,94,94,94,94,94,94,94,94,94,93,93,93,93,93,93,92,92,92, 92,92,92,91,91,91,91,91,91,91,90,90,90,90,90,90,90,90,90,90,90, 90,89,89,89,89,89,88,88,88,88,88,88,88,87,87,87,87,87,87,87,87, 87,87,87,86,86,86,86,86,86,86,86,85,85,85,85,85,85,85,85,85,85, 84,83,83,83,83,83,83,82,82,82,82,82,82,82,81,81,81,81,81,80,80, 80,80,80,80,80,80,80,80,79,79,79,79,79,79,78,78,78,78,78,78,77, 77,77,77,77,77,76,76,76,75,75,75,75,75,74,74,74,74,74,74,73,73, 73,73,73,73,73,73,73,72,72,72,72,72,72,72,72,72,72,71,71,71,71, 71,71,71,71,71,70,70,70,70,70,70,70,70,69,69,69,69,69,68,68,68, 68,68,68,68,68,68,68,68,67,67,67,67,67,67,67,67,67,66,66,66,66, 66,66,66,65,65,65,65,65,65,65,64,64,64,64,64,63,63,63,63,63,63, 62,62,62,62,62,62,62,61,61,61,61,61,61,60,60,60,60,60,60,60,59, 59,59,59,59,59,59,59,58,58,58,58,57,57,57,57,57,57,57,56,56,56, 56,56,56,56,56,55,55,55,55,55,55,55,55,55,54,54,54,54,54,54,54, 54,54,54,54,54,53,53,53,53,53,52,52,52,52,52,52,51,51,51,51,51, 50,50,50,50,50,50,50,50,50,50,49,49,49,49,49,48,48,48,48,47,47, 47,47,47,47,47,47,47,46,46,46,46,45,45,45,44,44,44,44,44,44,44, 44,44,44,44,43,43,43,43,43,43,43,42,42,42,42,41,41,41,41,41,41, 41,41,40,40,40,40,40,40,40,40,39,39,39,39,39,39,39,39,38,38,38, 37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,35,35,35,35,34,34, 34,34,34,34,34,34,33,33,33,33,33,33,33,32,32,32,32,32,32,32,32, 32,32,32,32,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30 }; const int n4c1w4_n[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,98,98,98,98,97,97,97,96, 96,96,96,96,95,95,95,95,95,95,95,95,95,95,95,95,95,94,94,94,94, 94,94,94,94,93,93,93,93,93,93,92,92,92,92,92,92,91,91,91,91,91, 91,91,91,90,90,90,90,89,89,89,89,89,89,89,89,89,88,88,88,88,88, 88,88,87,87,87,87,87,87,87,87,87,87,86,86,86,86,86,86,86,85,85, 85,85,85,85,85,84,84,84,84,84,84,84,84,83,83,83,83,83,83,83,82, 82,82,82,82,82,82,82,82,81,81,81,81,81,81,81,81,80,80,80,80,80, 80,80,80,79,79,79,79,79,79,78,78,78,78,78,78,78,78,77,77,77,77, 77,77,77,77,76,76,75,75,75,75,75,75,75,75,75,74,74,74,74,74,74, 74,74,74,74,74,74,74,74,73,73,73,73,73,73,73,73,73,73,72,72,72, 72,72,72,71,71,71,71,71,70,70,70,70,70,70,70,70,70,69,69,69,69, 69,69,69,69,69,68,68,68,68,68,67,67,67,67,66,66,66,66,66,66,66, 66,66,65,65,65,65,65,65,65,64,64,64,64,64,64,64,63,63,63,63,62, 62,62,62,62,62,62,61,61,61,61,61,61,61,61,60,60,60,60,60,60,60, 60,60,59,59,59,59,58,58,58,58,58,58,58,58,58,58,58,57,57,57,57, 57,57,56,56,56,56,56,56,55,55,55,55,55,55,54,54,54,54,54,54,54, 54,54,54,54,53,53,53,53,53,53,53,53,52,52,52,52,52,52,52,52,51, 51,51,51,51,51,50,50,50,50,50,50,49,49,49,49,49,49,48,48,48,48, 48,48,48,48,47,47,47,47,47,47,46,46,46,46,46,46,46,45,45,45,45, 45,45,45,45,45,45,44,44,44,44,43,43,43,43,43,42,42,42,42,42,42, 41,41,41,41,41,41,41,41,41,41,40,40,40,40,40,40,40,40,40,40,39, 39,39,39,39,38,38,38,37,37,37,36,36,36,36,36,35,35,35,35,35,35, 35,35,35,35,35,34,34,34,34,34,34,33,33,33,33,33,33,32,32,32,32, 32,32,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30 }; const int n4c1w4_o[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,98,98,98,98,98,98,98, 98,98,97,97,97,97,97,97,97,96,96,96,96,96,96,96,95,95,95,95,94, 94,94,94,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,91,91, 91,91,91,91,90,90,90,90,90,90,90,90,90,90,90,90,90,89,89,89,89, 89,89,89,89,88,88,88,88,88,88,87,87,87,87,86,85,85,85,85,84,84, 84,84,84,84,84,84,84,84,84,83,83,83,83,83,83,83,83,83,83,83,83, 82,82,82,82,81,81,81,81,81,81,80,80,80,79,79,79,79,79,79,79,79, 79,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,77,77,76, 76,76,76,76,76,75,75,75,75,74,74,74,74,74,73,73,73,73,73,73,73, 72,72,72,72,72,72,72,72,71,71,71,71,71,71,71,70,70,70,70,70,70, 69,69,69,69,69,69,68,68,68,68,68,68,68,67,66,66,66,66,66,66,66, 66,66,66,66,65,65,65,64,64,64,64,64,64,64,64,64,64,64,63,63,63, 63,63,63,63,63,62,62,62,62,62,62,62,62,61,61,60,60,60,60,60,59, 59,59,59,59,59,59,59,59,59,59,58,58,58,58,58,58,58,57,57,57,57, 57,57,57,56,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,54,54, 54,54,54,54,54,54,54,54,53,53,53,53,53,53,53,52,52,52,52,52,52, 52,51,51,51,51,51,51,51,51,50,50,50,50,50,50,50,50,49,49,49,49, 49,49,48,48,48,48,48,48,47,47,47,47,47,47,47,47,46,46,46,46,46, 46,46,45,45,45,45,45,45,45,45,45,45,45,44,44,44,44,44,43,43,43, 43,43,43,43,43,43,43,43,43,43,42,42,42,42,42,41,41,41,41,41,41, 41,41,41,41,41,41,41,40,40,40,40,40,39,39,39,39,39,39,39,39,39, 38,38,38,38,38,38,38,37,37,37,37,37,37,37,36,36,36,36,36,36,36, 36,36,35,35,35,35,35,35,34,34,34,34,34,34,34,34,33,33,33,33,33, 33,33,33,32,32,32,32,32,32,32,31,31,31,31,31,31,30,30,30,30 }; const int n4c1w4_p[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,98,98,98,98,98,98,98,98,98, 97,97,97,97,97,97,97,96,96,96,96,95,95,95,95,95,95,95,94,94,94, 94,94,93,93,93,93,93,93,92,92,92,92,92,92,92,92,91,91,91,91,91, 91,91,91,91,91,90,90,90,90,90,90,90,90,89,89,89,89,89,89,88,88, 88,88,88,88,88,88,88,88,88,88,88,87,87,87,87,87,87,87,87,87,87, 87,86,86,86,86,86,86,86,86,86,86,86,85,85,85,85,84,84,84,84,84, 84,84,84,83,83,83,83,83,83,83,83,83,83,83,83,83,82,82,82,82,82, 82,82,82,82,81,81,81,81,81,81,81,81,80,80,80,80,80,80,79,79,79, 79,79,79,79,79,78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,76, 76,76,76,76,76,76,76,75,75,75,75,75,75,75,74,74,74,74,74,74,74, 74,74,74,73,73,72,72,72,72,71,71,71,71,70,70,70,70,70,70,70,70, 70,70,70,69,69,69,68,68,68,68,68,68,68,67,67,67,67,67,67,67,67, 66,66,66,66,65,65,64,64,64,64,64,64,64,64,64,64,63,63,63,63,63, 63,63,63,63,62,62,62,62,62,62,62,62,61,61,61,61,61,61,60,60,60, 60,60,59,59,59,59,59,59,59,59,58,58,58,58,58,58,58,58,57,57,57, 57,57,57,56,56,56,56,56,55,55,55,55,55,55,55,55,55,55,55,55,55, 55,54,54,54,54,53,53,53,53,53,52,52,52,52,52,52,52,52,52,52,51, 51,51,51,51,51,50,50,50,50,50,49,49,49,49,49,48,48,48,48,48,47, 47,47,47,47,47,47,47,46,46,46,46,46,46,46,46,45,45,45,44,44,44, 44,43,43,43,43,43,43,43,43,43,42,42,42,42,42,41,41,41,41,41,41, 41,40,40,40,40,40,40,40,40,40,40,39,39,39,39,39,39,39,39,39,39, 39,38,38,38,38,38,38,37,37,37,37,37,37,36,36,36,36,36,35,35,35, 35,35,35,35,35,35,34,34,34,34,34,34,34,34,33,33,33,33,33,33,32, 32,32,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30,30 }; const int n4c1w4_q[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,98, 98,98,98,98,98,97,97,97,97,96,96,96,96,96,96,95,95,95,95,94,94, 94,94,94,94,94,93,93,93,93,93,93,93,92,92,92,92,92,92,91,91,91, 91,91,91,91,90,90,90,90,90,90,90,90,90,90,90,90,90,89,89,89,88, 88,88,88,88,87,87,87,87,87,87,87,87,86,86,86,86,85,85,85,85,85, 84,84,84,84,84,84,84,84,84,84,84,83,83,83,83,83,83,83,82,82,82, 82,82,82,82,82,82,81,81,81,81,81,81,81,81,81,80,80,80,80,80,80, 80,80,80,79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,78,78,78, 77,77,77,76,76,76,76,76,76,75,75,75,74,74,74,74,74,74,74,74,74, 73,73,73,72,72,72,72,72,72,72,72,72,72,71,71,71,71,71,71,71,71, 71,71,70,70,70,70,70,70,69,69,69,69,69,69,68,68,68,68,68,67,67, 67,67,67,67,67,66,66,66,66,66,66,66,65,65,65,65,64,64,64,64,64, 64,64,64,64,64,64,64,64,63,63,63,63,63,63,63,62,62,62,62,62,62, 61,61,61,60,60,60,60,60,60,60,60,60,60,59,59,59,59,59,59,59,59, 59,58,58,58,58,58,57,57,57,57,57,57,57,57,57,57,56,56,56,56,56, 56,56,56,56,56,55,55,55,55,55,55,55,55,54,54,54,54,54,54,54,53, 53,53,53,53,53,53,53,52,52,52,52,52,52,52,52,52,51,51,51,51,51, 51,50,50,50,50,49,49,49,49,49,49,49,49,48,48,48,48,48,47,47,47, 47,47,47,47,47,46,46,46,46,46,46,46,46,46,46,45,45,45,45,45,45, 44,44,44,44,44,44,44,44,44,44,43,43,43,43,43,43,42,42,42,42,42, 42,41,41,41,41,41,41,41,41,41,41,41,41,40,40,40,40,40,40,40,40, 39,39,39,39,39,39,39,39,39,38,38,38,38,38,38,38,38,37,37,37,37, 37,37,37,36,36,36,36,36,35,35,35,35,34,34,34,34,34,34,34,33,33, 33,33,33,33,33,33,33,32,32,32,32,31,31,31,31,31,31,31,31,30,30 }; const int n4c1w4_r[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,98,98, 98,98,98,98,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96, 96,96,96,96,96,95,95,95,94,94,94,94,94,94,94,94,94,94,93,93,93, 93,93,93,93,92,92,92,92,92,92,92,92,92,92,92,92,92,91,91,91,91, 91,90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,89,88,88,88,88, 88,88,88,88,88,88,88,88,87,87,87,87,87,87,87,87,87,86,86,86,86, 86,85,85,85,85,85,84,84,84,84,84,83,83,83,83,83,83,83,82,82,82, 82,82,82,81,81,81,81,81,81,81,81,80,80,80,80,80,80,80,80,80,80, 80,79,79,79,79,79,79,78,78,78,78,78,77,77,77,77,77,76,76,76,76, 76,76,76,76,76,75,75,75,75,75,74,74,74,74,74,74,73,73,73,73,73, 73,73,73,73,72,72,72,72,72,71,71,71,71,70,70,70,70,70,69,69,69, 69,69,69,69,69,69,69,68,68,68,67,67,67,67,66,66,66,66,66,66,66, 65,65,65,65,65,65,65,65,65,65,64,64,64,64,64,64,64,64,63,63,63, 63,63,63,63,62,62,61,61,61,61,61,61,61,61,60,60,60,60,60,60,59, 59,59,59,59,59,59,59,59,59,58,58,58,58,58,57,57,57,57,57,57,57, 57,57,57,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,54,54,54, 54,54,53,53,53,53,53,53,53,53,53,53,53,53,53,52,52,52,52,52,52, 52,52,52,52,52,51,51,51,51,51,51,51,51,51,50,50,50,49,49,49,49, 49,49,49,49,48,48,48,48,47,47,47,47,47,47,47,47,47,47,47,46,46, 46,46,45,45,45,45,45,45,45,45,45,45,45,44,44,44,44,44,44,43,43, 43,43,43,43,43,43,43,43,43,42,42,42,42,42,42,41,41,41,41,41,40, 40,40,40,40,40,40,39,39,39,39,39,38,38,37,37,37,37,37,37,37,37, 36,36,36,36,36,35,35,35,35,34,34,34,34,34,34,34,33,33,33,33,33, 33,33,33,33,32,32,32,32,32,32,31,31,31,31,31,31,30,30,30,30 }; const int n4c1w4_s[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,98,98,98,97, 97,97,97,97,97,96,96,96,96,96,96,95,95,95,95,95,94,94,94,94,94, 94,93,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,91,91,91,91, 91,91,91,90,90,90,90,90,90,90,90,90,89,89,89,89,89,88,88,88,88, 88,88,88,88,88,88,87,87,87,87,87,86,86,86,86,86,86,86,86,85,85, 85,85,85,85,85,85,85,85,84,84,84,84,84,84,84,84,84,84,83,83,83, 83,83,82,82,82,82,81,81,81,81,81,81,81,80,80,80,80,80,80,80,80, 80,79,79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,77,77,77,77, 77,76,76,76,76,76,76,76,76,76,75,75,75,75,75,75,75,75,75,75,74, 74,74,74,74,74,74,73,73,73,73,73,73,73,73,73,73,73,72,72,72,72, 72,72,72,72,71,71,71,70,70,70,70,69,69,69,69,69,69,69,69,69,69, 68,68,68,68,67,67,67,67,67,67,67,66,66,66,66,66,66,65,65,65,65, 64,64,64,64,64,64,63,63,63,63,63,63,63,63,63,62,62,62,62,61,61, 61,61,61,61,61,61,60,60,60,60,60,60,59,59,59,59,59,59,59,59,59, 59,58,58,58,58,57,57,57,57,57,57,57,57,57,57,56,56,56,55,55,55, 55,55,55,54,54,54,54,54,54,54,54,53,53,53,53,53,53,53,53,52,52, 52,52,52,52,52,52,51,51,51,51,50,50,50,50,50,50,50,50,49,49,49, 49,49,49,49,49,49,49,48,48,48,48,47,47,47,47,47,47,47,47,46,46, 46,46,46,46,46,46,46,45,45,45,45,44,44,44,44,44,44,44,43,43,43, 43,43,42,42,42,42,42,41,41,41,41,41,41,41,41,41,40,40,40,40,40, 40,40,39,39,39,39,39,39,39,39,39,39,39,39,39,39,38,38,38,38,38, 38,38,38,38,37,37,37,37,37,37,37,37,36,36,36,36,36,36,35,35,35, 35,35,35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,34,33,33,33, 33,33,33,32,32,32,32,32,31,31,31,31,30,30,30,30,30,30,30 }; const int n4c1w4_t[] = { 100, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,98, 98,98,98,98,97,97,97,97,97,97,96,96,96,96,95,95,95,95,95,95,95, 95,95,95,95,95,95,94,94,94,94,94,94,93,93,93,93,93,92,92,92,92, 92,92,91,91,91,91,91,91,90,90,90,89,89,89,89,89,89,89,89,89,89, 88,88,87,87,87,87,86,86,86,86,86,86,86,86,85,85,85,85,85,85,85, 85,84,84,84,84,84,84,84,84,84,83,83,83,83,82,82,82,82,82,82,82, 82,82,82,81,81,81,80,80,80,80,80,80,80,79,79,79,79,79,79,78,78, 78,78,78,78,78,78,78,78,78,77,77,77,76,76,76,76,76,76,76,76,75, 75,75,75,75,75,74,74,74,73,73,73,73,73,73,72,72,72,72,72,72,72, 72,72,72,72,72,72,72,72,71,71,71,71,70,70,70,70,70,70,70,70,70, 70,70,70,69,69,69,69,69,69,69,69,69,69,68,68,68,68,68,68,68,68, 68,68,68,67,67,67,67,67,67,67,67,66,66,66,65,65,65,65,65,65,65, 65,65,65,65,64,64,64,64,63,63,63,63,63,63,62,62,62,62,62,61,61, 61,61,61,61,60,60,60,60,60,59,59,59,59,59,59,58,58,58,58,57,57, 57,57,57,57,56,56,56,56,56,56,55,55,55,55,55,55,54,54,54,54,54, 54,53,53,53,53,53,53,53,53,52,52,52,52,52,52,52,51,51,51,51,50, 50,50,50,50,50,50,50,50,49,49,49,49,49,49,48,48,48,48,48,48,47, 47,47,47,46,46,46,46,46,45,45,45,45,45,45,45,45,44,44,44,44,44, 44,44,44,44,44,44,44,43,43,43,43,43,43,42,42,42,42,42,42,42,42, 42,42,42,42,42,41,41,41,41,41,41,41,40,40,40,40,40,40,40,40,40, 39,39,39,39,39,39,38,38,38,38,38,38,38,38,38,37,37,37,37,37,37, 36,36,36,36,36,36,36,36,36,35,35,35,35,35,35,35,35,35,35,35,35, 35,35,34,34,34,34,34,34,34,34,34,33,33,33,33,33,33,32,32,32,32, 32,32,32,32,31,31,31,31,31,30,30,30,30,30,30,30,30,30,30,30 }; const int n4c2w1_a[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,99,98,98,98,98,98,98,98,97,96,96, 96,95,95,95,95,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,93, 92,92,92,92,92,92,91,91,91,91,91,91,90,90,90,90,90,90,90,90,89, 89,88,88,88,88,88,88,87,87,87,87,86,86,86,85,85,85,85,85,84,84, 84,84,83,83,83,83,83,82,82,82,82,82,81,81,81,81,81,81,80,80,80, 80,80,79,79,79,79,78,78,78,78,78,78,78,77,77,76,76,76,76,75,75, 75,75,75,75,74,74,74,73,73,72,72,72,72,72,72,71,71,71,71,71,71, 70,70,69,69,69,68,68,68,68,68,68,68,68,67,66,66,66,66,66,66,65, 65,65,65,65,64,64,64,64,64,64,64,63,63,63,63,63,62,62,61,61,61, 61,61,61,60,60,60,59,59,59,59,59,59,58,58,58,58,58,58,58,57,57, 57,57,57,57,57,57,56,56,56,56,55,55,55,55,55,55,55,55,55,54,54, 54,54,54,53,53,53,53,53,53,53,53,53,52,52,52,52,51,51,50,50,50, 50,50,50,50,49,49,49,49,49,49,49,48,48,48,48,48,47,47,47,46,46, 46,46,45,45,45,45,45,45,45,45,45,45,45,44,44,44,44,43,43,43,43, 43,43,42,42,42,42,41,41,41,41,41,41,41,40,40,40,39,38,38,38,38, 37,37,37,37,36,36,36,36,36,35,35,35,35,35,35,34,34,34,34,34,33, 33,33,33,33,33,33,33,32,32,32,32,32,32,32,31,30,30,30,30,29,29, 29,29,29,29,29,28,28,28,28,28,28,28,28,27,27,27,26,26,26,26,26, 25,25,25,25,25,24,24,24,24,24,24,24,24,24,24,23,22,22,22,22,22, 21,21,21,21,21,21,20,20,20,20,20,19,19,19,19,19,19,18,18,18,17, 17,17,17,17,16,16,16,15,15,15,15,15,14,14,14,14,14,14,13,13,13, 13,13,13,12,12,12,12,12,12,12,12,12,11,11,11,10,10,10,10,10,10, 10,9,9,9,9,9,8,8,8,8,8,8,7,6,6,6,6,6,6,6,5,5,5,4,4,4,4,4,3,3, 3,3,3,3,2,2,2,1,1,1 }; const int n4c2w1_b[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,99,98,98,98,98,98,97,97,97,97,96,96,96, 96,95,95,95,95,95,95,95,94,94,94,94,93,93,93,93,93,93,92,92,92, 92,91,91,90,90,90,90,90,90,90,89,89,89,89,88,88,88,88,87,87,87, 86,86,86,86,86,86,86,86,86,85,85,85,85,85,84,84,84,84,84,84,83, 83,83,83,83,83,83,82,82,82,82,82,82,81,81,81,81,80,80,79,79,79, 79,79,79,79,79,78,78,78,78,78,78,78,78,77,77,77,77,77,77,77,77, 76,76,76,76,76,75,75,75,75,75,75,75,74,74,74,74,73,73,73,73,72, 72,72,72,72,71,71,71,71,71,71,70,70,69,69,69,69,69,69,69,69,68, 68,68,68,68,68,67,67,67,67,66,66,65,65,65,65,65,65,65,64,64,64, 63,63,62,62,62,62,62,62,61,61,61,61,61,61,61,61,61,61,61,60,60, 60,60,60,60,60,59,59,59,59,59,59,58,58,58,58,58,58,58,57,57,57, 57,56,56,56,56,56,56,56,56,55,55,55,55,54,54,54,54,53,53,53,53, 53,53,53,52,52,52,52,52,51,51,51,51,51,51,51,50,50,50,49,49,48, 47,47,47,47,47,47,47,47,47,47,46,46,45,45,44,44,44,44,44,43,42, 42,42,42,42,42,41,41,41,40,40,40,40,40,40,40,39,39,39,39,38,38, 38,38,38,38,37,37,36,36,36,36,36,35,35,34,34,34,34,33,33,33,33, 33,33,33,32,32,31,31,31,30,30,29,29,29,29,29,29,28,28,28,28,28, 28,28,27,27,26,26,26,26,26,26,25,25,25,25,24,24,24,24,24,24,24, 24,24,24,23,23,23,23,23,22,22,22,22,22,21,21,21,21,21,20,20,20, 20,20,19,19,18,18,18,18,18,17,17,17,17,17,16,16,16,15,14,14,14, 14,14,14,14,13,13,13,13,13,13,13,13,12,12,12,11,11,11,11,11,10, 10,10,10,10,10,10,9,9,9,9,9,9,9,9,9,9,8,8,8,8,8,7,7,7,7,7,6,6, 6,5,5,5,5,5,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,2,2,2,2,2,2,2,1,1,1, 1 }; const int n4c2w1_c[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,98,98,98,98,98,98,98,98,98,98,98,97,97, 97,97,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,94,93,93, 93,93,92,92,92,92,92,92,92,91,91,91,91,91,90,90,90,90,90,90,90, 90,90,89,89,88,88,88,88,88,88,87,87,87,86,86,86,86,86,85,85,84, 84,84,83,83,83,83,83,83,82,82,82,82,82,81,81,81,80,80,80,80,80, 80,80,80,80,79,79,79,79,79,79,79,78,77,77,76,76,76,75,75,75,74, 74,74,74,73,73,73,73,73,73,73,73,73,73,73,73,73,72,72,72,72,72, 72,71,71,71,71,71,71,70,70,70,69,69,69,69,69,68,68,67,67,67,67, 67,67,67,67,66,66,66,65,65,65,65,65,64,64,64,64,64,63,63,63,63, 63,62,62,62,62,62,62,62,62,62,61,61,60,60,60,60,60,59,59,58,58, 58,58,58,57,57,57,56,56,56,56,56,56,55,55,55,55,55,54,54,54,54, 53,53,53,53,53,52,52,52,52,52,52,51,51,51,51,51,50,50,50,50,50, 49,49,49,49,49,49,49,49,48,48,48,48,47,47,47,47,47,46,46,46,45, 45,45,45,45,45,44,44,44,44,44,44,44,44,44,43,43,43,43,43,42,42, 42,42,42,41,41,41,41,41,41,40,40,40,39,39,39,39,39,39,39,38,38, 38,37,37,37,37,37,37,37,36,36,36,36,36,36,35,35,35,35,35,35,35, 35,35,34,34,33,33,33,33,33,32,32,32,32,32,31,31,31,31,31,31,31, 30,30,30,30,30,30,29,29,29,29,29,29,29,29,28,28,28,28,28,28,28, 27,27,27,26,26,26,26,26,25,25,25,24,24,24,24,24,24,24,23,23,23, 23,23,22,22,22,22,22,21,21,21,21,21,20,20,20,20,20,19,19,19,19, 19,18,18,18,18,17,17,17,16,16,16,16,16,16,15,15,15,14,14,14,14, 14,14,14,14,13,13,13,13,13,12,12,12,12,12,12,11,11,10,9,9,9,9, 9,9,8,8,8,8,8,7,7,7,6,6,6,6,6,5,5,5,5,4,4,4,4,3,3,3,3,2,2,2,2, 2,2,1,1,1,1,1 }; const int n4c2w1_d[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,99,98,98,98,98,97,97,97,97,97,96, 96,96,96,96,96,95,95,95,95,94,94,94,94,94,94,93,93,93,93,93,93, 92,92,92,92,92,91,91,91,91,91,91,91,90,90,90,90,89,89,88,88,88, 87,87,87,86,85,85,85,85,85,85,85,84,84,84,83,83,83,83,82,82,82, 82,82,82,81,81,81,81,80,80,79,79,79,78,78,78,78,78,77,77,77,77, 77,77,77,77,76,76,76,76,76,76,75,75,75,74,74,74,74,73,73,73,73, 73,73,73,72,72,72,72,72,71,71,70,70,70,70,70,70,69,68,68,68,68, 67,67,67,66,66,65,65,65,65,65,64,64,64,64,64,64,64,64,64,64,64, 63,63,63,63,62,62,62,62,61,61,61,60,59,59,59,58,58,58,58,58,58, 57,57,57,57,57,56,56,56,54,54,54,54,54,54,53,53,53,53,53,53,53, 52,52,51,51,51,51,51,51,51,50,50,50,50,49,49,49,48,48,48,48,48, 47,47,47,47,47,47,46,46,46,46,46,46,46,46,46,46,46,46,45,45,45, 45,45,45,45,45,44,44,44,43,43,43,43,43,42,42,42,42,41,41,41,41, 41,41,41,40,40,40,40,40,40,40,40,39,39,39,39,38,38,38,38,38,38, 38,38,38,38,37,37,37,37,36,36,36,36,36,36,35,35,34,34,34,34,33, 33,33,33,33,33,33,32,32,32,32,32,32,31,31,31,31,31,31,31,30,30, 30,30,30,30,30,30,29,29,29,29,28,28,28,28,28,28,28,28,28,28,27, 27,27,26,26,26,26,26,26,26,26,26,26,26,25,25,25,25,25,25,25,25, 24,24,24,23,23,23,23,23,23,23,23,23,23,23,23,22,22,22,21,21,21, 21,21,21,21,20,20,20,20,20,20,20,20,19,19,18,18,18,18,17,17,17, 17,17,16,16,16,16,16,16,16,16,15,15,15,15,14,14,13,13,13,13,12, 12,12,12,12,12,12,12,12,11,11,11,11,11,10,10,10,10,9,9,9,9,8, 8,8,8,8,8,8,8,8,8,7,7,7,7,7,7,7,6,6,6,5,5,5,4,4,4,4,3,3,3,3,3, 2,2,2,2,2,1,1,1 }; const int n4c2w1_e[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,98,98,98,98,97,97,97,97,97,97,97, 96,96,96,96,96,96,96,96,95,95,95,95,95,94,94,94,94,94,93,93,93, 93,93,93,93,93,92,92,92,92,92,92,91,91,90,90,90,90,90,90,90,90, 90,89,89,89,88,88,88,88,88,88,88,87,87,87,87,86,86,86,85,85,84, 84,84,83,83,83,82,82,82,82,81,81,81,81,81,81,81,81,81,80,80,80, 80,80,80,79,79,79,79,78,78,78,78,77,77,77,77,77,76,76,76,76,76, 76,76,75,75,75,75,75,75,75,74,74,74,73,73,73,73,73,73,73,73,72, 72,72,72,72,72,71,71,71,71,71,70,70,70,70,70,69,69,69,69,69,69, 69,68,68,68,68,68,68,68,68,67,67,67,66,66,66,66,65,65,65,64,64, 64,63,63,62,62,62,62,62,62,62,61,61,61,60,60,60,60,60,59,59,59, 59,59,59,59,58,58,58,58,57,57,57,57,56,56,56,56,56,56,56,56,56, 55,55,55,55,55,55,55,55,55,54,54,54,54,54,54,54,54,54,53,53,53, 53,52,52,52,52,51,51,51,51,51,51,51,50,50,50,50,50,49,49,49,49, 49,49,48,48,48,48,47,47,47,47,47,46,46,45,45,45,44,44,44,44,44, 43,43,43,43,43,43,43,42,42,42,42,42,41,41,41,41,41,41,41,40,40, 40,39,39,39,38,38,38,37,36,36,36,36,36,36,36,35,35,35,35,35,35, 35,35,34,34,34,34,34,34,34,33,33,33,33,33,32,32,32,32,32,32,31, 31,31,31,31,30,30,30,30,30,30,30,30,29,29,29,29,29,29,29,29,29, 28,27,27,27,27,27,27,27,27,26,25,25,25,24,24,23,23,23,23,23,22, 22,22,21,21,21,21,21,20,20,20,20,19,19,19,19,19,19,18,18,18,18, 18,18,17,17,17,16,16,16,16,16,16,16,16,16,16,15,15,14,14,14,14, 14,13,13,13,13,13,13,12,12,12,12,12,12,12,12,11,11,11,11,11,10, 10,10,10,10,9,9,9,8,8,8,8,8,8,7,7,7,7,7,6,6,6,6,5,5,5,4,4,4,4, 3,3,3,3,3,3,2,2,2,2,1 }; const int n4c2w1_f[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,99,99,99,99,99,98,98,98,98,98,98,98,98,97,97,96,96,96,96, 95,95,94,94,94,94,94,94,93,93,93,93,93,93,93,93,92,92,92,92,92, 91,91,91,91,90,90,90,90,90,90,89,89,89,89,89,89,89,88,88,88,87, 87,87,87,87,86,86,86,86,86,86,86,86,86,86,85,85,85,85,84,84,84, 84,83,83,83,83,83,83,83,83,82,82,81,81,81,81,81,80,80,80,80,80, 79,79,79,79,79,79,78,77,77,77,76,76,76,76,76,76,75,75,74,74,73, 73,73,73,73,72,72,72,71,71,71,70,70,70,70,70,70,70,70,69,69,69, 69,68,68,68,67,67,67,67,67,66,65,65,65,64,64,64,64,64,64,63,63, 63,63,63,63,63,63,62,62,62,62,62,62,62,61,61,61,61,61,61,61,60, 60,60,60,60,60,60,60,59,59,57,57,57,57,57,56,56,56,56,56,56,55, 55,55,55,55,55,55,54,54,54,54,54,54,54,53,53,53,53,52,52,52,52, 52,52,52,52,51,51,51,51,51,50,50,50,50,50,50,50,50,49,49,49,49, 49,49,49,49,48,48,47,47,47,47,47,46,46,46,46,46,46,46,46,45,45, 45,44,44,44,44,44,43,43,43,43,42,42,42,42,41,41,41,40,40,40,40, 40,39,39,39,39,38,38,38,38,38,37,37,37,37,36,36,36,36,36,35,35, 35,35,35,34,34,34,34,34,34,34,34,34,33,33,33,33,32,32,32,32,32, 31,31,31,31,31,31,31,30,30,30,29,29,29,29,29,29,28,28,28,27,27, 27,27,27,27,26,26,26,26,26,26,25,25,25,25,24,24,24,24,24,24,23, 23,23,23,23,22,22,22,22,21,21,21,21,21,21,20,20,20,20,19,19,19, 19,18,18,18,17,17,17,17,16,16,16,16,16,15,15,15,14,14,14,14,14, 13,13,13,13,13,13,13,12,12,12,12,11,11,11,10,10,10,10,10,10,10, 10,9,9,9,8,8,8,8,8,7,7,7,7,7,7,7,7,7,7,7,7,6,6,6,6,6,6,5,5,5, 5,5,5,5,4,4,4,4,4,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1 }; const int n4c2w1_g[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,100,99,99,99,99,99, 99,99,99,99,98,98,98,98,97,97,97,97,96,96,96,96,96,96,96,96,96, 96,96,95,95,95,94,94,94,94,94,94,94,93,93,93,93,92,92,92,92,92, 92,91,91,91,91,91,90,90,90,89,89,89,89,89,89,88,88,88,88,88,88, 87,87,86,86,86,86,86,85,85,85,84,84,84,84,84,83,83,83,83,83,83, 82,82,82,82,82,82,81,81,81,81,81,80,80,80,79,79,79,79,79,78,78, 78,78,78,77,77,77,77,77,77,77,77,76,76,76,76,75,75,74,74,74,74, 74,73,73,73,73,73,73,72,72,72,72,71,71,71,71,71,70,70,70,70,70, 70,70,69,69,69,69,69,68,68,68,67,67,67,66,66,65,64,64,64,63,63, 63,63,63,62,62,62,62,61,60,60,60,60,59,59,59,59,59,58,58,58,58, 58,57,57,57,57,57,56,56,55,55,55,55,55,54,54,54,53,53,53,53,53, 52,52,52,52,52,51,51,51,51,51,50,50,50,50,49,49,49,49,49,49,48, 48,48,48,47,47,47,47,47,47,47,47,47,46,46,46,46,46,46,46,45,45, 45,45,45,44,44,44,44,44,44,43,43,43,43,42,41,41,41,41,40,40,40, 40,40,39,39,39,38,38,38,38,38,38,38,38,38,37,37,37,37,37,36,36, 36,36,36,36,36,36,36,35,35,35,35,35,34,34,34,34,34,33,33,33,33, 33,33,33,33,32,32,32,32,32,31,31,31,30,30,30,30,30,30,29,29,29, 29,29,29,29,29,29,29,29,28,27,27,27,27,27,27,26,26,26,26,26,26, 26,26,26,25,25,25,25,24,24,24,24,24,24,24,23,22,22,22,22,22,21, 21,21,20,20,20,19,19,19,19,19,19,18,18,18,17,17,17,17,17,17,17, 17,17,17,16,16,16,16,16,15,15,15,14,14,14,14,14,13,13,13,13,13, 13,12,12,12,12,12,11,11,11,11,10,10,10,10,10,10,10,10,9,9,9,9, 9,9,9,9,8,8,8,8,8,8,8,7,7,7,7,6,6,6,5,5,5,4,4,4,4,3,3,3,2,2,2, 2,2,2,2,1,1,1,1,1,1 }; const int n4c2w1_h[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,99,98,98,98,98,98,97,97,97,97,97, 96,96,96,96,96,96,96,96,96,96,96,95,95,94,94,94,94,94,93,93,93, 93,93,93,92,92,92,91,91,91,91,90,90,90,89,89,89,89,89,88,88,88, 88,87,87,87,87,86,86,86,86,85,85,85,85,85,85,84,84,84,84,84,84, 84,84,83,83,83,82,82,82,82,81,81,81,81,81,81,81,80,80,80,80,80, 80,80,79,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,78, 77,77,77,77,77,77,77,77,76,76,76,76,76,74,74,74,74,74,73,73,73, 73,73,73,72,72,72,71,71,71,71,70,70,70,70,70,70,70,69,69,69,69, 69,69,68,68,68,68,68,67,67,67,67,67,66,66,66,65,65,65,65,64,64, 64,64,63,63,63,63,63,63,63,63,63,63,62,62,62,62,62,62,61,61,61, 61,61,61,60,60,60,60,60,60,60,60,59,58,58,58,58,57,57,56,56,56, 56,55,55,55,54,54,54,54,54,54,54,53,53,53,53,53,53,53,52,52,52, 52,52,52,52,52,52,51,51,51,51,50,50,50,50,50,49,49,48,48,48,47, 47,46,46,46,46,46,46,46,45,45,44,43,43,43,43,42,42,42,42,42,42, 41,41,41,41,40,40,40,40,39,39,39,39,39,39,38,38,38,38,38,38,38, 38,37,37,37,37,37,37,37,36,36,36,36,35,35,35,35,35,35,35,34,34, 34,34,34,34,33,33,33,33,32,32,32,32,32,32,32,32,31,31,31,31,30, 30,30,30,30,30,29,29,29,29,29,28,28,28,28,28,27,27,27,27,26,26, 26,26,26,26,26,26,26,25,25,25,24,24,24,24,24,23,23,23,23,23,23, 23,22,22,22,22,21,21,21,20,20,20,19,19,19,19,19,19,18,18,18,18, 18,18,18,17,17,17,17,17,17,16,16,16,16,16,15,15,15,15,14,14,14, 13,13,12,12,12,12,12,12,12,11,11,11,11,11,11,10,10,10,9,9,9,9, 9,8,8,8,8,7,7,7,6,6,6,6,6,6,6,6,6,5,5,5,5,5,5,4,4,3,3,3,3,2,2, 2,2,2,1,1,1,1,1 }; const int n4c2w1_i[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,99,99,99,99,99,98,98,98, 98,98,98,98,97,97,97,96,96,96,96,96,96,96,96,95,95,95,95,94,94, 94,94,94,93,92,92,92,92,91,91,91,91,91,91,90,90,90,90,90,89,89, 89,89,89,88,88,88,88,88,87,87,87,86,86,86,86,85,85,85,85,84,84, 84,84,84,84,83,83,83,83,83,83,82,82,82,82,82,82,82,82,81,81,81, 81,81,80,80,80,80,79,79,79,79,78,78,78,77,77,77,76,76,75,75,74, 74,74,74,74,73,73,73,72,72,72,72,72,72,72,72,71,71,71,71,71,70, 70,70,70,70,70,70,70,69,69,69,69,68,68,67,67,67,67,67,67,67,66, 66,66,65,65,65,65,64,64,64,64,64,64,64,64,64,64,63,63,63,63,63, 63,63,62,62,62,62,62,61,61,61,61,61,60,60,60,59,59,58,58,58,58, 58,58,57,57,57,57,56,56,56,56,55,55,55,55,55,55,54,54,54,54,53, 53,53,52,52,52,52,52,51,51,51,51,51,50,50,50,50,50,50,50,50,50, 49,49,49,48,48,48,47,47,47,47,47,47,46,46,46,46,46,45,45,45,45, 44,44,44,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42,41,41,41, 41,41,41,40,40,40,40,40,40,40,39,39,39,39,39,38,38,38,38,37,37, 37,37,37,36,36,36,36,36,36,36,36,35,35,34,34,34,34,34,34,34,34, 33,33,33,33,33,32,32,31,31,31,31,31,31,30,29,29,29,28,28,28,28, 28,28,28,27,27,27,27,26,26,26,26,26,26,26,26,25,25,25,25,25,25, 24,24,24,24,24,24,24,24,24,23,23,23,22,22,22,21,21,21,21,21,21, 20,20,20,20,20,20,19,19,19,19,18,18,18,18,18,18,18,18,18,18,17, 17,17,17,17,16,16,16,16,16,15,15,15,15,15,14,14,14,14,14,13,13, 13,13,13,12,12,12,12,11,11,11,11,11,11,10,10,10,10,10,9,9,9,8, 7,7,7,7,7,7,7,7,7,6,6,6,5,5,5,5,5,5,5,5,5,4,4,3,3,3,3,3,2,2,2, 2,2,2,2,2,2,1,1 }; const int n4c2w1_j[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,98,98,98,98,97,97,97,97,97,97,96,96,96, 96,95,95,94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,92,92, 92,92,91,91,91,90,90,89,89,89,89,89,89,89,89,88,88,88,87,87,87, 87,86,86,86,86,85,85,85,85,85,84,84,83,83,83,82,82,82,82,82,82, 81,81,81,81,81,81,81,81,80,80,80,80,80,80,80,79,79,79,79,78,78, 78,78,78,78,78,78,77,77,76,76,76,76,76,76,75,75,75,75,75,75,75, 75,74,74,74,74,73,73,73,73,73,73,73,72,72,72,72,72,72,72,72,72, 71,71,70,70,70,69,69,69,69,69,68,68,67,67,67,67,66,66,66,66,66, 66,66,65,65,65,65,65,65,64,64,64,64,63,63,62,62,61,61,61,60,60, 60,59,59,59,59,59,58,58,58,58,58,58,58,58,58,57,57,57,57,57,57, 56,56,55,55,55,55,55,55,54,54,54,53,53,53,52,52,52,52,52,51,51, 51,51,51,51,51,51,50,50,50,49,49,49,49,49,49,48,48,48,48,48,48, 47,47,47,47,47,47,46,45,45,45,45,45,44,44,44,44,44,44,43,43,43, 42,42,42,42,42,42,41,41,41,41,41,41,41,41,40,40,40,40,40,40,39, 39,39,39,39,39,39,39,38,38,37,37,37,37,37,37,36,36,36,36,36,36, 36,36,36,36,35,35,35,35,34,34,33,33,33,33,33,33,32,32,32,32,32, 31,30,30,30,30,30,30,30,30,30,29,29,29,29,29,29,29,29,28,28,28, 28,27,27,27,27,26,26,26,25,25,25,25,25,24,24,24,24,24,23,23,23, 22,22,22,22,21,21,21,21,21,20,20,20,20,20,20,20,20,19,19,19,19, 18,18,18,18,18,17,17,17,17,17,17,16,16,16,16,15,15,15,15,14,14, 14,14,13,13,13,13,13,13,12,12,12,12,12,12,11,11,11,11,10,10,10, 10,9,9,9,9,9,9,9,9,9,9,8,8,8,8,8,8,8,8,8,8,8,8,7,7,7,7,7,6,6, 6,6,6,5,5,5,5,5,4,4,4,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1 }; const int n4c2w1_k[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,98,98,98,97,97,97,97,97,96, 96,96,96,95,95,95,95,95,95,95,95,94,94,94,94,94,93,93,93,93,93, 92,92,92,92,92,91,91,91,91,91,90,90,90,89,89,88,88,88,88,88,88, 88,88,88,87,87,86,86,86,86,86,85,85,85,85,85,85,85,85,85,84,84, 84,84,83,83,83,83,83,83,82,82,82,82,82,81,81,81,81,80,80,80,80, 80,79,79,79,79,79,79,78,78,78,78,78,77,77,77,77,77,77,76,76,76, 76,76,76,75,75,75,75,75,74,74,74,74,74,74,73,73,73,73,72,72,71, 71,71,71,70,70,70,70,69,69,69,69,68,68,68,67,67,66,66,66,66,66, 66,66,66,65,65,65,64,64,64,64,64,64,64,64,64,64,64,63,63,63,62, 62,62,62,62,61,61,61,61,61,60,60,60,60,60,59,59,59,59,59,58,58, 57,57,57,57,56,56,56,56,56,56,56,56,55,55,55,55,55,55,55,55,54, 54,54,54,53,53,53,53,53,53,53,53,52,52,52,52,52,52,52,51,51,51, 50,50,50,50,50,50,50,49,49,49,49,48,48,48,48,48,48,48,48,47,47, 46,46,46,46,46,45,45,45,45,45,45,45,44,44,44,44,44,44,44,44,44, 44,43,43,43,42,42,42,42,41,41,41,40,40,40,40,39,39,39,39,39,39, 39,39,38,37,37,37,37,37,36,36,36,36,36,35,35,35,35,34,34,34,34, 33,33,33,32,32,32,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30, 29,29,29,28,28,28,28,28,28,28,27,27,27,27,27,27,27,27,26,26,26, 26,26,26,26,26,25,25,25,25,25,25,24,24,24,24,24,23,23,22,22,22, 22,22,22,22,21,21,21,21,20,20,20,20,20,20,20,19,19,19,19,19,19, 19,18,18,18,18,18,17,17,16,16,16,16,16,15,15,15,14,14,13,13,12, 12,12,12,12,11,11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10, 10,9,9,9,8,8,8,8,7,6,6,6,6,6,6,6,6,5,5,5,5,4,4,4,4,3,3,3,3,3, 3,3,2,2,2,2,1,1,1,1,1 }; const int n4c2w1_l[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,99,99,99,98,98,98,97,97,96,96,95,95,95, 95,95,95,95,95,94,94,94,94,93,93,93,93,93,93,93,92,92,92,92,92, 92,92,91,91,90,90,90,89,89,89,89,88,88,88,87,87,87,87,87,87,87, 86,86,86,86,86,86,85,85,85,85,85,85,85,85,85,84,84,84,84,84,84, 84,84,84,83,83,83,83,83,83,83,82,82,82,81,81,81,81,80,80,80,80, 79,79,79,79,78,78,78,78,78,77,77,77,77,76,76,76,76,75,75,75,75, 74,74,74,73,73,73,73,73,72,72,71,71,71,71,71,71,70,70,70,70,70, 70,70,70,69,69,69,69,69,69,69,69,69,69,68,68,68,68,68,68,67,67, 67,66,66,66,65,65,64,64,64,64,64,63,63,63,62,62,62,62,62,62,62, 62,62,61,61,61,61,61,60,60,60,60,60,59,59,59,59,59,59,58,58,58, 58,58,58,57,57,57,57,57,56,56,56,56,56,56,56,56,55,55,55,55,55, 55,55,55,54,54,54,54,54,54,54,53,53,53,52,52,52,52,52,51,51,50, 50,50,50,49,49,49,49,49,49,49,48,48,48,48,48,48,47,47,47,47,47, 46,46,46,46,46,46,46,45,45,45,44,44,44,43,43,42,42,42,42,41,41, 41,41,41,40,40,40,40,40,40,40,40,39,39,39,39,39,39,38,38,38,38, 38,38,37,37,37,37,37,36,36,36,36,35,35,35,35,34,34,34,34,33,33, 33,32,32,32,32,32,32,32,31,31,31,31,31,31,31,30,30,30,30,30,30, 30,29,29,29,29,29,29,29,29,28,28,28,27,27,27,26,26,26,26,26,25, 25,25,25,24,24,24,24,24,24,24,23,23,23,23,22,22,22,22,22,22,21, 21,21,21,21,21,21,21,20,20,20,20,20,20,20,19,19,19,19,18,18,18, 18,18,18,17,17,17,17,17,16,16,16,16,16,15,14,13,13,13,13,12,12, 12,12,12,11,11,10,10,10,10,9,9,9,9,9,9,8,8,8,8,7,7,7,7,6,6,5, 5,5,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,2,2,2,2,2,2,1,1,1,1,1,1, 1,1,1 }; const int n4c2w1_m[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,99,98,98,98,97,97, 97,97,96,96,96,96,96,96,96,95,95,95,95,94,94,94,94,93,93,93,93, 93,93,93,93,93,93,93,92,92,91,91,91,91,90,90,90,90,89,89,89,89, 89,89,89,89,89,88,88,88,88,87,87,87,87,86,86,86,86,86,86,86,86, 86,85,85,85,85,85,85,84,84,84,83,83,83,83,82,82,82,82,82,82,81, 81,81,81,80,80,80,80,80,80,79,79,79,78,78,78,78,77,77,77,77,77, 77,77,76,76,76,76,76,75,75,75,75,75,75,75,74,74,74,74,74,73,73, 73,72,72,72,72,72,72,72,71,71,71,71,71,71,70,70,70,70,69,69,68, 68,68,68,68,68,68,68,67,67,67,67,67,67,66,66,66,66,66,66,66,66, 65,65,65,65,65,64,64,64,64,63,63,63,63,62,62,62,61,61,61,60,60, 60,60,60,60,60,60,60,60,60,60,59,59,59,59,59,58,58,58,57,57,57, 57,57,57,57,56,56,55,55,55,55,55,54,54,54,54,54,54,54,53,53,53, 53,53,53,52,52,52,52,52,51,51,51,51,51,51,51,51,50,50,50,50,50, 49,49,49,49,49,49,49,49,48,48,48,48,48,48,47,47,47,46,46,46,45, 45,45,45,44,44,44,44,44,44,44,43,43,43,42,42,42,41,41,41,41,40, 40,39,39,39,39,38,38,38,38,38,38,37,37,37,37,36,36,36,36,36,36, 35,35,34,34,34,34,34,33,33,33,33,33,32,32,32,32,32,32,32,31,31, 31,30,30,30,30,30,30,29,29,29,28,28,28,28,28,28,28,28,27,27,27, 27,26,26,26,26,26,26,26,26,26,26,25,25,25,25,25,24,24,24,23,23, 23,23,22,22,22,21,21,21,21,20,20,20,20,20,20,20,20,20,19,19,19, 19,18,18,18,18,18,17,17,17,17,17,17,17,16,16,16,15,15,15,15,15, 14,14,14,14,14,14,14,13,13,13,13,13,13,12,12,12,12,11,11,11,11, 10,10,10,10,10,9,9,9,9,9,9,8,8,8,8,8,8,8,7,7,7,7,7,6,6,6,5,5, 5,5,5,5,5,4,3,3,2,2,1,1,1 }; const int n4c2w1_n[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,99,98,98,98,98,98,97,97,96,96,96, 96,95,95,95,94,94,94,94,94,93,93,93,93,93,93,92,92,92,91,91,91, 91,91,91,91,90,90,90,89,89,88,88,88,88,88,88,88,88,87,87,87,87, 87,87,87,87,87,86,86,86,86,86,86,86,85,85,84,84,84,84,83,83,83, 83,83,82,82,82,82,82,81,81,81,81,80,80,80,80,80,80,79,79,79,79, 78,78,78,78,78,78,78,77,77,76,76,75,75,75,75,75,75,75,75,75,74, 74,74,74,74,74,74,74,73,73,73,73,73,72,72,72,72,72,71,70,70,69, 69,69,69,69,69,69,68,68,68,68,67,67,67,67,67,67,66,66,66,66,66, 66,65,65,65,65,65,64,64,64,64,64,64,64,64,64,63,63,63,63,63,63, 63,62,62,62,62,61,61,61,61,61,61,61,60,60,60,60,59,59,59,59,59, 59,58,58,58,58,58,57,57,57,57,56,56,56,56,56,56,56,55,55,55,54, 54,54,54,53,53,52,52,52,52,52,52,52,51,51,51,51,51,50,50,50,50, 50,50,50,49,49,49,49,48,48,48,48,48,48,48,48,48,47,47,47,47,47, 47,47,47,47,46,46,46,46,46,46,45,45,45,45,44,44,44,44,44,44,43, 43,43,43,42,42,42,41,41,41,41,41,40,40,40,40,40,40,39,39,39,39, 39,39,39,38,38,38,38,38,38,37,37,37,37,37,36,36,36,35,35,35,35, 34,34,34,33,33,33,32,32,32,32,32,31,31,31,31,31,31,30,30,30,30, 30,30,30,29,29,29,29,29,28,28,27,27,27,27,27,27,26,26,25,25,25, 25,25,25,25,25,24,24,24,24,24,24,24,24,24,23,23,22,22,22,22,21, 21,21,21,21,20,20,20,20,20,19,19,19,19,18,18,18,18,18,17,17,17, 17,17,17,16,16,16,16,16,16,15,15,15,15,15,14,14,14,14,14,13,13, 13,13,13,13,12,12,12,12,11,11,11,11,11,11,11,10,10,10,10,10,10, 9,9,9,9,9,9,9,8,8,8,8,7,7,7,7,6,6,6,5,5,5,5,5,4,4,4,4,3,3,3,3, 2,2,2,2,2,1,1,1,1 }; const int n4c2w1_o[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,98,98,98,98,98,97,97,97,97, 96,96,96,96,96,96,96,96,95,95,95,95,94,94,93,93,93,93,93,93,93, 92,92,92,92,92,92,91,91,91,91,90,90,90,90,90,89,89,89,89,89,88, 88,88,88,87,87,87,87,86,86,85,85,85,85,84,84,84,84,83,83,83,82, 82,82,82,81,81,81,81,81,81,81,81,81,81,81,81,81,80,80,80,79,79, 79,79,79,79,79,79,79,78,78,78,78,77,77,77,77,77,77,76,76,76,76, 76,76,76,75,75,74,74,74,74,74,74,74,74,73,73,73,73,72,72,72,72, 72,72,72,72,71,71,71,71,71,71,71,71,71,71,70,70,70,70,70,70,70, 69,69,69,69,69,68,67,67,66,66,65,65,65,65,65,65,65,64,64,63,63, 63,63,63,63,63,63,63,63,63,62,62,62,61,61,61,61,61,61,60,60,60, 60,59,59,59,59,59,59,58,58,58,58,58,57,57,57,56,56,56,56,56,56, 56,56,55,55,55,55,55,54,54,54,54,54,53,53,53,53,53,53,53,52,51, 51,50,50,50,50,49,49,49,48,48,47,47,47,47,47,47,47,47,47,47,47, 47,46,46,46,46,46,45,45,45,45,44,44,44,44,44,43,43,43,43,42,42, 42,42,42,42,42,42,41,41,41,40,40,39,39,39,39,39,38,38,38,38,38, 37,37,37,37,37,36,36,36,36,36,36,35,35,35,35,35,35,34,34,34,34, 34,34,33,33,33,33,33,32,32,32,32,31,31,31,31,30,30,30,30,30,29, 29,29,29,29,29,29,29,29,28,28,28,28,28,27,27,27,27,27,27,26,26, 26,26,26,25,25,25,25,25,25,25,25,24,24,24,24,24,24,24,23,22,22, 22,22,21,21,21,21,21,21,20,19,19,19,19,19,18,18,18,18,18,17,17, 17,17,17,17,16,16,16,16,15,15,15,15,14,14,14,14,14,13,13,13,13, 13,12,12,12,12,12,12,12,11,11,11,11,11,10,10,10,10,9,9,9,9,8, 8,8,7,7,6,6,6,6,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,2,2,2, 1,1,1,1,1,1,1,1 }; const int n4c2w1_p[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,99,98,98,98,97,97, 97,96,96,96,96,96,96,96,95,95,95,95,95,94,94,93,93,93,92,92,92, 92,92,92,92,91,91,90,90,90,90,90,90,90,89,89,89,89,89,88,88,88, 87,87,87,87,87,86,85,85,85,85,85,85,85,85,84,84,84,84,84,84,84, 84,83,83,83,83,83,82,82,82,82,82,82,81,81,81,81,81,81,81,80,80, 80,79,79,78,78,78,78,78,78,78,77,77,77,77,77,76,76,76,76,76,76, 76,75,75,75,74,74,74,74,74,74,74,74,73,73,72,72,72,71,71,71,70, 70,70,70,70,70,70,70,69,69,69,69,69,69,68,68,68,68,68,68,68,68, 68,68,67,67,67,67,66,66,66,66,66,66,66,65,65,65,65,65,64,64,64, 64,64,64,64,63,63,63,63,63,62,62,62,62,61,61,61,61,60,60,60,60, 59,59,59,59,59,58,58,58,57,57,57,57,56,56,55,55,55,55,55,55,54, 54,54,54,54,53,53,53,53,53,53,53,53,53,53,53,53,53,53,52,52,52, 51,51,51,51,51,51,51,50,50,50,50,50,50,49,49,49,49,49,48,48,48, 48,48,48,48,47,47,47,47,47,47,47,47,46,46,46,46,46,45,45,45,45, 44,44,44,44,44,44,44,43,43,43,43,42,42,42,42,42,41,41,41,41,41, 40,40,40,39,39,38,38,38,38,38,38,37,37,37,37,36,36,36,35,35,35, 35,35,35,35,34,34,34,34,34,33,33,33,32,32,32,32,31,31,31,31,31, 30,30,30,30,29,29,29,29,29,29,28,28,28,27,27,26,26,26,26,26,26, 26,26,26,26,25,25,24,24,24,24,24,24,23,23,23,23,23,23,23,23,22, 22,22,21,21,21,20,20,20,19,19,19,19,19,19,18,18,17,17,16,16,16, 16,16,16,15,15,15,15,15,15,14,14,14,14,14,14,14,14,13,13,13,13, 13,13,13,13,13,13,12,12,12,12,11,11,11,11,11,11,11,11,10,9,9, 9,9,8,8,8,8,8,8,7,7,7,7,6,6,6,6,6,5,5,5,5,5,4,4,3,3,3,3,3,3,2, 2,2,2,2,2,2,2,1,1,1 }; const int n4c2w1_q[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,98,98,98,98,98,98,98,98, 97,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,95,95,95,95, 95,94,94,94,94,94,94,94,93,93,93,92,91,91,91,91,90,90,89,89,89, 89,89,89,89,89,88,88,88,88,88,88,87,87,87,87,86,86,86,86,85,85, 85,85,85,85,85,84,84,84,84,84,84,84,84,84,83,83,83,83,82,82,81, 81,81,80,80,80,79,79,79,78,78,77,77,77,77,77,76,76,76,75,75,75, 75,75,75,74,74,74,74,73,73,73,73,73,73,73,73,72,72,72,72,72,72, 72,72,72,72,71,71,71,71,71,71,71,70,70,69,69,69,69,69,68,68,68, 67,67,67,66,66,66,66,66,65,65,65,65,65,65,64,64,64,64,63,63,63, 63,62,62,62,61,61,61,61,61,61,61,61,61,60,60,60,60,60,60,59,59, 59,59,59,59,59,58,58,58,58,58,57,56,56,56,56,55,55,55,55,55,55, 55,54,53,53,53,53,53,52,52,52,52,52,52,52,52,52,52,51,51,51,51, 51,51,51,50,50,49,49,49,48,48,48,48,48,48,48,48,47,47,47,46,46, 46,46,46,45,45,45,45,44,44,44,44,44,44,44,44,44,43,43,43,43,42, 42,42,41,41,41,41,41,40,40,40,40,40,39,39,39,39,39,39,39,39,38, 38,38,37,37,37,37,36,36,36,36,35,35,35,34,34,34,34,34,34,34,33, 33,33,33,33,33,33,32,32,32,32,31,31,31,31,30,30,30,30,29,29,29, 29,29,29,28,28,28,28,28,28,27,27,27,27,27,26,26,25,25,25,25,24, 24,24,23,23,23,23,23,23,23,23,22,22,22,22,22,22,21,21,21,21,20, 20,20,20,20,19,19,19,19,19,19,19,19,19,19,18,18,18,18,17,17,17, 17,17,17,17,16,16,16,15,15,15,14,14,14,13,12,12,12,12,11,11,11, 10,10,10,10,10,10,10,9,9,9,9,9,9,9,9,9,8,8,8,8,8,7,7,7,7,7,7, 7,7,7,7,6,6,5,5,5,5,5,5,4,4,4,4,4,3,3,3,3,3,2,2,2,2,2,1,1,1,1, 1,1,1,1 }; const int n4c2w1_r[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,98,98,98, 98,97,97,97,97,97,97,97,96,96,96,96,96,96,95,95,95,95,95,94,93, 93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,91,91,91,91,91,90, 90,89,89,89,89,89,89,89,88,88,87,87,87,87,87,87,86,86,86,86,86, 86,86,86,86,86,86,85,85,85,83,83,83,83,83,82,82,82,82,82,82,81, 80,80,80,80,79,79,79,78,78,78,78,78,78,77,77,77,77,77,76,76,76, 76,76,76,76,76,75,75,75,75,75,75,74,74,74,73,73,73,73,72,72,71, 71,71,71,71,70,70,70,70,70,69,69,69,69,69,69,69,68,68,67,66,66, 65,65,65,65,65,65,64,64,64,64,64,63,63,63,63,63,63,62,62,62,62, 62,61,61,61,61,61,61,61,61,61,61,61,60,60,60,60,60,60,60,59,59, 59,59,59,59,58,58,58,58,58,57,57,57,57,56,56,56,56,56,56,55,55, 55,55,55,54,54,54,53,53,53,53,53,53,52,52,52,52,52,52,51,51,51, 51,51,50,50,49,49,49,49,49,48,48,48,48,48,48,48,48,47,47,47,46, 46,45,45,45,45,45,45,45,45,45,45,45,45,44,43,43,43,43,43,43,43, 42,42,42,42,42,42,42,42,42,41,41,41,41,40,40,40,40,40,40,39,39, 39,39,39,39,39,38,38,38,37,37,37,37,37,37,37,36,36,36,36,36,36, 35,35,35,35,34,34,34,34,34,34,34,33,33,33,33,32,32,32,31,31,31, 31,31,30,30,30,29,29,29,29,29,28,28,28,28,28,27,27,27,27,27,27, 27,26,26,26,26,26,25,25,25,25,25,24,24,24,24,24,24,24,24,23,23, 22,22,22,22,21,21,21,20,20,20,19,19,19,19,19,19,18,18,18,18,17, 17,17,16,16,16,16,16,16,16,15,15,15,15,14,13,13,13,13,12,12,12, 12,12,12,12,12,12,11,11,11,10,10,10,10,10,10,10,9,9,8,8,8,7,7, 7,7,7,7,7,7,7,6,6,6,5,5,5,5,5,5,4,4,4,4,4,4,4,3,3,3,3,3,3,3,2, 1,1,1,1,1,1,1,1 }; const int n4c2w1_s[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,99,99,99,98,98,98,98,97,97,97,97,96,96,96,96,96,96, 95,95,95,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,93,92,91, 91,91,91,91,90,90,90,90,90,90,89,89,89,89,89,88,88,88,88,88,88, 88,88,87,87,87,86,86,86,85,85,85,85,85,85,85,85,85,84,84,84,84, 83,83,83,83,83,82,82,82,82,82,82,82,81,81,81,81,81,80,80,80,80, 80,80,80,79,79,79,79,78,77,77,77,77,77,76,76,76,75,74,74,74,74, 73,73,73,73,73,73,72,72,72,72,72,72,71,71,71,70,70,70,69,69,69, 68,68,68,68,68,68,68,68,68,67,66,66,66,66,66,66,65,65,65,65,65, 65,65,65,65,65,65,65,64,64,63,63,63,63,63,63,63,63,63,62,62,62, 62,62,62,62,62,62,61,61,61,61,61,61,61,61,61,60,60,60,60,59,59, 59,59,58,58,58,57,57,57,57,56,56,56,56,56,56,55,55,54,54,54,54, 53,53,53,53,53,53,52,52,52,52,51,51,51,51,51,50,50,50,50,49,49, 49,49,48,48,48,47,47,47,47,46,46,46,46,46,46,46,46,45,45,45,45, 45,45,45,44,44,44,44,44,43,43,43,43,43,43,43,43,43,42,42,42,42, 42,42,42,42,41,41,41,41,41,41,40,40,40,40,40,40,40,39,39,39,39, 39,39,38,38,37,37,37,36,36,36,36,36,36,35,35,35,35,35,35,35,34, 34,34,34,34,33,33,33,33,33,33,32,32,32,32,32,32,32,31,31,31,31, 31,31,30,30,30,30,30,29,29,29,29,28,28,28,27,27,27,27,26,26,26, 26,26,26,26,25,25,24,24,24,24,24,24,23,23,23,22,22,22,22,21,21, 21,21,21,20,20,19,19,19,19,19,19,19,19,19,18,18,18,18,17,17,17, 17,17,17,17,17,16,16,16,16,15,15,14,14,14,14,13,12,12,12,12,12, 12,11,11,11,11,11,11,11,11,10,10,10,9,9,9,9,9,9,9,9,9,8,8,8,8, 8,8,8,8,8,7,7,7,7,6,6,6,6,6,6,5,5,5,5,5,5,5,5,4,4,4,3,3,3,2,2, 2,1,1,1 }; const int n4c2w1_t[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,99,99,98,98,98,98,98,98, 97,97,97,97,97,97,96,96,96,96,96,96,96,96,95,95,95,94,94,94,94, 94,94,94,94,93,93,93,93,92,92,92,92,92,92,91,91,91,91,90,90,90, 90,90,89,89,89,89,89,89,89,89,88,88,88,88,87,87,87,87,86,86,85, 85,85,84,84,84,84,84,84,84,84,83,83,83,83,82,82,82,82,82,81,81, 81,81,81,81,81,81,80,80,80,80,79,79,79,79,79,78,78,78,78,77,77, 77,77,76,76,76,75,75,75,75,75,75,75,74,74,74,74,74,73,73,73,72, 72,72,71,71,71,70,70,70,70,69,69,69,69,69,69,68,68,68,67,67,67, 67,67,67,67,67,67,66,66,66,66,66,66,66,65,65,65,65,64,64,64,64, 64,63,63,63,62,62,62,62,61,61,61,61,61,61,61,60,60,60,59,59,59, 59,59,59,58,58,58,58,58,58,57,57,57,57,57,56,56,56,55,55,55,54, 54,54,53,53,53,53,53,53,52,52,52,52,51,51,51,51,51,50,50,50,50, 50,49,49,49,49,49,49,49,49,48,48,48,48,48,47,47,47,46,46,46,46, 46,46,45,45,45,45,44,44,44,44,44,44,44,44,43,43,43,43,43,43,42, 42,42,42,42,42,42,41,41,41,41,41,41,40,40,40,39,39,39,39,38,37, 37,37,37,37,37,37,37,36,36,36,36,36,35,35,34,34,34,34,33,33,33, 33,33,33,33,32,32,32,31,31,31,31,31,31,31,30,30,29,29,29,29,29, 29,27,27,26,26,25,25,25,25,25,25,25,25,24,24,24,24,24,24,24,24, 24,24,23,23,23,23,22,22,22,22,21,21,21,21,21,21,21,21,21,21,20, 20,20,20,19,19,19,19,19,19,18,18,18,18,18,18,18,18,18,17,17,17, 17,17,17,16,16,16,16,15,14,14,14,14,14,14,14,14,13,13,13,13,12, 12,12,12,12,12,12,12,12,11,11,10,10,10,10,9,9,9,9,8,8,8,8,8,8, 7,7,7,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,4,4,4,4,3,3,3,3,3,3,2,2, 2,2,2,2,2,1 }; const int n4c2w2_a[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,99,99,99,99,99,99,98,97,97,97,97, 97,97,97,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95, 95,94,94,94,94,94,94,94,94,94,93,93,93,93,92,92,92,92,92,92,92, 92,92,91,91,91,91,91,91,90,90,90,90,90,89,89,89,89,89,89,89,89, 89,88,88,88,88,88,88,87,87,87,87,87,86,86,86,86,86,86,86,85,85, 85,85,85,85,85,84,84,84,84,84,84,84,83,83,82,82,82,82,82,81,81, 81,81,81,80,80,80,80,80,80,80,79,79,79,79,79,79,78,78,78,78,78, 78,78,77,77,77,77,76,76,76,76,75,75,75,75,75,75,75,75,75,75,74, 73,73,73,73,73,73,73,73,73,73,73,72,72,72,72,72,72,71,71,71,71, 71,71,70,69,69,69,69,69,69,69,69,68,68,68,68,68,67,67,67,67,67, 67,67,67,67,67,66,66,66,66,65,65,65,65,65,65,65,65,64,64,64,63, 63,63,62,62,62,62,62,62,62,62,62,62,61,61,61,61,61,60,60,60,60, 60,59,59,59,59,59,59,59,59,58,58,58,58,58,58,57,57,57,57,57,57, 57,57,57,56,56,56,56,56,56,55,54,54,54,54,54,53,53,53,53,53,52, 52,52,52,52,52,52,52,52,51,51,50,50,50,50,50,50,50,50,50,49,49, 49,49,49,49,48,48,48,48,48,48,48,48,47,47,47,46,46,46,46,46,46, 46,45,45,45,45,45,45,45,45,45,45,44,44,44,44,44,44,43,43,43,43, 43,43,42,42,42,42,41,41,41,41,41,41,41,41,40,40,40,40,40,39,39, 39,39,39,39,39,38,38,38,38,38,37,37,37,36,36,36,35,35,35,35,35, 35,35,34,34,34,34,34,33,33,33,33,33,33,33,33,33,32,32,32,32,32, 32,32,32,31,31,31,31,31,31,30,30,30,30,30,30,30,29,29,29,29,29, 29,29,29,28,28,28,28,28,28,27,27,27,27,27,27,27,26,26,26,26,26, 26,26,26,25,25,25,25,24,24,24,24,24,24,24,24,24,23,23,23,23,23, 23,23,22,22,22,22,22,21,21,21,21,21,21,21,21,20,20,20,20 }; const int n4c2w2_b[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,99,98,98,98,98,98,98,98, 97,97,97,97,97,97,97,97,97,97,97,97,97,97,96,96,96,95,95,95,95, 95,94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,93,93,93,92, 92,92,92,92,91,91,91,91,91,91,90,90,90,90,89,89,89,89,89,89,89, 89,88,88,88,88,88,87,86,86,86,86,86,86,85,85,85,84,84,84,84,84, 84,83,83,83,83,83,83,82,82,82,82,82,82,82,82,81,81,81,81,81,81, 81,81,80,80,79,79,79,79,79,79,79,79,78,78,78,78,78,77,77,77,77, 77,77,77,76,76,76,76,76,76,76,76,76,75,75,75,74,74,74,74,74,74, 74,74,74,73,73,73,73,72,72,72,72,72,72,72,71,70,70,70,70,70,69, 69,69,69,69,69,69,69,69,69,69,68,68,68,68,68,68,67,67,67,67,67, 67,67,66,66,66,66,66,66,65,65,65,65,65,65,65,64,64,64,64,63,63, 63,63,63,63,63,63,62,62,62,62,62,61,61,61,61,61,61,60,60,60,60, 60,59,59,59,59,59,59,59,58,58,57,57,57,56,56,56,56,56,56,56,55, 55,55,55,55,55,55,55,54,54,54,54,54,53,53,53,53,53,53,53,53,52, 52,52,52,52,52,52,51,51,51,51,51,51,51,50,50,50,50,50,50,50,50, 50,50,49,49,49,49,49,49,48,48,48,48,48,48,48,48,47,47,47,47,47, 47,47,47,47,47,46,46,46,46,45,45,45,44,44,44,43,43,42,42,42,42, 42,41,41,41,41,41,41,41,41,41,41,40,40,40,39,39,39,39,39,38,38, 38,38,37,37,37,37,37,37,37,37,37,37,36,36,36,36,36,36,35,35,35, 35,35,35,35,34,34,34,34,34,33,33,33,33,33,33,33,33,33,32,32,32, 32,31,31,31,31,31,31,31,30,30,30,30,30,30,29,29,29,28,28,28,28, 28,28,28,28,28,27,27,27,27,27,27,27,26,26,26,26,26,26,25,25,25, 25,25,25,25,25,25,25,25,24,24,24,24,24,24,24,24,23,23,23,23,23, 23,23,23,22,22,22,22,22,22,21,21,21,21,20,20,20,20,20,20 }; const int n4c2w2_c[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,99,98,98,98,98,98,98,98,98,98,97, 97,97,97,97,97,96,96,96,95,95,95,95,95,95,95,95,94,94,94,94,94, 94,93,93,93,93,93,93,93,92,92,92,92,92,92,92,91,91,91,91,91,91, 90,90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,89,88,88,88,88, 88,88,88,87,87,87,86,86,86,86,86,85,85,85,85,85,84,84,84,84,84, 84,83,83,83,83,83,83,83,82,82,82,82,81,81,81,81,81,81,81,80,80, 80,80,78,78,78,78,78,78,78,78,78,78,77,77,77,76,76,76,76,76,76, 76,75,75,75,75,74,74,74,74,74,74,74,73,73,73,73,73,73,73,73,72, 72,72,72,72,72,72,72,72,71,71,71,71,71,71,71,70,70,70,69,69,69, 69,69,68,68,67,67,67,67,67,66,66,66,66,66,66,66,65,65,65,65,65, 65,65,65,65,65,65,65,65,64,64,64,64,64,64,64,64,64,63,63,63,63, 62,62,62,62,62,62,61,61,61,61,61,61,61,60,60,60,60,60,60,59,59, 59,59,59,59,59,59,59,58,58,58,58,58,58,58,58,58,57,57,57,57,57, 56,56,56,56,56,56,56,56,55,55,55,54,54,53,53,53,53,53,53,53,52, 52,52,52,52,51,51,51,50,50,50,50,49,49,49,49,49,49,49,49,48,48, 48,48,48,48,48,47,47,47,47,47,47,47,46,46,46,45,45,45,45,45,45, 45,45,44,44,44,44,44,44,43,43,43,43,43,43,43,43,43,42,42,42,42, 42,42,42,42,41,41,41,41,41,41,41,41,41,40,40,40,40,40,39,39,39, 39,39,38,38,38,38,38,37,37,37,37,37,36,36,36,35,35,35,35,35,35, 35,34,34,34,34,34,34,34,34,34,33,33,33,33,33,32,32,32,32,32,32, 32,32,32,31,31,31,31,31,31,31,31,30,30,30,30,30,30,29,29,29,29, 29,29,29,29,28,28,28,28,28,27,27,27,27,27,27,27,26,26,26,26,26, 26,25,25,25,25,25,24,24,24,24,24,24,24,23,23,23,23,23,23,23,23, 23,22,22,22,22,21,21,21,21,21,21,21,21,21,20,20,20,20,20 }; const int n4c2w2_d[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,99,99,99,99,99,99,99,98,98,98,98,98,98,98,97,97,97,97,97, 97,97,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,94,94, 94,94,94,93,93,93,93,93,92,92,92,92,91,91,91,91,91,90,90,90,90, 90,90,90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,88,88,88,88, 88,88,87,87,87,87,86,86,86,86,86,86,86,86,86,86,85,84,84,84,84, 84,84,84,83,83,83,83,83,83,83,83,83,83,83,82,82,82,82,82,82,82, 82,81,81,81,81,81,81,81,80,80,80,80,80,79,79,79,79,79,79,78,78, 78,78,78,78,78,78,77,77,77,77,77,76,76,76,76,76,76,76,76,75,75, 75,75,75,75,74,74,74,74,74,74,74,74,73,73,73,73,73,73,73,73,72, 72,72,72,72,71,71,71,71,71,71,71,71,70,70,70,70,70,70,70,69,69, 69,68,68,68,68,68,68,67,67,67,67,67,66,66,65,65,65,65,65,64,64, 64,63,63,63,63,62,62,62,62,62,62,61,61,61,61,61,61,60,60,60,60, 60,60,60,59,59,59,59,59,59,59,58,58,58,58,58,57,57,57,57,57,57, 57,56,56,56,55,55,55,55,55,54,54,54,54,54,54,54,54,54,54,53,53, 53,53,53,52,52,52,52,52,52,51,51,51,51,51,51,50,50,50,50,50,50, 50,49,49,49,49,49,49,49,49,48,48,48,48,48,47,47,47,47,47,47,47, 46,45,45,45,45,45,45,45,45,44,44,44,43,43,43,43,43,43,42,42,42, 42,42,42,42,42,42,41,41,41,41,41,40,40,40,40,40,39,39,39,39,39, 39,39,39,39,39,38,38,38,38,38,38,38,38,37,37,37,37,37,37,37,36, 36,36,36,36,36,36,36,36,35,35,35,35,35,35,35,35,35,35,34,34,34, 34,34,33,33,33,33,33,33,33,33,33,32,32,32,32,32,32,32,31,31,31, 31,31,31,31,30,30,30,30,29,29,28,28,28,28,28,28,28,27,27,27,27, 26,26,26,26,26,25,25,25,25,25,24,24,24,24,24,24,24,23,22,22,22, 22,22,22,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20 }; const int n4c2w2_e[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,98,98,98,98,98,98,98,97,97, 97,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,94, 94,94,94,94,93,93,93,93,93,93,93,93,93,92,92,92,92,92,91,91,91, 91,91,91,91,91,91,91,90,90,90,90,89,89,88,88,88,88,88,88,87,87, 87,87,87,86,86,86,86,85,85,85,84,84,84,84,84,84,83,83,83,83,83, 83,83,83,82,82,82,82,82,81,81,81,81,81,80,80,80,80,80,80,79,79, 79,79,79,79,78,78,78,77,77,77,77,77,77,77,77,76,76,76,76,76,76, 76,76,75,75,75,75,75,75,75,75,74,74,74,74,73,73,73,73,73,73,73, 73,72,72,72,72,72,72,72,72,72,71,71,71,71,71,71,71,70,70,70,70, 70,70,70,69,69,69,68,68,68,68,68,68,67,67,67,67,67,67,67,67,67, 66,66,66,66,66,66,66,66,66,66,65,65,65,65,65,65,65,64,64,64,64, 64,63,63,63,63,63,62,62,62,62,62,62,62,62,62,61,61,61,61,61,61, 61,61,61,61,61,61,60,60,60,60,59,59,59,59,59,59,59,58,58,58,58, 58,57,57,57,57,56,56,56,56,56,56,55,55,55,55,55,55,55,55,54,54, 54,54,54,54,54,54,53,53,53,53,53,53,53,53,53,53,52,52,52,52,52, 52,52,51,51,51,51,51,51,51,51,50,50,50,50,50,50,50,50,49,49,49, 49,49,49,49,49,49,48,48,48,47,47,47,47,47,47,47,46,46,46,46,46, 46,45,45,45,45,45,44,44,44,44,44,44,44,43,43,42,42,42,42,41,41, 40,40,40,40,40,39,39,39,39,39,39,39,38,38,38,38,38,37,37,36,36, 36,36,36,36,35,35,35,35,35,35,35,35,35,35,35,35,34,34,34,34,34, 34,34,34,34,34,34,33,33,33,33,33,33,32,32,32,32,32,32,31,31,31, 31,30,30,30,30,30,30,29,29,28,28,27,27,27,27,27,27,27,26,26,26, 26,26,25,25,25,25,25,25,25,25,25,25,24,24,24,24,24,24,24,23,23, 23,23,23,23,23,23,23,22,22,22,22,21,21,21,21,20,20,20,20,20 }; const int n4c2w2_f[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,99, 99,99,99,98,98,98,98,98,98,97,97,97,97,97,96,95,95,95,95,95,94, 94,94,94,94,94,94,93,93,93,93,93,93,93,93,93,93,92,92,92,92,92, 91,91,91,91,91,91,91,91,91,91,90,90,90,90,90,90,90,90,90,90,89, 89,89,89,89,89,89,88,88,88,88,87,87,87,87,87,86,86,86,86,86,86, 86,86,86,86,85,85,85,85,85,85,84,84,84,84,84,83,83,83,83,83,83, 83,83,83,83,83,82,82,82,82,82,82,82,81,81,81,81,81,81,80,80,80, 79,79,79,79,79,79,79,78,78,78,78,78,78,78,77,77,77,77,77,77,77, 76,76,76,76,76,76,75,75,75,75,75,75,75,75,75,74,74,74,74,74,74, 74,74,74,74,73,73,73,73,72,72,72,72,72,72,72,72,72,72,71,71,71, 71,70,70,70,70,70,70,70,69,69,69,69,69,69,68,68,68,68,68,68,68, 68,68,68,67,67,67,67,67,66,66,66,66,66,65,65,65,65,65,64,64,64, 64,63,63,63,63,63,63,62,62,62,62,62,62,62,62,62,61,61,61,61,61, 61,60,59,58,58,58,58,57,57,57,57,57,56,56,56,56,56,56,56,56,56, 56,55,55,55,54,54,54,54,53,53,53,53,52,52,52,52,52,51,51,51,51, 51,51,50,50,50,50,50,50,50,50,50,50,49,49,48,48,48,48,48,48,48, 47,47,46,46,46,46,46,46,46,46,45,45,45,45,45,45,44,44,43,43,43, 43,42,42,42,42,42,42,42,41,41,41,41,41,41,40,40,40,39,39,38,38, 38,38,37,37,37,37,37,37,37,37,37,37,37,37,37,36,36,36,36,36,36, 36,36,36,35,35,35,35,35,35,34,34,34,34,34,34,34,34,34,33,33,33, 33,33,33,32,32,32,32,32,32,32,32,31,31,31,31,31,31,30,30,30,30, 30,29,29,29,29,29,28,28,28,28,28,28,28,28,28,27,27,27,27,27,26, 26,26,26,25,25,25,25,25,25,25,25,24,24,24,23,23,23,23,23,23,23, 23,23,22,22,22,22,22,22,22,22,22,21,21,21,21,21,20,20,20,20 }; const int n4c2w2_g[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,99,99,99,99,98,98,98, 98,98,98,97,97,97,97,97,97,96,96,96,96,96,95,95,95,95,95,95,95, 95,95,95,95,94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,92, 92,92,91,91,91,91,90,90,90,90,90,90,90,89,89,89,89,89,89,88,88, 88,88,88,88,88,87,87,87,87,86,86,86,86,85,85,85,85,85,85,85,84, 84,84,84,84,84,83,83,83,83,83,82,82,82,81,81,81,81,80,80,80,80, 79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,77,77,77,77,77,76, 76,76,76,75,75,75,75,75,75,75,75,74,74,74,74,74,74,73,73,73,72, 72,72,72,72,72,71,71,71,71,71,71,70,70,70,70,70,69,69,69,69,69, 69,69,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,68,67,67,67, 67,66,66,66,65,65,65,65,65,65,65,65,65,64,64,64,64,64,64,63,63, 63,63,63,63,63,63,63,63,63,62,62,62,62,62,61,61,61,60,60,60,60, 60,60,59,59,59,59,59,59,59,59,59,59,58,58,58,57,57,57,57,57,57, 57,57,56,56,56,56,56,56,56,55,55,55,55,55,55,55,54,54,54,54,54, 54,54,54,54,54,53,53,53,53,53,52,52,52,52,52,52,51,51,51,51,51, 51,51,51,50,50,50,50,50,50,50,50,50,49,49,49,48,48,48,48,47,47, 47,47,47,47,47,47,47,46,46,46,46,45,45,45,45,45,45,44,44,44,43, 43,43,43,43,42,42,42,42,42,42,41,41,41,41,41,41,40,40,40,40,40, 39,39,39,39,39,38,38,37,37,37,37,37,36,36,36,36,35,35,35,35,35, 35,35,35,35,34,34,34,34,34,33,33,33,33,33,33,33,32,32,32,32,32, 31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30,29,29,29,29,28, 28,28,28,28,27,27,27,27,27,27,27,27,27,26,26,26,26,26,26,25,25, 25,24,24,24,24,23,23,23,23,23,23,22,22,22,22,22,22,22,22,21,21, 21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20 }; const int n4c2w2_h[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,99,99,99,99,99,99,99,98,98,98,98,98,98,97,97,97,97,96,96, 96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,94,94,94,94,93,93, 93,93,93,93,93,92,92,92,92,92,92,92,92,92,91,91,91,91,91,91,90, 90,90,90,90,89,89,89,89,89,89,89,88,88,88,88,88,88,88,88,87,87, 86,86,86,86,86,86,86,86,86,85,85,85,85,85,85,85,85,85,85,85,84, 84,84,84,84,83,83,83,83,83,83,82,82,82,82,82,82,82,81,81,81,81, 81,80,80,80,80,80,80,80,80,79,79,79,79,79,79,79,79,78,78,78,78, 77,77,77,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,75,75,75, 75,75,74,74,74,73,73,73,73,72,72,72,72,71,71,71,71,71,71,71,71, 70,70,70,70,70,69,69,69,69,69,68,68,68,68,68,68,68,67,67,67,67, 67,66,66,66,66,66,66,65,65,65,65,65,64,64,64,64,64,64,63,63,62, 62,62,62,62,61,61,61,60,60,60,60,60,60,60,60,60,60,60,59,59,59, 59,59,59,59,59,59,59,59,58,58,58,58,58,58,58,57,57,57,57,57,57, 56,56,56,56,56,56,56,55,55,55,55,55,54,54,54,54,54,53,53,53,53, 53,53,53,52,52,52,52,52,51,51,51,51,51,51,51,51,49,49,49,49,49, 48,48,48,48,47,47,47,47,47,47,47,47,47,47,47,47,47,46,46,46,46, 46,46,46,45,45,45,45,45,45,45,45,44,44,43,43,43,43,43,43,43,43, 42,42,42,42,41,41,41,41,41,41,41,41,40,40,40,38,38,38,38,38,38, 38,37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,35,35,35,35, 35,34,34,34,34,34,34,34,34,33,33,33,33,33,33,33,32,32,32,32,32, 32,31,31,31,31,31,31,30,30,30,30,30,30,29,29,29,29,29,28,28,28, 27,27,27,27,27,27,27,26,26,26,26,26,25,25,25,25,25,25,25,25,25, 25,25,24,24,24,23,23,23,23,23,23,23,23,22,22,22,22,22,22,22,22, 21,21,21,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20 }; const int n4c2w2_i[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,99,99,98,98,98,98,97,97,97,97,97, 97,97,96,96,96,96,96,95,95,95,95,95,95,95,95,95,95,95,94,94,94, 94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,93,92,92,92,92, 92,92,91,91,91,91,91,91,90,90,90,90,90,90,90,90,90,90,89,89,89, 88,88,88,88,87,87,87,87,87,87,87,87,87,87,87,86,86,86,85,85,85, 85,85,85,85,84,84,84,84,83,83,83,83,83,82,82,82,82,82,82,82,82, 82,81,81,81,81,81,81,81,80,80,80,80,80,79,79,79,79,79,79,79,78, 78,78,77,77,77,77,77,77,76,76,76,76,76,76,76,76,76,76,75,75,75, 75,75,75,75,74,74,74,74,74,73,73,73,73,73,72,72,72,72,72,72,72, 72,72,72,72,72,71,71,71,71,71,70,70,70,70,70,70,70,70,70,70,69, 69,68,68,68,68,68,68,68,67,67,67,67,67,66,66,66,66,65,65,65,65, 65,65,65,65,65,65,65,64,64,64,64,64,63,63,63,62,62,62,62,62,61, 61,61,61,61,60,60,60,60,60,59,59,59,59,59,59,59,58,58,58,58,58, 58,58,58,58,57,57,57,57,57,57,57,57,56,56,55,55,55,54,54,54,53, 53,53,53,53,53,53,52,51,51,50,50,50,50,49,49,49,49,49,49,49,49, 48,48,48,48,48,48,48,48,48,48,48,47,47,47,47,47,47,47,46,46,46, 46,46,46,45,45,45,45,45,45,44,44,44,44,44,43,43,43,43,43,43,43, 43,43,43,43,43,43,42,42,42,42,42,42,42,41,41,41,41,41,41,41,40, 40,40,40,40,40,39,39,39,39,39,38,38,38,38,37,37,37,37,37,37,36, 35,35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,34,33,33,32,32, 32,32,32,32,31,31,31,31,31,31,31,30,30,30,30,30,30,29,29,29,29, 29,29,29,29,29,29,28,28,28,28,28,28,27,27,27,27,27,26,26,26,26, 25,25,25,25,25,25,25,25,25,24,24,24,24,24,24,23,23,23,23,23,23, 22,22,22,22,22,22,22,22,21,21,21,20,20,20,20,20,20,20,20 }; const int n4c2w2_j[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,98,98,98,98,98,98,98,98,98,98,98,97,97, 97,97,97,97,97,97,96,96,96,96,95,95,95,95,95,95,94,94,94,94,94, 94,94,93,93,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,91,91, 91,91,91,91,91,91,91,90,90,90,90,89,89,89,89,88,88,88,88,87,87, 87,87,87,87,87,87,86,86,86,86,86,85,85,85,85,85,85,85,84,84,84, 84,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,82,81,81,81,81, 81,81,81,81,80,80,80,79,79,79,79,79,79,78,78,78,78,78,78,78,77, 77,77,77,76,76,76,75,75,75,75,75,75,75,74,74,74,74,73,73,73,72, 72,72,72,72,71,71,71,71,71,71,70,70,70,70,70,70,69,69,69,69,69, 69,69,69,68,68,68,68,68,68,68,68,67,67,67,67,67,67,67,67,67,67, 66,66,66,66,66,66,66,66,65,65,65,65,65,65,65,65,65,65,65,65,64, 64,64,64,64,64,64,63,63,63,63,62,62,61,61,61,61,61,61,61,61,61, 61,61,59,59,59,59,59,59,59,58,58,58,58,58,58,58,58,58,57,57,57, 57,57,57,56,56,56,56,56,56,56,55,55,55,55,55,55,55,54,54,54,54, 54,54,54,53,53,53,53,53,53,53,53,53,53,53,53,52,52,52,52,52,52, 52,51,51,51,51,51,51,51,51,51,51,51,51,50,50,50,50,50,49,49,49, 49,49,49,48,48,48,47,47,47,47,47,46,45,45,45,45,45,45,44,44,43, 43,43,43,43,42,42,42,42,42,42,42,42,41,41,41,41,41,41,41,41,40, 40,40,40,40,39,39,39,39,39,39,38,38,38,38,38,38,38,38,38,38,38, 37,37,37,36,35,35,35,35,35,35,35,35,35,35,35,35,34,34,34,34,34, 34,34,33,33,33,33,33,32,32,32,32,32,32,32,32,32,31,31,31,31,30, 30,30,30,29,29,29,28,28,28,28,28,28,28,28,27,27,27,27,27,27,27, 26,26,26,25,25,25,24,24,24,24,24,24,24,23,23,23,23,23,23,23,23, 23,23,22,22,22,22,22,22,21,21,21,20,20,20,20,20,20,20 }; const int n4c2w2_k[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,98,98,98, 98,98,98,98,98,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,96, 95,95,95,95,95,94,94,94,94,94,94,94,94,93,93,93,93,92,92,92,92, 92,92,92,91,91,91,91,91,91,91,91,91,90,89,89,89,89,89,89,88,88, 88,88,88,88,87,87,87,87,87,87,86,86,86,86,86,86,85,85,85,85,85, 84,84,84,84,83,83,83,83,83,83,83,83,82,82,82,82,82,82,82,81,81, 81,81,81,80,80,80,80,80,80,80,79,79,79,79,79,78,78,78,78,77,77, 77,77,77,77,77,77,77,77,76,76,76,75,75,75,75,75,75,75,74,74,74, 74,74,74,74,74,73,73,73,73,72,72,72,72,72,71,71,71,71,71,71,71, 71,71,70,70,70,70,70,70,69,69,69,69,69,68,68,68,68,68,68,67,67, 67,67,67,66,66,66,66,66,66,66,65,65,65,65,65,65,65,65,65,65,65, 65,64,64,64,64,64,64,64,63,63,63,63,62,62,62,62,62,62,62,62,61, 61,61,61,60,60,60,60,60,60,60,59,59,59,59,59,58,58,58,58,58,57, 56,56,56,56,55,55,55,55,55,55,55,55,54,54,54,54,54,54,54,54,54, 54,53,53,53,53,53,53,53,53,52,52,52,52,52,52,52,51,51,51,51,51, 51,51,51,51,51,50,50,50,50,50,49,49,49,48,48,48,48,48,47,47,47, 47,46,46,46,46,46,45,44,44,44,44,44,44,44,44,44,44,44,44,44,43, 43,43,43,43,43,42,42,42,42,42,41,41,41,41,41,41,41,40,40,40,40, 39,39,39,39,39,39,39,38,38,38,38,38,38,38,38,38,37,37,37,37,37, 37,37,37,37,37,36,36,36,36,35,35,35,35,35,35,35,35,34,34,34,34, 34,34,34,34,33,33,33,33,33,32,32,32,32,32,32,32,31,31,31,31,31, 31,31,31,31,30,30,30,30,30,30,30,29,29,29,29,29,29,29,29,28,28, 28,28,28,28,28,28,27,27,27,27,27,27,26,26,26,25,25,25,25,24,24, 23,23,23,23,23,23,23,23,22,22,22,22,21,21,21,21,20,20,20,20 }; const int n4c2w2_l[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,99,99,98,98,98,98,98,98, 98,98,98,98,98,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96, 95,95,95,95,95,94,94,94,94,93,93,93,93,93,92,92,92,92,92,91,91, 91,91,91,90,90,90,90,90,89,89,89,89,89,89,89,88,88,88,88,88,88, 88,87,87,87,87,87,86,86,86,86,86,86,86,86,86,86,85,85,85,85,85, 85,85,85,85,85,84,84,84,84,84,84,84,84,84,84,84,84,83,83,83,83, 83,82,82,82,82,81,81,81,81,81,80,79,79,79,79,79,79,79,79,79,78, 78,78,78,78,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,76,76, 75,75,75,75,75,75,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73, 73,73,73,73,72,72,72,72,72,72,72,71,71,71,71,71,71,71,71,70,70, 69,69,69,69,69,68,68,68,67,67,67,67,67,66,66,66,66,66,65,65,65, 65,65,65,65,64,64,64,64,64,64,64,63,63,63,63,63,63,63,62,62,62, 61,61,61,61,61,60,60,60,60,60,60,59,59,59,59,59,59,59,59,59,58, 58,58,58,58,57,57,57,57,57,57,56,56,56,55,55,55,55,55,54,54,54, 54,54,53,53,53,53,53,53,53,53,53,53,53,52,52,52,52,51,51,50,50, 50,50,50,50,50,50,50,49,49,49,48,48,48,48,48,48,47,47,47,47,47, 47,47,47,46,46,45,45,45,45,45,45,45,45,44,44,44,44,44,44,44,44, 43,43,43,43,43,43,42,42,42,42,42,41,41,40,40,40,40,40,39,39,39, 39,39,39,39,39,39,39,38,38,38,38,37,37,37,37,37,37,37,36,36,36, 36,36,35,35,35,35,35,35,34,34,34,34,34,33,33,33,33,33,33,33,32, 32,32,32,32,32,32,32,32,32,31,31,31,31,31,31,31,30,30,30,30,30, 30,29,29,29,29,29,29,29,29,29,29,28,28,28,28,28,28,28,27,27,27, 27,27,27,26,26,26,26,26,26,25,25,25,25,25,24,24,24,24,24,24,24, 24,24,23,23,23,23,22,22,22,22,22,21,21,21,21,21,20,20,20 }; const int n4c2w2_m[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,98,98, 98,98,98,97,97,97,97,97,97,97,96,96,96,96,96,95,95,95,94,94,94, 94,93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,91,91,91,91,91, 91,91,91,91,90,90,90,90,90,90,89,88,88,88,88,87,87,87,87,87,87, 87,87,86,86,86,86,86,86,86,86,86,85,85,85,85,84,84,84,84,84,83, 83,83,83,83,83,82,82,82,82,82,82,82,82,82,82,82,81,81,81,81,81, 81,81,81,80,80,80,80,79,79,79,79,78,78,78,78,78,78,78,77,77,77, 77,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,75,75,75,75,75, 75,75,75,75,75,75,75,74,74,74,74,74,74,74,73,73,73,73,73,72,72, 72,72,71,71,71,71,71,71,71,71,70,70,70,70,70,69,69,69,69,69,69, 69,69,69,69,68,68,68,68,67,67,67,67,67,66,65,65,65,64,64,63,63, 63,63,63,63,63,62,62,62,62,62,62,62,62,62,61,61,61,61,60,60,60, 60,60,60,60,59,59,59,59,59,58,58,57,57,57,57,57,57,57,57,57,56, 56,56,56,56,56,55,55,55,55,55,54,54,54,54,54,54,54,54,54,53,53, 53,53,53,52,52,52,52,52,52,52,52,52,52,52,51,51,51,51,51,51,50, 50,50,50,50,49,49,49,49,49,49,49,49,49,49,48,48,48,48,48,48,48, 48,47,47,47,47,47,47,47,46,46,46,46,46,46,46,46,46,45,45,45,45, 45,44,44,44,44,44,44,44,44,43,43,43,43,43,43,43,42,42,42,42,41, 41,41,41,41,41,41,41,40,40,40,40,40,39,39,39,39,39,38,38,37,37, 37,37,37,37,37,36,36,36,35,35,35,35,35,35,35,34,34,34,34,34,34, 34,34,33,33,33,32,32,32,32,32,32,31,31,31,31,31,31,31,30,30,30, 30,30,30,29,29,28,28,28,28,28,28,27,27,27,26,26,25,25,25,25,25, 25,25,25,24,24,24,24,24,23,23,23,23,22,22,22,22,22,22,22,21,21, 21,21,21,21,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20 }; const int n4c2w2_n[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,99,98,98,98,98,98,98,98, 98,97,97,97,97,97,97,96,96,96,96,95,95,95,95,95,95,95,95,95,94, 94,94,94,94,94,93,93,93,93,93,93,93,93,93,93,92,92,91,91,91,91, 90,90,90,90,90,90,89,89,89,89,89,89,89,89,89,89,89,89,88,88,88, 88,88,88,88,87,87,87,87,87,87,87,86,86,86,86,86,86,84,84,84,84, 84,84,84,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,81,81,81, 80,80,80,80,80,80,80,80,80,80,80,79,79,79,79,79,79,78,78,78,78, 78,78,78,78,77,77,77,77,77,77,77,77,77,76,76,76,76,76,76,75,75, 75,75,75,75,75,74,74,74,74,74,74,73,73,72,72,72,72,71,71,71,71, 71,70,70,70,70,70,70,70,70,69,69,68,68,68,68,68,68,67,67,67,67, 67,67,67,66,66,66,66,66,66,66,65,64,64,64,64,64,64,64,64,64,64, 64,63,63,63,63,63,63,62,62,62,62,62,62,62,61,61,61,61,61,61,61, 61,61,60,60,60,60,60,59,59,59,59,59,59,58,58,58,58,58,57,57,57, 57,57,57,57,56,56,56,56,56,56,56,56,56,56,56,56,56,55,55,55,55, 55,55,55,54,54,54,54,53,52,52,52,52,52,52,52,52,51,51,51,51,51, 51,51,51,51,51,50,50,50,50,50,49,49,49,49,49,49,49,48,48,48,48, 48,48,48,48,48,47,47,47,47,46,46,46,46,46,46,46,46,46,46,46,45, 45,45,45,44,44,44,44,44,44,44,43,43,43,43,42,42,42,42,42,41,41, 41,41,41,41,41,40,40,40,40,40,39,39,39,39,39,39,39,38,38,38,37, 37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,36,36,36,35,35, 35,35,35,35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,33,33,33, 33,33,33,33,33,33,32,32,32,32,32,31,31,31,31,31,31,30,30,30,30, 30,29,29,29,29,29,29,29,28,28,28,27,27,27,27,27,27,26,26,26,25, 25,24,24,24,23,23,22,22,22,22,21,21,21,21,20,20,20,20,20 }; const int n4c2w2_o[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,98,98,98, 98,98,98,97,97,97,97,97,97,96,96,96,96,96,95,95,95,95,95,95,94, 94,94,94,94,94,94,94,93,93,93,93,93,92,92,92,92,92,91,91,91,91, 90,90,90,90,90,89,89,89,89,89,89,88,88,88,88,87,87,87,86,86,86, 86,86,86,86,86,85,85,85,85,85,85,84,84,84,84,84,83,83,83,83,83, 83,83,83,83,82,82,82,82,82,82,81,81,81,81,81,81,81,81,80,80,80, 80,80,79,79,79,79,79,78,78,78,78,78,78,78,77,77,77,77,77,77,76, 76,76,76,76,75,75,75,75,75,75,75,75,75,74,74,74,74,73,73,73,73, 73,73,73,72,72,72,72,72,72,72,72,72,71,71,70,70,70,70,70,70,70, 70,70,70,69,69,69,69,69,69,68,68,68,68,67,67,67,67,67,67,66,66, 66,66,66,66,66,66,66,65,65,65,65,65,65,65,65,65,65,65,64,64,64, 64,64,63,63,63,63,62,62,62,62,62,62,61,61,61,61,60,60,60,60,60, 60,59,59,59,59,59,59,58,58,58,58,58,58,58,58,58,58,57,57,57,57, 57,56,56,56,56,56,56,55,55,55,55,54,54,54,54,54,54,53,53,53,53, 52,52,52,52,52,51,51,51,51,51,51,51,51,50,50,50,50,49,49,49,49, 49,48,48,48,48,48,48,48,48,47,47,47,47,47,46,46,45,45,45,44,44, 44,44,44,44,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42,42, 41,41,41,41,41,41,41,41,41,40,40,40,40,40,40,39,39,39,38,38,38, 38,38,38,38,38,38,37,37,37,37,37,37,37,37,37,37,36,36,36,36,36, 35,35,35,35,35,35,34,34,34,34,34,34,34,34,34,34,34,33,33,33,33, 33,33,33,33,32,32,32,32,32,32,31,31,31,31,31,31,31,31,31,31,30, 30,30,30,30,30,30,30,30,29,29,29,29,28,28,28,28,28,28,27,27,27, 27,27,27,26,26,26,26,26,25,25,25,25,25,25,25,25,25,25,25,24,24, 23,23,23,23,23,23,22,22,22,22,22,21,21,21,21,21,21,21,21,20 }; const int n4c2w2_p[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,98,98,98,98,98,98,98,98, 98,98,97,97,97,97,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95, 94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,92,92,92,92,92,92, 92,92,92,92,92,92,92,92,92,91,91,91,91,90,90,90,90,90,89,89,89, 89,89,89,89,88,88,88,88,88,88,88,88,88,88,88,87,87,87,87,87,86, 86,86,86,86,86,85,85,85,85,85,85,85,85,84,84,84,83,83,83,83,83, 83,83,83,82,82,82,82,82,82,81,81,81,81,81,81,80,80,80,80,80,80, 79,79,79,79,79,79,79,79,79,78,78,78,78,78,78,77,77,76,76,76,76, 75,75,75,75,74,74,74,74,74,73,73,73,73,73,73,72,72,72,72,72,72, 72,72,71,71,71,71,71,70,70,70,70,70,70,69,69,69,69,69,69,69,69, 69,68,68,68,68,68,68,67,67,67,67,67,67,67,67,67,67,66,66,66,66, 66,66,65,65,65,65,65,65,64,64,64,64,64,64,64,64,63,63,63,63,63, 62,62,62,62,61,61,61,61,61,61,60,60,60,60,60,60,59,59,59,59,59, 59,59,59,59,58,58,58,58,58,58,58,57,57,57,57,56,56,56,56,56,56, 55,55,55,55,54,54,54,54,54,54,53,53,53,53,53,53,53,53,53,53,53, 52,52,51,51,51,51,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, 49,49,48,48,48,48,48,48,48,47,47,46,46,46,45,45,45,45,45,44,44, 44,43,43,43,43,43,42,42,42,42,42,41,41,40,40,40,40,40,40,40,40, 39,39,39,39,39,39,39,39,39,39,38,38,38,38,37,37,37,37,37,36,36, 36,36,36,35,35,35,35,35,35,35,35,35,35,35,35,35,34,34,34,34,34, 34,33,33,33,33,32,32,32,32,31,31,31,31,31,31,30,30,30,30,30,30, 29,29,29,29,28,28,28,28,27,27,27,27,27,27,27,27,26,26,26,25,25, 25,25,25,24,24,24,24,24,24,24,24,23,23,23,23,23,23,23,23,22,22, 22,22,22,22,22,21,21,21,21,21,20,20,20,20,20,20,20,20,20 }; const int n4c2w2_q[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,99,99,99,98,98,98,98,98, 98,97,97,97,97,97,97,97,97,97,97,97,97,96,96,96,96,96,95,95,95, 95,95,94,94,94,94,94,94,94,94,93,93,93,93,92,92,92,92,92,92,92, 91,91,91,91,91,91,91,91,90,90,90,90,90,90,90,90,90,89,89,89,89, 89,89,89,89,88,88,87,87,87,87,86,86,86,86,86,85,85,85,85,85,84, 84,84,84,84,84,83,83,83,82,82,82,82,82,81,81,81,81,81,81,81,80, 80,80,79,79,79,79,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78, 78,78,77,77,77,77,77,77,77,77,76,76,76,76,76,76,75,75,75,75,74, 74,74,74,74,74,74,74,73,73,73,73,73,73,73,72,72,72,72,71,71,71, 70,70,70,70,70,70,70,69,69,69,69,68,68,68,67,67,67,67,67,67,66, 66,66,66,66,66,65,65,65,65,65,64,64,64,64,64,64,64,63,63,63,63, 63,62,62,62,62,62,62,61,61,61,61,61,61,61,60,60,60,60,60,60,60, 59,59,59,59,58,58,58,58,58,58,58,57,57,57,57,57,57,57,57,56,56, 56,56,56,56,56,55,55,55,55,55,55,54,54,54,54,53,53,53,53,53,53, 53,52,52,52,52,52,52,52,51,51,51,51,51,51,51,51,50,50,50,50,50, 50,50,50,49,49,49,49,49,49,49,48,48,48,48,47,47,47,47,47,47,46, 46,46,46,46,46,46,45,45,45,45,45,45,45,45,44,44,44,44,44,44,44, 44,43,43,43,43,43,43,43,43,43,42,42,42,42,41,41,41,41,41,41,41, 41,40,40,40,40,40,40,40,40,39,39,39,39,38,38,38,38,37,37,37,37, 37,36,36,36,36,35,35,35,34,34,34,34,34,34,34,34,33,33,33,33,33, 33,33,33,33,33,33,33,32,32,32,32,32,32,31,31,31,30,30,30,29,29, 29,29,29,29,28,28,28,28,28,28,27,27,27,27,27,27,27,27,27,26,26, 26,26,26,26,25,25,25,25,25,25,24,24,24,23,23,23,23,23,23,23,23, 23,23,22,22,22,22,22,22,22,21,21,21,21,21,21,20,20,20,20 }; const int n4c2w2_r[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,98,98,98,98,98,98,98,98,97,97,97, 97,97,97,97,97,97,97,96,96,95,95,95,95,95,95,95,94,94,94,94,94, 94,94,94,94,94,93,93,92,92,92,92,92,91,91,91,90,90,90,90,90,90, 89,89,89,89,89,89,89,89,89,89,89,88,88,87,87,86,86,86,86,86,86, 86,86,86,86,85,85,85,84,84,84,84,84,84,84,84,84,84,84,84,84,83, 83,83,83,83,83,83,83,82,82,82,82,82,82,82,81,81,81,81,81,81,81, 81,81,81,81,81,81,80,80,80,80,80,80,79,79,79,79,79,79,79,78,78, 78,78,78,78,77,77,77,77,77,76,76,76,76,76,76,76,76,75,75,75,74, 74,74,74,74,74,73,73,73,73,73,72,72,72,72,72,72,72,71,71,71,71, 71,71,70,70,70,70,70,69,69,69,69,69,68,68,68,68,67,67,66,66,66, 66,66,66,66,66,66,65,65,65,65,65,65,65,65,64,64,64,64,64,64,64, 64,64,64,64,63,63,63,63,63,63,63,62,62,62,62,62,62,62,62,62,61, 61,61,60,60,60,60,60,59,59,59,59,58,58,58,58,58,58,58,58,57,57, 57,56,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,54,54,54,54, 54,54,54,54,53,53,53,53,53,53,53,52,52,52,52,52,51,51,51,51,51, 51,51,51,51,51,50,50,49,49,49,49,48,48,48,48,48,48,48,47,47,47, 47,47,47,47,46,46,46,46,46,46,46,46,45,44,44,44,44,44,44,44,43, 43,43,43,43,42,42,41,41,41,41,41,40,40,40,40,40,40,40,39,39,39, 39,39,39,39,38,38,38,38,38,38,37,37,37,37,37,37,37,37,36,36,36, 36,36,36,36,36,36,36,36,36,35,35,34,34,34,34,34,33,33,33,33,32, 32,32,32,31,31,31,31,31,31,31,30,30,30,29,29,29,29,29,29,29,29, 29,28,28,28,28,28,27,27,27,27,27,27,26,26,26,26,25,25,25,25,25, 25,25,25,24,24,24,24,24,24,24,24,24,24,23,23,23,23,23,22,22,22, 22,22,21,21,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20 }; const int n4c2w2_s[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,98,98,98,98,97,97,97,97, 97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,96,95,95,95,94, 94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,93,92,92,92,92, 91,91,91,91,91,91,90,90,90,90,90,90,89,89,89,89,89,89,89,89,89, 89,89,89,88,88,88,88,88,87,87,87,87,87,87,87,86,86,86,85,85,85, 85,85,84,84,84,84,83,83,83,83,83,82,82,81,81,81,81,81,81,80,80, 80,80,80,80,80,79,79,79,79,78,78,78,78,78,78,78,78,78,77,77,77, 77,77,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,76,76,75,75, 75,75,75,74,74,74,74,74,74,74,74,74,74,74,73,73,73,72,72,72,72, 72,72,72,72,72,72,72,72,71,71,71,71,71,71,71,71,70,70,70,70,70, 70,70,70,69,69,69,69,69,68,68,68,68,68,68,68,68,68,68,67,67,66, 66,66,66,66,66,66,66,66,65,65,65,65,65,65,65,64,64,64,64,63,63, 63,63,63,63,63,63,62,62,62,62,62,61,61,61,61,61,61,61,60,60,60, 60,60,60,60,60,59,59,59,59,59,59,59,58,58,58,57,57,57,57,57,57, 57,56,56,56,56,56,56,56,56,55,55,55,55,55,55,55,54,54,54,53,53, 52,52,52,52,52,51,51,51,51,51,50,50,50,50,50,50,50,49,49,49,49, 49,48,48,48,48,47,47,47,47,47,47,46,46,46,45,45,45,45,45,45,45, 45,45,44,44,44,44,44,43,43,43,43,43,43,43,43,42,42,41,41,41,41, 41,41,41,41,41,40,40,39,39,39,39,38,38,38,38,38,38,37,37,37,37, 37,37,37,36,36,36,36,36,36,36,36,36,36,36,35,35,35,35,35,35,34, 34,34,34,34,34,33,33,33,33,32,32,32,32,32,32,31,31,31,31,31,30, 30,30,29,29,29,29,28,28,28,27,27,27,27,26,26,26,26,26,26,26,26, 25,25,24,24,24,24,24,24,24,24,24,23,23,23,23,23,23,23,23,23,23, 23,22,22,22,22,22,21,21,21,21,21,21,20,20,20,20,20,20,20 }; const int n4c2w2_t[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,99,99,99,99,99,98,98,98, 98,98,98,98,98,98,98,98,97,97,97,97,97,97,97,97,96,96,96,96,96, 96,95,95,95,95,95,95,95,95,94,94,94,94,94,94,93,93,93,93,92,92, 92,92,92,92,91,91,91,91,90,90,90,90,90,89,89,89,89,89,89,89,88, 88,88,87,87,87,87,87,87,86,86,86,86,86,86,86,86,86,86,85,85,85, 85,85,85,84,84,84,84,83,83,83,83,83,83,82,82,82,82,82,82,82,82, 82,82,82,82,81,81,81,81,81,81,81,81,81,80,80,80,80,80,80,80,80, 80,80,79,79,79,78,78,78,78,77,77,77,77,77,76,76,76,76,75,75,75, 75,75,75,75,75,75,74,74,74,74,74,74,74,74,74,74,73,73,73,72,72, 72,72,72,72,71,70,70,70,70,69,69,69,69,68,68,68,68,68,68,68,67, 67,67,66,66,66,66,66,66,66,65,65,65,65,65,65,65,65,65,64,64,64, 64,64,64,63,63,62,62,62,62,62,61,61,61,61,60,60,60,60,60,60,60, 59,59,59,59,59,59,58,58,58,58,57,57,57,56,56,56,56,56,56,56,55, 55,55,55,54,54,54,54,54,54,54,53,53,53,53,53,53,53,52,52,52,52, 52,52,52,52,51,51,51,51,51,51,51,50,50,50,50,49,49,48,48,48,48, 48,48,48,48,48,48,47,47,47,47,47,47,46,46,46,46,46,46,46,46,45, 45,45,45,45,45,45,44,44,44,44,44,44,43,43,43,42,42,42,42,42,41, 41,41,41,41,40,40,40,40,40,39,39,39,38,38,38,38,38,37,37,37,37, 37,37,37,36,36,36,36,36,36,35,35,35,35,35,34,34,34,34,34,34,34, 34,34,34,33,33,33,33,33,33,33,33,33,33,32,32,32,32,32,32,32,32, 32,32,32,31,31,31,31,31,31,30,30,30,30,30,30,30,29,29,29,29,29, 29,29,28,28,28,28,28,28,28,28,27,27,27,27,27,27,27,27,27,27,26, 26,26,26,26,26,26,26,25,25,25,25,25,25,25,24,24,23,23,23,23,23, 23,23,23,22,22,22,22,22,22,22,21,21,21,21,21,21,20,20,20 }; const int n4c2w4_a[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,98,98, 98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,97,96,96,96,96, 96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,95,95,95,95,94, 94,94,94,94,93,93,92,92,92,92,92,92,92,92,91,91,91,91,91,91,90, 90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,88,88,88,88,88,88, 88,87,87,87,87,87,87,87,87,87,87,87,87,86,86,85,85,85,85,85,85, 84,84,84,84,84,83,83,83,83,83,83,82,82,82,81,81,81,81,81,81,81, 81,80,80,79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,78,78,78, 77,77,77,77,76,76,76,76,76,76,76,76,75,75,75,75,75,75,75,75,75, 75,74,74,74,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73,73,72, 72,72,71,71,71,71,71,71,71,71,71,70,70,70,70,70,69,69,69,69,68, 68,68,68,68,68,68,68,68,68,68,68,68,67,67,67,67,67,66,66,66,66, 66,66,66,66,66,65,65,65,65,65,65,65,65,64,64,63,63,63,63,63,63, 63,63,63,62,62,62,62,62,61,61,61,61,61,60,60,60,60,60,59,59,59, 59,59,59,59,59,58,58,58,58,58,58,57,57,57,57,57,57,57,56,56,56, 56,56,55,55,55,55,55,54,54,54,54,54,54,54,54,53,53,53,53,52,52, 52,52,52,52,52,52,51,51,51,51,51,51,50,50,50,50,50,50,50,50,50, 50,49,49,49,49,49,49,49,49,49,48,48,48,48,48,47,47,47,47,47,47, 47,47,47,46,46,46,46,45,45,45,45,45,45,45,44,44,44,44,44,44,43, 43,43,43,43,43,43,43,43,42,42,41,41,41,41,40,40,40,40,40,40,40, 40,40,40,40,40,40,39,39,39,39,39,39,38,38,38,38,38,38,38,38,38, 37,37,37,37,37,37,37,36,36,36,36,36,36,35,35,35,35,35,35,35,35, 35,35,35,35,35,35,34,34,34,34,34,34,34,34,34,33,33,33,33,33,33, 33,33,33,33,33,32,32,32,32,32,32,31,31,31,31,30,30,30,30,30 }; const int n4c2w4_b[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,98,98,98,98,98,98,97,97,97,97,97, 97,96,96,95,95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,94,94, 94,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,92,92,91,91, 91,91,91,91,90,90,90,90,90,89,89,89,89,89,89,89,88,88,88,88,88, 88,88,87,87,87,87,86,86,86,86,85,85,85,84,84,84,84,83,83,83,83, 82,82,82,82,82,82,82,82,82,82,82,82,81,81,81,81,81,81,80,80,80, 80,80,80,80,79,79,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78, 77,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,76,76,76,75,75, 75,75,75,75,74,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73,73, 72,72,72,72,72,72,72,72,72,72,72,71,71,71,71,71,71,70,70,70,70, 70,70,70,69,69,69,69,69,69,69,69,69,69,68,68,68,68,68,68,68,68, 67,67,67,67,67,67,66,66,66,65,65,65,65,64,64,63,63,63,63,63,63, 63,62,62,62,62,62,61,61,61,61,61,61,61,61,60,60,60,60,60,60,60, 59,59,59,59,59,59,59,58,58,58,58,58,58,58,58,58,58,58,57,57,57, 57,57,57,57,56,56,56,56,56,56,56,55,55,55,55,55,55,55,54,54,54, 54,54,54,54,54,53,53,53,53,53,53,52,52,52,52,52,52,52,51,51,51, 51,51,51,51,51,51,50,50,50,50,50,50,50,50,50,49,49,49,49,49,49, 49,49,49,49,49,49,48,48,48,48,48,48,48,47,47,47,47,47,47,46,46, 46,46,46,46,46,45,45,45,45,45,45,45,45,44,44,44,44,44,44,43,43, 43,43,43,43,43,42,42,42,42,42,42,42,42,42,41,41,41,41,41,41,41, 41,40,40,40,40,40,40,40,40,39,39,38,38,38,38,38,38,38,37,37,37, 37,37,37,36,36,36,36,36,36,35,35,35,35,35,35,35,35,34,34,34,34, 34,34,34,33,33,33,33,32,32,32,32,32,32,32,32,32,32,32,32,32,32, 31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30,30,30 }; const int n4c2w4_c[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,98,98,97,97,97,97,97,96,96,95, 95,95,95,95,95,95,95,95,95,94,94,94,94,94,93,93,93,93,93,92,92, 92,92,92,92,92,92,92,92,91,91,91,91,90,90,90,90,89,89,89,89,89, 89,89,88,88,88,88,88,88,88,88,88,88,88,88,87,87,87,86,86,86,86, 86,86,86,86,86,86,86,86,86,85,85,85,85,84,84,84,84,84,84,84,83, 83,83,83,83,83,83,83,83,83,82,82,82,82,82,82,81,81,81,81,81,81, 80,80,80,80,80,80,80,80,79,79,79,79,79,79,79,79,79,78,78,78,78, 78,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,76,76, 76,76,76,76,76,76,76,76,76,75,75,75,75,75,75,75,75,75,75,75,75, 75,75,74,74,74,74,74,74,74,73,73,73,73,73,73,73,73,73,73,72,72, 72,72,72,72,72,71,71,71,70,70,70,70,70,70,70,70,70,69,69,69,69, 69,69,69,69,69,69,69,68,68,68,68,68,68,68,68,67,67,67,67,66,66, 66,66,66,65,65,65,65,64,64,64,64,64,64,63,63,63,63,63,63,63,63, 62,62,62,62,62,62,62,62,62,62,62,61,61,61,61,61,60,60,60,60,60, 59,59,59,59,59,58,58,58,58,58,58,57,57,57,57,57,57,57,57,57,56, 56,56,56,56,56,55,55,55,55,55,55,55,55,55,55,55,54,54,54,54,54, 54,53,53,53,53,53,52,52,52,52,52,52,52,52,52,52,52,52,52,51,51, 51,50,50,50,50,50,50,50,49,49,49,49,49,49,49,49,48,48,48,48,48, 48,48,48,48,48,48,47,47,47,47,46,46,46,46,46,46,45,45,45,45,45, 45,45,45,45,45,44,44,44,44,44,44,44,43,43,43,43,43,43,42,42,42, 42,41,41,41,41,41,41,41,40,40,40,40,40,40,39,39,39,39,39,39,39, 38,38,38,38,38,38,38,38,37,37,37,37,37,36,36,36,36,36,35,35,35, 34,34,34,34,34,34,34,34,33,33,33,33,32,32,32,32,32,32,32,31,31, 31,31,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30 }; const int n4c2w4_d[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,99,99,99,99,99,99,98,98,98,98,98,98,98,98,98,98,97,97, 97,97,97,97,96,96,96,96,96,96,96,95,95,94,94,94,94,94,94,94,93, 93,93,93,92,92,92,92,92,92,91,91,91,91,91,91,91,91,90,90,90,90, 90,90,90,89,89,89,89,89,89,89,89,89,89,89,89,89,88,88,88,88,87, 87,87,87,87,87,87,87,87,87,87,86,86,86,86,86,86,86,86,86,86,85, 85,85,85,85,85,84,84,84,84,84,83,83,83,83,83,82,82,82,82,82,82, 82,82,82,82,82,82,82,82,81,81,81,81,81,81,81,81,81,81,80,80,80, 80,80,80,80,80,80,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78, 77,77,77,77,77,77,77,77,77,77,77,77,77,76,76,76,76,75,75,75,75, 75,74,74,74,74,74,74,73,73,73,73,73,73,73,73,73,72,72,72,72,72, 72,72,72,72,71,71,71,71,71,71,71,71,70,70,70,70,70,70,70,69,69, 69,69,68,68,68,68,68,67,67,67,67,67,67,67,66,66,66,66,66,66,65, 65,65,65,65,65,65,65,65,65,65,64,64,64,64,64,64,64,64,63,63,63, 63,63,63,63,62,62,62,62,62,62,62,61,61,61,61,61,61,60,60,60,60, 60,60,60,60,60,60,59,59,59,59,59,59,58,58,58,58,58,57,57,57,57, 57,57,57,57,57,57,56,56,56,56,56,56,55,55,55,55,55,55,54,54,54, 54,54,54,54,54,53,53,53,53,53,53,52,52,52,52,52,52,52,51,51,51, 51,51,51,51,50,50,49,49,49,49,49,49,49,48,48,48,48,48,48,48,47, 47,47,47,47,47,47,47,46,46,46,46,46,46,45,45,45,45,44,44,44,44, 44,44,44,44,44,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42,42, 41,41,41,41,41,41,41,41,41,41,41,41,40,40,40,40,39,39,39,39,39, 39,39,39,38,38,38,38,38,37,37,37,37,37,37,36,36,36,36,36,36,36, 35,35,35,35,34,34,34,34,34,34,34,34,33,33,33,33,33,33,33,33,32, 32,32,32,32,31,31,31,31,31,31,31,31,31,31,31,30,30,30 }; const int n4c2w4_e[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,99,99,99,99,99,99,98,98,98,98,98,98,98, 98,98,98,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,96,96, 96,96,96,96,96,95,95,95,95,95,94,94,94,93,93,93,93,93,93,92,92, 92,92,92,92,92,91,91,91,91,91,91,90,90,90,90,89,89,89,89,89,89, 89,89,88,88,88,88,88,87,87,87,87,87,87,87,87,86,86,86,86,86,85, 85,85,85,85,85,84,84,84,84,84,84,84,84,84,84,83,83,83,83,83,83, 83,83,82,82,82,82,82,82,81,81,81,81,81,81,81,81,80,80,80,80,80, 80,80,79,79,79,79,79,79,78,78,78,78,78,78,78,78,77,77,77,77,77, 77,77,76,76,76,76,76,76,76,76,76,76,75,75,75,75,75,75,74,74,74, 74,74,73,73,73,72,72,72,72,72,72,72,72,71,71,71,71,70,69,69,69, 69,69,69,69,68,68,68,68,67,67,67,67,67,67,67,67,67,66,66,66,66, 66,66,66,66,66,66,66,66,65,65,65,65,65,65,65,65,64,64,64,64,63, 63,63,63,63,62,62,62,62,62,62,62,62,62,61,61,61,61,61,60,60,60, 60,60,60,60,60,60,60,59,59,59,59,59,59,58,58,58,58,58,57,57,57, 57,57,57,57,57,57,56,56,56,56,56,55,55,55,55,55,55,55,55,55,55, 55,55,55,54,54,54,54,54,54,54,54,54,54,54,53,53,53,53,53,53,53, 53,53,52,52,52,52,52,52,52,52,52,52,51,51,51,51,51,51,51,51,50, 50,50,50,50,50,50,50,49,49,49,49,49,49,48,48,47,47,47,47,46,46, 46,46,46,46,46,46,46,46,46,45,45,45,45,45,45,45,45,45,44,44,44, 44,44,43,43,43,43,43,42,42,42,42,42,42,42,41,41,41,41,40,40,40, 40,40,40,40,40,40,40,39,39,39,39,39,39,38,38,38,38,38,38,38,38, 38,37,37,37,37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,36, 35,35,35,34,34,34,34,34,34,34,34,34,34,34,33,33,33,32,32,32,32, 32,32,32,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30 }; const int n4c2w4_f[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,99,98,98,98, 98,98,98,98,98,98,97,97,97,97,97,97,97,97,96,96,96,96,96,96,95, 95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,93,93,93,93,93,93, 93,92,92,92,92,92,92,92,91,91,91,91,91,90,90,90,90,90,90,90,89, 89,89,89,89,88,88,88,88,88,88,88,88,88,88,88,87,87,87,87,87,87, 86,86,86,86,86,85,85,85,85,85,85,85,85,85,84,84,84,84,84,84,83, 83,83,83,83,83,83,82,82,82,82,82,82,82,82,81,81,81,81,81,81,81, 81,81,81,81,81,81,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80, 80,80,79,79,79,79,79,79,79,79,78,78,78,78,78,78,77,77,77,76,76, 76,76,75,75,75,75,75,75,74,74,74,74,74,73,73,73,73,73,73,73,72, 72,72,72,72,72,72,72,72,71,71,71,71,71,71,71,71,71,70,70,70,70, 70,70,69,69,69,69,69,69,69,69,69,68,68,68,68,68,68,67,67,67,67, 67,67,67,67,66,66,66,66,66,66,66,66,65,65,65,65,65,65,64,64,64, 64,64,63,63,63,63,63,63,63,63,62,62,62,62,62,62,61,61,61,61,61, 61,61,61,61,61,61,60,60,60,59,59,59,59,59,59,59,59,59,58,58,58, 58,58,58,58,58,57,57,57,57,57,56,56,56,56,56,56,56,56,56,55,55, 55,55,55,55,55,55,55,55,54,54,54,54,54,54,54,53,53,53,53,53,53, 53,52,52,52,52,52,52,52,52,52,52,52,51,51,51,51,51,50,50,50,50, 50,50,50,50,50,50,49,49,48,48,48,48,48,48,48,47,47,47,46,46,46, 46,46,46,46,46,46,46,46,45,45,45,45,45,45,45,44,44,44,44,44,43, 43,43,43,43,43,43,43,42,42,42,41,41,41,41,41,41,41,40,40,40,40, 40,40,40,40,40,40,40,40,39,39,39,39,39,39,39,39,39,38,38,38,38, 38,37,37,37,37,36,36,36,36,35,35,35,35,35,34,34,34,33,33,33,33, 33,33,33,32,32,32,32,31,31,31,31,31,31,31,30,30,30,30,30 }; const int n4c2w4_g[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,100,99,99,99,99,99, 99,99,99,99,98,98,98,97,97,97,97,97,97,97,97,97,97,96,96,96,96, 96,96,96,96,96,95,95,95,95,95,95,94,94,94,94,94,94,94,93,93,93, 93,92,92,92,92,92,91,91,91,91,91,91,91,91,91,91,91,91,90,90,90, 90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,89,89,89,89,88,88, 88,88,88,87,87,87,87,87,86,86,86,86,85,85,85,85,85,85,85,85,85, 84,84,84,84,84,84,84,84,84,83,83,83,83,83,83,83,83,83,82,82,82, 82,82,82,81,81,81,81,81,81,81,81,80,80,80,80,79,79,79,79,79,79, 79,78,78,78,78,78,78,78,77,77,77,77,77,77,77,77,76,76,76,76,76, 76,75,75,75,75,74,74,74,74,74,74,74,73,73,73,73,72,72,72,72,72, 72,71,71,71,71,71,71,71,71,70,70,70,70,70,70,70,69,69,69,69,69, 69,69,69,68,68,68,68,68,68,67,67,67,67,67,67,66,66,66,66,66,66, 65,65,65,65,65,65,65,64,64,64,64,64,64,64,64,63,63,63,63,63,62, 62,62,62,62,62,62,61,61,61,61,61,61,61,60,60,60,60,60,60,60,60, 59,59,59,59,59,59,59,58,58,58,58,57,57,57,57,56,56,56,56,56,55, 55,55,55,55,55,55,55,55,54,54,54,54,54,54,54,53,53,53,53,53,52, 52,52,52,52,52,52,51,51,51,51,51,51,51,50,50,50,50,50,50,50,49, 49,49,49,49,48,48,48,48,48,48,48,47,47,47,47,47,47,46,46,46,46, 45,45,45,45,44,44,44,44,44,43,43,43,43,43,43,42,42,42,42,42,42, 42,42,42,42,42,41,41,41,41,41,41,41,41,41,40,40,40,40,40,40,40, 39,39,39,39,39,38,38,38,38,38,38,38,38,37,37,37,37,37,37,37,37, 37,36,36,36,36,36,36,36,36,35,35,35,35,35,35,35,35,35,34,34,34, 34,34,34,34,34,34,34,34,34,34,34,33,33,33,33,33,33,33,33,33,33, 33,33,32,32,32,32,32,32,32,31,31,31,31,31,30,30,30,30,30,30,30 }; const int n4c2w4_h[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,98,98,98,98,98,98,98,97,97,97, 97,97,97,97,97,97,97,97,97,97,97,96,96,96,96,96,95,95,95,95,95, 94,94,94,94,94,94,94,93,93,93,92,92,92,92,92,91,91,91,91,91,90, 90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,89,88,88,88,88,88, 88,88,88,88,87,87,86,86,86,86,86,86,86,86,85,85,85,85,85,85,85, 85,85,84,84,84,84,84,84,84,84,83,83,83,83,83,83,82,82,82,81,81, 81,81,81,81,81,81,80,80,80,80,80,80,79,79,79,79,79,79,79,79,78, 78,78,78,78,78,78,78,78,78,77,77,77,77,77,77,77,77,76,76,76,76, 76,76,76,75,75,75,75,75,75,75,75,75,75,75,75,75,74,74,74,74,74, 74,74,73,73,73,73,73,73,73,73,73,72,72,72,72,72,72,71,71,71,71, 71,71,71,71,71,71,71,71,70,70,70,70,70,70,70,69,69,69,69,69,69, 69,69,69,68,68,68,68,68,68,68,68,68,67,67,67,67,67,67,67,66,66, 66,66,66,66,66,66,65,65,65,65,65,65,65,65,65,64,64,64,64,64,64, 64,64,63,63,63,63,62,62,62,62,62,62,62,62,61,61,61,61,61,61,61, 60,60,60,60,60,60,59,59,59,58,58,58,58,58,58,58,58,58,57,57,57, 57,57,57,57,57,57,56,56,56,56,56,56,56,55,55,55,55,55,55,55,54, 54,54,54,53,53,53,53,53,52,52,52,52,52,52,52,52,51,51,51,51,51, 51,51,51,51,51,50,50,50,50,50,50,50,50,50,50,49,49,49,49,49,49, 49,49,49,49,48,48,48,48,48,48,47,47,47,47,47,47,47,47,47,47,46, 46,46,46,46,45,45,45,45,45,44,44,44,44,44,44,44,44,43,43,43,43, 42,42,42,42,41,41,41,41,41,41,41,41,41,41,40,40,40,40,40,40,39, 39,39,39,39,39,38,38,38,38,38,38,38,37,37,37,36,36,36,36,36,36, 35,35,35,35,35,35,34,34,34,34,34,33,33,33,33,33,33,32,32,32,32, 32,32,32,32,32,32,32,31,31,31,31,31,31,31,30,30,30,30,30 }; const int n4c2w4_i[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,99, 98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,97,97,96,96,96,96, 96,96,95,95,95,95,95,95,95,95,95,94,94,94,93,93,93,93,93,93,93, 93,93,93,92,92,92,92,92,92,92,92,91,91,91,91,91,91,90,90,90,90, 89,89,89,89,89,89,89,89,89,88,88,88,88,87,87,87,87,87,86,86,86, 86,86,86,86,86,86,86,85,85,85,85,85,85,84,84,84,84,84,84,83,83, 83,83,83,83,83,83,82,82,82,82,82,81,81,81,81,81,80,80,80,80,80, 80,80,80,80,80,80,79,79,79,79,79,79,79,78,78,78,78,78,77,77,77, 77,77,77,76,76,76,76,76,75,75,75,75,74,74,74,74,74,74,74,74,74, 74,73,73,73,73,73,72,72,72,72,71,71,71,71,71,71,71,71,70,70,70, 70,70,70,70,70,69,69,69,68,68,68,68,68,68,68,68,67,67,67,67,67, 67,67,66,66,66,66,66,66,66,65,65,65,65,65,65,65,64,64,64,64,64, 64,63,63,63,63,63,63,63,62,62,62,62,62,62,62,62,62,62,62,62,61, 61,61,61,61,61,61,61,61,61,60,60,60,60,60,60,60,60,60,60,59,59, 59,59,59,59,58,58,58,58,58,58,58,58,58,58,58,58,58,57,57,57,57, 57,57,57,56,56,56,55,55,55,55,55,55,55,55,55,54,54,54,54,54,54, 54,53,53,53,53,53,53,53,53,53,52,52,52,52,52,52,52,52,51,51,51, 51,50,50,50,50,49,49,49,49,49,49,49,49,48,48,48,48,47,47,47,47, 47,47,47,47,47,46,46,46,45,45,45,45,45,45,45,44,44,44,44,44,44, 44,43,43,43,43,43,43,43,43,42,42,42,42,42,42,41,41,41,41,41,41, 41,41,41,41,41,40,40,40,40,40,40,39,39,39,39,39,39,39,39,38,38, 38,38,38,38,38,38,37,37,37,37,37,37,37,37,37,37,37,36,36,36,36, 35,35,35,35,35,35,34,34,34,34,33,33,33,33,33,33,33,33,32,32,32, 32,32,32,32,32,32,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30 }; const int n4c2w4_j[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,99,99,98,98,98,98,98,98, 97,97,97,97,97,97,97,97,97,97,97,97,96,96,96,96,96,96,95,95,95, 95,95,94,94,94,94,94,94,94,94,94,94,94,94,94,93,93,93,93,93,93, 93,93,93,93,92,92,92,92,92,92,92,91,91,91,91,91,91,91,91,91,90, 90,90,90,90,90,90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,89, 88,88,88,88,88,88,88,88,88,87,87,87,86,86,86,86,86,85,85,85,84, 84,83,83,83,83,83,83,83,83,82,82,82,82,82,81,81,81,81,81,81,81, 80,80,80,80,80,80,80,80,80,80,80,80,79,79,79,79,79,79,79,79,79, 79,79,78,78,78,78,78,78,78,78,77,77,77,77,77,77,77,77,76,76,76, 76,76,76,75,75,75,75,75,75,75,74,74,74,74,73,73,72,72,72,72,72, 72,71,71,71,71,71,71,70,70,70,70,70,70,69,69,69,69,69,69,69,69, 69,69,69,68,68,68,68,68,68,68,68,67,67,67,67,67,67,67,66,66,66, 66,66,66,66,66,66,66,65,65,65,65,65,65,65,64,64,64,64,64,64,64, 64,64,63,63,63,63,63,63,63,63,62,62,62,62,62,62,62,62,62,61,61, 61,61,61,61,61,61,60,60,60,60,59,59,59,59,59,58,58,58,58,57,57, 57,57,57,57,57,57,57,56,56,56,56,56,56,56,56,56,56,56,56,56,55, 55,55,55,55,55,55,54,54,54,54,54,54,54,53,53,53,53,53,53,53,53, 53,53,52,52,52,52,52,51,51,51,51,51,51,50,50,50,50,50,50,50,49, 49,49,49,49,49,49,48,48,48,48,48,47,47,47,47,47,47,47,46,46,46, 46,46,46,46,46,45,45,45,44,44,44,44,44,44,44,44,44,44,43,43,43, 43,43,42,42,42,42,42,42,42,42,41,41,41,41,41,41,41,41,41,41,40, 40,40,40,40,40,40,40,40,40,39,39,39,39,39,39,39,38,38,38,38,38, 38,37,37,37,37,36,36,36,36,35,35,35,35,35,34,34,34,34,34,34,34, 33,33,33,32,32,32,32,32,32,31,31,31,31,30,30,30,30,30,30 }; const int n4c2w4_k[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,99,99,99,99,99,98,98,98, 98,97,97,97,97,97,97,97,96,96,96,96,96,96,95,95,95,95,95,95,95, 95,95,95,94,94,94,94,94,94,94,94,94,93,93,93,93,92,92,92,92,92, 92,92,92,91,91,91,90,90,90,90,90,90,90,90,90,89,89,89,89,89,89, 89,88,88,88,88,88,88,88,88,88,87,87,87,87,87,87,87,87,87,86,86, 86,86,86,85,85,85,85,85,85,85,84,84,84,84,84,84,84,83,83,83,83, 83,83,82,82,82,82,82,82,82,82,82,82,82,81,81,81,81,81,81,81,81, 80,80,80,80,80,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78,78, 78,78,77,77,77,77,77,77,76,76,76,76,76,75,75,75,75,75,75,74,74, 74,74,74,74,74,74,74,73,73,73,73,73,73,73,72,72,72,72,72,72,72, 72,72,72,71,71,71,70,70,70,70,70,70,69,69,69,69,69,69,68,68,68, 68,68,68,68,67,67,67,67,67,67,67,66,66,66,66,66,66,66,65,65,65, 65,65,65,65,65,64,64,64,64,64,64,63,63,63,63,62,62,62,62,62,61, 61,61,60,60,60,60,60,60,59,59,59,59,59,59,58,58,58,58,58,58,58, 58,57,57,57,57,57,57,57,57,57,57,56,56,56,56,56,56,55,55,55,55, 55,55,55,54,54,54,54,54,54,54,54,54,54,54,54,53,53,53,53,53,53, 53,53,52,52,52,52,52,52,51,51,51,51,51,51,50,50,50,50,50,50,50, 50,50,49,49,49,49,49,49,49,49,49,49,48,48,48,48,48,48,47,47,47, 47,46,46,46,46,46,46,46,45,45,45,45,45,45,45,44,44,44,44,43,43, 43,42,42,42,42,42,42,42,42,41,41,41,41,41,40,40,40,40,40,40,40, 40,40,40,40,40,40,40,39,39,39,39,39,39,39,39,38,38,38,38,38,38, 38,38,38,38,38,38,37,36,36,36,36,36,36,36,36,36,36,36,36,36,36, 35,35,35,35,35,35,35,34,34,34,34,34,34,34,33,33,33,33,33,33,32, 32,32,32,32,32,32,32,31,31,30,30,30,30,30,30,30,30,30,30 }; const int n4c2w4_l[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,99, 99,99,99,98,98,98,98,98,98,98,98,98,98,98,98,98,98,97,97,97,97, 97,97,97,97,97,97,96,96,96,96,96,96,96,95,95,95,95,95,94,94,94, 94,94,94,94,94,94,93,93,93,93,93,93,93,93,93,92,92,92,92,92,92, 92,91,91,91,91,91,91,91,91,90,90,90,90,90,90,90,89,89,89,88,88, 88,88,88,88,88,88,87,87,87,87,87,87,87,87,87,86,86,86,86,86,85, 85,85,85,85,84,84,84,84,83,83,83,83,83,83,83,82,82,82,81,81,81, 81,81,81,81,80,80,80,80,80,80,79,79,79,79,79,79,79,79,78,78,78, 78,78,78,78,78,77,77,77,77,77,76,76,76,76,75,75,75,75,75,75,75, 74,74,74,74,74,74,74,74,74,74,73,73,73,73,72,72,72,72,72,72,72, 72,72,71,71,71,71,71,71,71,71,71,70,70,70,70,69,69,69,69,69,69, 69,69,68,68,68,68,68,68,68,68,68,68,68,68,68,68,67,67,67,67,67, 67,67,67,67,66,66,66,66,66,66,66,66,66,66,65,65,65,65,65,65,64, 64,64,64,64,64,63,63,63,63,63,62,62,62,62,61,61,61,61,60,60,60, 60,60,59,59,59,59,59,59,59,59,59,59,59,59,58,58,58,58,58,58,58, 58,58,57,57,56,56,56,56,56,55,55,55,55,55,55,55,55,55,54,54,54, 54,54,54,54,54,53,53,53,53,53,53,53,53,53,53,52,52,52,52,52,52, 51,51,51,51,51,50,50,49,49,49,49,49,49,49,49,48,48,48,48,48,48, 47,47,47,47,47,47,47,47,47,46,46,46,46,46,46,46,46,46,45,45,45, 45,44,44,44,44,44,44,44,43,43,43,43,42,42,42,42,42,42,42,41,41, 41,41,41,41,41,41,41,40,40,40,40,40,40,40,40,40,39,39,39,39,39, 39,39,39,39,38,38,38,38,38,38,38,37,37,37,37,37,37,37,37,37,37, 36,36,36,36,36,36,36,35,35,35,35,34,34,34,34,34,34,33,33,33,33, 33,33,33,33,33,33,33,33,32,31,31,31,31,31,30,30,30,30,30,30,30 }; const int n4c2w4_m[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,98, 98,98,98,98,97,97,97,97,97,97,97,97,96,96,96,96,96,95,95,95,95, 95,94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,92,92,92,92, 91,91,91,91,91,90,90,90,90,90,90,90,90,89,89,89,89,89,89,89,89, 89,89,89,89,88,88,88,88,87,87,87,87,87,87,87,87,86,86,86,86,86, 86,86,86,85,85,85,85,85,85,85,85,84,84,84,84,84,84,84,84,84,84, 84,84,83,83,83,83,83,83,82,82,82,81,81,81,81,81,81,81,80,80,80, 80,80,80,79,79,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78,78, 78,78,78,78,77,77,77,77,76,76,76,76,76,76,75,75,75,75,75,75,75, 75,75,74,74,74,74,74,73,73,73,73,73,73,73,72,72,72,72,72,72,72, 71,71,71,71,70,70,70,70,70,70,70,70,69,69,69,69,69,69,69,69,69, 68,68,68,68,68,68,68,67,67,67,67,67,67,67,67,67,67,66,66,66,66, 65,65,65,64,64,64,64,64,63,63,63,63,63,63,62,62,62,62,62,62,62, 62,61,61,61,61,60,60,60,60,60,60,60,60,59,59,59,59,59,59,59,58, 58,58,58,58,57,57,57,57,57,57,57,57,57,56,56,56,56,56,56,56,55, 55,55,55,55,55,55,54,54,54,54,54,54,54,53,53,53,53,53,53,53,53, 53,53,53,53,53,52,52,52,52,52,52,52,51,51,51,51,51,51,50,50,50, 50,50,49,49,49,49,49,49,48,48,48,48,48,47,47,47,47,47,46,46,46, 46,46,46,45,45,45,45,45,45,44,44,44,44,44,44,44,44,44,44,44,43, 43,43,43,43,43,43,43,43,43,42,42,42,42,42,42,41,41,41,41,40,40, 40,39,39,39,39,39,39,39,39,38,38,38,38,38,38,38,38,37,37,37,37, 37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,36,36,35,35,35,35, 35,34,34,34,34,34,34,34,34,33,33,33,33,33,33,33,33,33,33,33,32, 32,32,32,32,32,32,32,32,31,31,31,31,30,30,30,30,30,30,30,30 }; const int n4c2w4_n[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,98,98,97,97,97,97, 97,97,97,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95, 95,95,94,94,94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,93, 92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,91,91,91,91,91,91, 91,90,90,90,90,90,89,89,89,89,89,89,89,89,89,89,88,88,88,87,87, 87,87,86,86,86,86,85,85,85,85,84,84,84,84,84,84,84,84,84,84,84, 84,84,84,84,83,83,83,83,83,82,82,82,82,82,81,81,81,81,81,81,81, 81,81,81,81,81,80,80,80,80,80,80,80,80,79,79,79,79,79,79,79,79, 79,79,78,78,78,78,78,78,78,78,78,77,77,77,77,76,76,76,76,76,76, 76,75,75,75,75,75,75,74,74,74,74,74,74,74,74,73,73,73,73,73,73, 72,72,72,72,72,72,72,72,72,72,71,71,71,71,70,70,70,69,69,69,69, 69,69,69,69,69,69,69,69,68,68,68,68,68,68,67,67,67,67,67,67,67, 67,67,67,67,66,66,66,66,66,66,65,65,65,65,64,64,64,64,64,64,64, 64,63,63,63,63,63,63,63,63,62,62,62,62,62,62,62,61,61,61,61,61, 61,60,60,60,60,60,60,60,60,60,60,60,60,60,59,59,59,59,58,58,58, 58,58,58,57,57,57,57,57,57,57,57,57,57,56,56,56,55,55,55,55,55, 55,55,55,55,55,55,54,54,54,54,54,53,53,53,53,53,53,53,52,52,52, 52,52,52,51,51,51,51,51,50,50,50,50,50,50,50,50,50,49,49,49,49, 49,49,49,49,49,48,48,48,47,47,47,47,47,47,47,46,46,46,46,46,46, 46,46,45,45,45,45,45,45,45,45,45,45,45,44,44,44,44,44,44,44,44, 44,43,43,43,43,42,42,42,41,41,41,41,41,41,41,41,41,41,41,40,40, 40,40,40,40,39,39,39,39,39,39,39,39,39,39,38,38,38,38,38,37,37, 37,37,37,36,36,36,36,36,36,36,35,35,34,34,34,34,34,33,33,33,33, 33,33,32,32,32,32,32,32,32,31,31,31,31,31,31,31,31,31,30,30 }; const int n4c2w4_o[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,98,98,98,98,98,98,98,98,98, 98,97,97,97,97,97,96,96,96,96,95,95,95,95,95,95,95,95,94,94,94, 94,94,94,94,94,93,93,93,93,93,92,92,92,92,92,92,92,92,92,92,92, 92,91,91,91,91,91,91,91,91,90,90,90,90,90,90,90,90,89,89,89,89, 89,88,88,88,88,88,88,88,88,88,88,88,87,87,87,87,87,87,86,86,86, 86,86,86,86,86,86,86,86,86,86,85,85,85,85,85,85,85,84,84,84,84, 84,84,84,84,84,83,83,83,83,83,83,83,83,83,83,82,82,82,82,82,82, 82,81,81,81,81,81,81,81,80,80,80,80,80,80,79,79,79,79,79,79,79, 78,78,78,78,78,78,78,78,78,77,77,77,77,76,76,76,76,76,76,76,75, 75,75,75,75,75,75,74,74,74,74,73,73,73,73,73,72,72,72,72,72,72, 72,72,72,71,71,71,71,71,71,71,71,71,71,71,71,70,70,70,70,70,70, 70,70,69,69,69,69,69,69,68,68,68,67,67,67,67,66,66,66,66,66,66, 66,66,65,65,65,65,64,64,64,63,63,63,62,62,62,62,62,62,62,61,61, 61,61,61,61,61,60,60,60,60,59,59,59,59,58,58,58,58,58,58,58,58, 58,58,58,57,57,57,57,57,57,57,57,57,57,56,56,56,56,56,56,56,56, 56,55,55,55,55,55,55,55,54,54,54,54,54,54,54,54,54,54,54,54,53, 53,53,53,53,53,53,52,52,52,52,52,52,51,51,51,51,51,51,50,50,50, 50,50,50,50,50,49,49,49,49,49,48,48,47,47,47,47,47,47,47,47,47, 47,46,46,46,46,46,46,45,45,45,45,45,45,44,44,44,44,44,44,44,44, 43,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,41,41,41,41,41, 41,41,41,41,41,40,40,40,40,39,39,39,39,39,39,39,39,39,39,38,38, 38,38,38,38,38,38,38,37,37,37,37,37,37,37,37,37,36,36,36,36,35, 35,35,35,35,34,34,34,34,34,34,34,34,34,34,33,33,33,33,33,32,32, 32,32,32,32,32,32,31,31,31,31,31,31,31,31,30,30,30,30,30 }; const int n4c2w4_p[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,98,98, 98,98,98,98,97,97,97,97,97,97,97,97,97,97,97,96,96,96,96,96,95, 95,95,95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,94,94,94,93, 93,93,93,93,93,93,92,92,92,92,91,91,91,91,91,91,91,91,91,91,91, 90,90,90,90,90,90,89,89,89,89,89,89,89,89,89,88,88,88,88,88,88, 88,88,88,87,87,87,87,87,87,87,87,87,87,86,86,86,86,86,85,85,85, 85,85,85,85,85,84,84,84,84,84,84,84,83,83,83,83,83,83,82,82,82, 82,82,82,82,82,82,82,81,81,81,81,81,81,81,81,81,81,81,80,80,80, 80,80,79,79,79,79,79,79,79,78,78,78,78,78,78,78,77,77,77,77,77, 76,76,75,75,75,75,75,75,75,74,74,74,74,74,74,74,74,74,73,73,73, 73,73,73,73,72,72,72,72,72,72,72,72,72,72,72,71,71,71,70,70,70, 70,70,70,70,70,70,70,69,69,69,69,68,68,68,68,67,67,66,66,66,66, 66,66,66,66,66,66,66,66,66,65,65,65,64,64,64,64,64,63,63,63,63, 63,63,63,63,63,63,62,62,62,62,62,62,62,62,62,61,61,61,61,61,61, 60,60,60,60,60,60,60,59,59,59,59,59,59,59,59,58,58,58,58,58,58, 57,57,57,57,56,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,55, 54,54,54,54,54,54,54,54,54,54,54,54,53,53,53,53,52,52,52,52,52, 51,51,51,51,51,51,51,50,50,50,50,50,50,50,50,50,50,50,50,49,49, 49,49,49,49,48,48,48,48,48,48,48,48,48,47,47,47,47,47,47,46,46, 46,46,46,46,46,46,46,46,46,45,45,45,44,44,44,44,44,43,43,43,43, 43,43,42,42,42,42,42,42,41,41,41,41,41,41,41,41,40,40,40,40,39, 39,39,39,39,39,39,38,38,38,38,38,38,37,37,37,37,37,37,36,36,36, 36,36,35,35,34,34,34,34,34,34,34,34,34,33,33,33,33,33,33,33,33, 33,32,32,32,32,32,32,32,32,32,32,32,32,31,31,31,31,30,30,30 }; const int n4c2w4_q[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,99,98,98,98,98,98,98,97,97,97,97,97,96, 96,96,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,94,94, 94,94,94,94,93,93,93,93,93,93,93,93,93,93,92,92,92,92,92,92,91, 91,91,91,91,90,90,90,90,90,90,89,89,89,89,89,89,89,88,88,88,88, 88,88,87,87,87,86,86,86,86,86,86,86,85,85,85,85,85,84,84,84,84, 84,84,84,84,84,84,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83, 83,83,82,82,82,82,82,82,82,82,82,82,82,82,82,82,81,81,81,81,81, 81,81,81,81,81,80,80,80,80,80,80,80,80,80,80,80,79,79,79,79,79, 79,79,79,79,78,78,78,78,77,77,77,77,77,76,76,76,76,75,75,75,75, 75,75,75,75,75,74,73,73,73,73,73,73,73,73,73,72,72,72,72,71,71, 71,71,71,71,71,70,70,70,70,70,70,69,69,69,69,69,69,68,68,68,68, 67,67,67,67,67,67,67,67,67,66,66,66,66,65,65,65,65,65,65,65,64, 64,64,64,64,64,63,63,63,63,63,63,63,63,63,63,63,63,63,63,62,62, 62,62,62,62,62,62,62,61,61,61,61,61,60,60,60,60,60,60,60,60,60, 60,60,60,59,59,59,59,59,59,59,59,59,59,59,58,58,58,58,58,57,57, 57,57,57,57,57,56,56,56,56,56,55,55,55,55,55,55,54,54,54,54,54, 53,53,53,53,53,53,53,53,53,53,52,52,52,52,51,51,51,51,51,51,51, 51,50,50,50,50,50,50,50,50,50,50,49,49,49,49,49,49,49,48,48,48, 47,47,47,47,46,46,46,46,46,46,45,45,45,45,45,44,44,43,43,43,43, 43,43,43,43,42,42,42,42,42,41,41,41,41,41,41,41,41,40,40,40,40, 40,40,40,40,40,40,40,39,39,39,39,39,39,39,38,38,38,38,38,38,37, 37,37,37,37,37,36,36,36,36,36,36,36,35,35,35,35,35,35,34,34,34, 34,34,33,33,33,33,32,32,32,32,32,32,32,32,32,32,32,31,31,31,31, 31,31,31,31,31,31,30,30,30,30,30,30,30,30,30,30,30,30 }; const int n4c2w4_r[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,98,98,98,98,98,98,98,98,98,97,97, 97,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,95,95,95, 95,95,95,95,95,95,95,95,95,94,94,94,94,93,93,93,93,93,93,93,92, 92,92,92,92,91,91,91,91,91,91,91,91,91,90,90,90,90,90,90,90,89, 89,89,89,88,88,88,88,88,87,87,87,87,87,86,86,86,86,86,86,86,85, 85,85,85,84,84,84,84,84,84,84,83,83,83,83,83,83,83,83,83,83,83, 83,83,82,82,82,82,82,82,81,81,81,81,81,81,81,81,81,81,80,80,80, 80,80,80,79,79,79,79,79,79,79,78,78,78,78,78,77,77,77,77,77,77, 77,77,77,76,76,76,76,76,76,76,76,75,75,75,75,75,75,75,74,74,74, 74,74,74,74,74,73,73,73,73,73,72,72,72,72,72,71,71,71,71,71,71, 71,71,71,71,70,70,70,70,70,70,70,70,70,69,69,69,69,69,69,69,69, 69,68,68,68,68,67,67,67,67,67,67,67,67,66,66,66,66,66,66,66,66, 66,65,65,65,65,65,65,65,65,65,65,65,65,65,64,64,64,64,64,64,64, 64,64,63,63,63,63,63,63,63,63,63,63,62,62,62,62,62,62,62,62,61, 61,61,61,61,61,60,60,60,60,60,59,59,59,59,58,58,58,58,58,58,57, 57,57,57,57,57,57,57,56,56,56,56,56,56,56,55,55,55,55,54,54,54, 54,54,54,54,54,54,54,54,54,53,53,53,53,52,52,52,52,52,52,52,52, 51,51,51,51,51,51,50,50,50,50,50,50,49,49,49,49,49,49,49,48,48, 47,47,47,47,46,46,46,46,46,46,46,45,45,45,45,45,45,45,45,44,44, 44,44,44,44,44,44,43,43,43,43,43,43,43,43,43,43,43,42,42,42,42, 42,42,41,41,41,41,41,40,40,40,39,39,39,39,39,39,39,39,39,39,38, 38,38,38,38,38,38,38,37,37,37,37,37,37,36,36,36,36,36,36,36,36, 36,36,36,35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,34,33,33, 33,33,33,33,33,32,32,32,32,32,32,32,32,32,31,31,31,30,30 }; const int n4c2w4_s[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,99,99,99,99,99,98,98,98,98, 98,98,97,97,97,97,96,96,96,95,95,95,95,95,95,95,95,95,95,95,94, 94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,93,93,93,93,93,93, 92,92,92,92,91,91,91,91,90,90,90,90,90,90,90,90,89,89,89,89,89, 89,88,88,88,87,87,87,87,87,87,86,86,86,86,86,86,86,86,86,86,85, 85,85,85,85,85,85,85,85,85,85,85,84,84,84,84,84,83,83,83,83,83, 83,83,83,83,83,82,82,82,82,82,82,82,82,81,81,81,81,80,80,80,80, 79,79,79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,78,77,77,77, 77,76,76,76,76,76,76,76,76,76,76,75,75,75,75,75,75,75,75,75,75, 74,74,74,74,74,74,74,73,73,73,73,73,73,73,72,72,72,72,72,72,71, 71,71,71,71,71,71,71,71,71,71,71,71,70,70,70,70,70,70,70,70,70, 69,69,69,69,69,69,68,68,68,68,68,68,68,68,67,67,67,66,66,66,66, 65,65,65,65,65,65,64,64,64,64,64,64,63,63,63,63,63,63,63,63,63, 63,62,62,62,62,62,62,62,61,61,61,61,61,61,61,61,60,60,60,60,60, 60,59,59,59,59,59,59,59,59,58,58,58,58,58,58,57,57,57,57,57,57, 57,57,56,56,56,56,56,56,56,55,55,55,55,55,55,55,54,54,54,54,54, 53,53,53,53,53,53,53,53,53,53,52,52,52,52,52,51,51,51,50,50,50, 50,50,50,50,50,50,50,50,50,50,50,50,49,49,49,49,49,49,49,49,48, 48,48,48,48,48,48,48,47,47,47,47,47,47,46,46,46,46,46,45,45,45, 45,45,44,44,44,44,44,44,43,43,43,43,43,43,43,43,42,42,42,42,42, 42,42,42,42,41,41,41,41,41,41,41,41,40,40,40,40,40,40,40,40,40, 40,40,39,39,39,39,39,38,37,37,37,37,37,37,36,36,36,36,36,36,36, 36,35,35,35,35,35,35,34,34,34,34,34,34,34,33,33,33,33,33,32,32, 32,32,32,32,32,32,32,32,31,31,31,31,30,30,30,30,30,30,30,30 }; const int n4c2w4_t[] = { 120, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,98,98,98,98,97,97, 96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,94,94,94,94,94,94, 94,94,94,93,93,93,93,93,92,92,92,92,92,92,91,91,91,91,91,91,91, 91,91,91,91,91,91,91,91,91,90,90,90,90,90,90,89,89,89,89,89,89, 88,88,88,88,88,88,88,88,88,88,87,87,87,87,87,87,87,87,86,86,86, 85,85,85,85,85,85,84,84,84,83,83,83,83,83,83,83,82,82,82,82,82, 82,82,82,82,82,82,81,81,81,81,81,81,81,81,80,80,80,80,79,79,79, 79,79,79,79,78,78,78,78,78,78,78,78,77,77,77,77,77,77,77,77,77, 77,77,76,76,76,76,76,75,75,75,75,75,75,74,74,74,74,74,74,74,74, 73,73,73,73,73,73,73,73,73,72,72,72,72,72,72,72,71,71,71,71,71, 71,71,71,71,70,70,70,70,70,70,70,70,70,69,69,69,69,69,69,69,69, 68,68,68,68,68,68,67,67,67,67,67,67,67,67,67,66,66,66,65,65,65, 65,65,65,64,64,64,64,64,64,64,64,64,63,63,63,63,63,63,63,63,63, 63,63,62,62,62,62,62,62,62,61,61,61,60,60,60,60,59,59,59,59,59, 59,59,59,59,58,58,58,58,58,58,58,57,57,57,57,57,57,56,56,56,56, 56,56,55,55,55,55,55,55,55,55,55,54,54,54,54,54,53,53,53,53,53, 53,53,53,52,52,52,52,52,52,52,51,51,51,51,51,51,51,50,50,50,50, 50,49,49,49,49,49,49,48,48,48,48,48,48,48,48,47,47,47,47,46,46, 46,46,46,46,46,46,46,46,45,45,45,45,45,45,45,45,45,44,44,44,44, 44,43,43,43,43,43,43,43,42,42,42,42,42,42,42,41,41,41,41,41,41, 40,40,40,40,40,40,40,40,39,39,39,39,39,39,38,38,38,38,38,38,38, 37,37,37,37,37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,36, 35,35,35,35,34,34,34,34,34,34,34,33,33,33,33,33,32,32,32,32,32, 31,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30 }; const int n4c3w1_a[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,99,99,98,98,97,97,97,96, 96,96,96,96,96,96,96,95,95,95,95,94,94,94,93,93,93,93,93,92,92, 92,92,92,91,91,91,91,91,90,90,89,89,89,89,89,89,88,88,88,88,86, 86,85,85,85,84,84,84,84,83,83,83,83,83,83,83,82,82,81,81,81,81, 81,81,81,81,81,81,80,80,80,80,79,79,79,79,79,79,79,78,78,78,78, 78,78,78,77,77,77,77,77,77,76,75,75,74,74,74,74,74,74,74,73,73, 73,72,72,72,72,72,72,72,72,72,71,70,70,69,69,68,68,68,68,68,67, 66,66,66,65,65,65,65,65,65,65,65,65,64,64,64,64,64,64,64,64,63, 63,63,62,62,62,62,62,62,61,61,61,60,60,60,60,60,60,60,59,59,59, 59,59,59,59,59,59,59,59,58,58,58,57,57,57,57,56,56,56,56,56,56, 56,55,55,55,54,54,54,54,54,54,54,54,54,53,53,53,52,52,52,52,51, 51,51,51,50,50,50,49,49,49,48,48,48,48,48,48,48,48,48,48,48,48, 47,47,47,47,47,46,46,46,46,45,45,45,45,45,45,45,45,44,44,44,44, 44,43,43,43,43,43,43,43,43,42,42,42,42,42,42,41,41,41,41,41,41, 41,41,40,40,40,40,39,39,39,39,39,38,38,38,37,37,37,37,37,37,36, 36,36,36,36,35,35,35,35,34,34,34,34,34,34,34,34,33,33,33,33,33, 32,32,32,32,32,32,32,31,31,31,31,30,30,30,30,30,30,30,30,30,30, 29,29,29,28,28,28,28,28,28,27,27,27,27,26,26,26,25,25,25,25,25, 25,25,24,24,24,24,24,24,23,23,23,23,23,22,22,22,22,22,22,21,21, 21,21,21,21,21,21,21,20,20,20,20,20,19,19,19,19,19,19,19,19,18, 18,18,18,18,18,18,18,18,17,17,16,16,16,15,15,15,15,15,14,14,14, 14,14,14,14,13,13,13,13,12,12,12,11,11,11,11,11,10,10,10,10,10, 9,9,9,9,8,8,8,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,5,5,4,4,4,3,3,3,3, 3,2,2,2,2,1,1,1,1 }; const int n4c3w1_b[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,100,100,99,99,99, 99,99,99,99,98,98,98,97,97,97,97,96,96,96,95,95,95,95,95,95,94, 93,93,93,92,92,92,92,92,91,91,91,91,91,91,90,89,89,88,87,87,87, 87,87,86,86,86,86,86,85,85,85,85,84,84,84,84,84,84,83,83,83,82, 82,82,82,82,81,81,81,81,81,80,80,80,80,80,80,80,80,80,79,79,79, 79,78,78,78,77,77,77,76,76,76,75,75,75,75,75,75,74,74,73,73,73, 73,72,72,72,72,72,71,71,70,69,69,69,69,69,68,68,68,68,68,68,68, 68,68,67,67,67,66,65,65,65,65,65,65,64,64,64,64,64,63,63,63,63, 62,62,61,61,61,61,61,60,60,60,60,60,60,60,60,60,59,59,59,59,59, 59,59,58,58,58,58,58,58,58,58,57,57,57,57,56,56,56,56,55,55,55, 55,55,55,55,54,54,54,54,54,54,53,53,53,53,53,52,52,52,52,52,52, 52,52,52,52,51,51,51,51,51,51,51,51,50,50,50,50,50,50,50,49,49, 49,49,49,49,49,48,48,48,48,48,48,47,47,47,47,47,47,46,46,46,45, 45,45,45,45,45,45,45,45,44,44,44,44,44,44,44,43,43,43,43,43,43, 42,42,42,42,42,41,41,41,40,40,40,40,39,39,39,39,39,39,38,38,38, 38,37,37,37,36,36,36,36,36,36,35,35,35,35,35,34,34,34,34,34,33, 33,33,33,33,33,32,32,32,32,31,31,31,31,31,31,30,30,30,30,30,30, 30,30,29,29,29,29,29,29,29,29,29,28,28,28,28,28,28,28,27,27,27, 26,26,26,26,26,25,25,25,25,24,24,24,24,24,23,23,23,23,23,23,23, 22,22,22,22,22,22,22,22,22,22,22,21,21,21,21,20,20,20,20,19,19, 18,18,18,18,18,18,17,17,17,17,17,17,16,16,16,16,16,15,15,15,15, 15,15,14,14,14,14,14,14,13,13,13,13,13,13,13,13,13,12,12,12,11, 10,10,9,9,9,9,9,9,9,8,7,7,7,6,6,6,6,5,5,5,5,5,5,4,4,4,3,3,3,3, 3,3,3,3,3,2,2,2,1,1,1,1,1 }; const int n4c3w1_c[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,99,99,99,99,99,99,99,98,98,98,98,98,97,97,96,96,96,96, 96,96,96,95,95,95,94,94,94,94,94,93,93,93,93,93,93,92,92,92,92, 92,92,91,91,91,91,90,90,90,90,89,89,89,89,89,89,89,88,88,88,88, 88,88,88,87,87,87,87,86,86,86,86,86,86,85,84,84,83,83,83,83,83, 82,82,81,81,81,80,80,79,79,78,78,78,78,78,78,78,77,77,77,77,77, 77,77,76,76,76,75,75,75,75,75,75,75,75,74,74,74,74,74,74,74,73, 73,73,73,72,72,72,72,71,71,71,71,71,71,71,70,70,70,70,70,69,69, 69,69,69,68,68,68,68,68,68,67,67,66,66,66,66,66,66,66,66,65,65, 65,65,64,64,64,64,64,63,63,63,63,63,63,62,62,62,62,62,62,62,61, 61,61,61,60,60,60,59,59,59,59,59,59,59,58,58,58,58,58,58,57,57, 57,57,57,57,56,56,56,56,56,56,56,55,55,55,55,55,54,53,53,53,53, 53,53,53,53,53,53,52,52,52,52,51,51,51,51,51,50,50,50,50,49,49, 49,49,49,48,48,48,48,48,48,48,48,47,47,47,47,46,46,46,45,45,45, 45,45,45,45,45,45,44,44,44,44,44,44,44,43,43,43,42,42,42,42,42, 42,42,41,40,40,40,39,39,39,39,39,38,38,38,38,38,37,37,37,37,37, 37,37,37,37,37,36,36,36,36,36,36,36,36,36,35,35,34,34,34,34,34, 33,33,33,33,33,32,32,32,32,32,32,32,32,31,31,31,31,31,30,30,30, 30,29,29,29,29,29,28,27,27,27,27,27,27,27,26,25,25,25,25,25,25, 25,24,24,24,24,24,24,23,23,23,22,22,22,22,22,22,21,21,21,21,21, 20,20,19,19,19,19,19,19,19,19,19,19,19,19,19,18,18,18,17,17,17, 16,16,15,15,15,15,15,15,15,15,14,14,14,14,14,14,14,13,13,13,13, 13,13,13,12,12,12,12,12,12,12,11,11,11,11,11,10,10,10,10,9,9, 8,8,8,8,7,7,7,6,6,6,6,5,5,5,5,5,5,5,4,4,4,4,4,3,3,3,3,3,3,3,2, 2,2,2,2,2,1,1,1 }; const int n4c3w1_d[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,99,99,99,98,98,98,98,97,97,97,96,96,96, 96,96,96,95,95,94,94,93,93,93,93,93,93,93,92,92,92,92,92,91,91, 91,91,91,91,90,90,90,90,90,90,89,88,87,87,86,86,86,86,86,85,85, 85,85,85,85,84,84,84,84,83,83,83,83,83,82,82,82,81,81,80,80,80, 79,79,79,78,78,78,77,77,77,77,77,77,77,76,76,76,76,75,75,74,74, 73,73,73,73,73,72,72,72,72,72,72,72,72,71,71,71,71,70,70,70,70, 70,69,69,69,69,69,69,69,69,68,68,68,67,67,67,67,67,66,66,66,66, 66,66,66,65,65,65,65,65,65,65,65,65,64,64,64,64,63,63,63,63,63, 62,62,62,61,61,60,60,60,60,60,59,59,58,58,58,58,58,57,57,57,57, 57,57,57,57,56,56,56,56,56,55,55,55,55,55,55,55,55,54,54,54,54, 54,54,54,54,54,53,53,53,52,52,52,52,51,51,50,50,50,50,49,49,49, 49,48,48,48,48,48,48,48,48,48,47,47,47,46,46,46,46,46,45,45,45, 45,45,45,45,45,44,44,44,44,44,44,43,43,43,43,43,43,42,42,42,42, 41,41,41,41,41,40,40,40,40,39,39,39,39,39,38,38,38,38,38,38,38, 37,37,37,37,37,37,36,36,36,36,35,35,35,35,35,35,34,34,34,34,34, 34,33,33,32,32,32,32,31,31,31,30,30,30,30,30,30,30,30,30,30,30, 30,30,29,29,29,29,29,29,28,28,28,28,28,28,28,27,27,27,27,27,27, 27,26,26,26,26,26,26,26,25,25,25,25,25,25,25,25,25,24,24,24,24, 24,23,23,23,23,23,23,22,22,21,21,21,21,21,21,20,20,20,20,20,20, 20,19,19,19,19,18,18,17,17,17,17,17,17,17,17,16,16,16,15,15,15, 15,14,14,14,14,14,14,14,13,13,13,13,12,12,12,12,12,12,11,11,11, 11,11,11,11,11,11,11,10,10,10,10,10,10,9,9,9,9,9,9,8,8,8,8,8, 8,7,7,7,7,7,6,6,6,6,5,5,5,5,5,5,4,4,4,4,4,4,4,3,3,2,2,2,2,2,2, 2,2,2,1,1 }; const int n4c3w1_e[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,99,99,98,98,98,98,97,97,97,97,96,96,96,96,96,96,96, 96,95,95,95,95,95,95,95,94,94,93,93,93,93,92,92,92,91,91,91,90, 90,90,90,89,89,89,89,88,88,88,88,88,88,87,87,87,87,87,86,86,86, 86,86,86,86,86,86,86,86,86,85,85,85,85,85,85,84,84,84,84,84,84, 84,84,84,83,83,83,83,83,82,82,82,82,82,82,81,81,81,81,80,80,80, 80,80,80,79,79,79,79,79,79,79,78,78,77,77,77,77,77,77,76,76,76, 75,75,75,75,75,75,74,74,74,74,73,73,73,73,73,73,73,73,73,73,72, 72,72,72,71,71,71,70,70,69,69,69,69,69,69,68,68,68,68,68,68,68, 67,67,67,67,66,66,66,66,66,65,65,65,65,65,65,65,65,65,64,64,64, 64,63,63,63,63,62,62,62,62,62,62,61,60,60,60,60,60,60,59,59,59, 59,59,58,58,58,57,57,57,57,57,56,56,56,56,55,55,55,55,55,55,55, 54,54,54,54,54,53,53,52,52,51,51,51,51,50,50,50,50,50,50,50,49, 49,49,49,48,48,48,48,48,48,47,47,46,46,46,46,46,45,45,45,44,44, 44,44,43,43,43,43,42,42,42,42,42,41,41,41,41,41,41,41,41,41,40, 40,40,40,40,39,39,39,39,38,38,38,37,37,37,37,37,37,36,36,36,35, 35,35,34,34,34,34,34,34,34,33,33,33,33,33,33,33,33,32,32,32,32, 31,31,31,31,31,31,30,30,30,30,30,30,30,29,29,29,29,28,28,28,27, 27,27,27,26,26,26,26,26,26,26,25,25,25,24,24,23,23,23,23,23,23, 23,23,22,22,22,21,21,21,21,21,21,20,20,20,19,19,19,19,19,19,19, 19,19,18,18,18,18,17,17,17,16,16,16,16,16,16,15,15,15,15,15,14, 14,14,14,14,13,13,13,13,13,12,12,12,12,12,12,12,12,12,11,11,11, 11,11,11,11,11,10,10,10,9,9,9,9,9,8,8,8,8,8,8,7,7,7,7,7,7,6,6, 6,6,6,6,5,5,5,5,5,4,4,4,4,4,4,4,4,4,3,3,3,3,2,2,2,2,2,1,1,1,1, 1,1 }; const int n4c3w1_f[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,98,98,97,97,97,97,96,96,96,96,95, 95,95,95,94,94,94,94,94,94,94,93,93,92,92,92,92,92,91,91,91,91, 91,91,90,90,90,90,89,89,89,89,89,89,88,88,88,88,88,88,87,87,87, 87,86,86,86,86,86,86,86,85,85,85,85,84,84,84,84,84,83,83,83,83, 83,83,83,83,83,83,83,83,82,82,82,82,81,81,81,80,80,80,80,79,79, 79,78,78,78,78,78,78,77,77,77,77,77,77,76,76,76,76,76,75,75,75, 75,74,74,74,73,73,73,73,73,73,73,73,73,72,72,71,71,71,71,71,71, 71,70,70,70,70,69,69,69,68,68,68,67,67,67,67,67,67,67,67,67,66, 66,66,66,66,66,66,66,65,64,64,64,64,64,64,63,63,62,62,61,61,61, 60,60,59,59,59,59,59,59,58,58,58,58,57,57,57,57,56,56,56,56,56, 56,55,55,55,54,54,54,54,54,54,54,54,53,53,53,52,52,52,52,51,51, 51,51,51,51,50,50,50,50,50,50,49,49,49,49,48,48,48,48,47,47,47, 47,47,46,46,46,46,46,46,45,45,45,45,45,45,44,44,44,44,43,43,43, 43,42,42,42,42,42,42,42,42,42,41,41,40,40,40,40,40,39,39,39,39, 38,38,38,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,36,35,35, 35,35,34,34,34,34,34,34,33,33,33,33,33,32,32,32,32,32,31,31,31, 31,30,30,30,30,30,30,30,30,30,30,29,29,29,29,29,28,28,28,28,28, 27,27,27,26,26,26,26,26,25,25,25,25,25,25,25,25,25,24,24,24,24, 24,24,24,24,24,24,24,24,24,23,23,23,23,23,22,22,22,22,22,22,22, 22,21,21,21,21,21,21,20,20,20,20,20,20,20,20,19,19,19,19,18,18, 18,18,18,18,18,18,17,17,17,17,17,16,16,15,14,14,14,14,14,14,14, 13,13,13,13,12,11,11,9,9,9,9,9,9,9,9,8,8,8,8,8,7,7,7,7,7,6,6, 6,5,5,5,5,5,5,5,5,5,4,4,4,4,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,1, 1,1,1 }; const int n4c3w1_g[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,98,98,98,98,98,97,97,97,97,96,96, 96,96,96,96,95,95,95,95,95,95,94,94,94,94,94,94,94,94,93,93,93, 93,93,93,93,93,93,92,92,92,92,92,92,91,91,91,91,91,91,90,90,90, 89,89,89,88,87,87,87,87,87,86,86,86,86,86,85,85,85,84,84,84,84, 83,83,83,83,83,83,83,82,82,82,82,81,81,81,81,81,81,81,80,80,80, 80,80,80,80,80,79,79,79,79,79,79,78,78,78,78,78,78,77,77,77,77, 77,76,76,76,75,75,75,75,75,75,75,74,74,73,73,73,72,72,72,72,72, 71,71,71,71,71,71,71,71,70,70,70,69,69,69,69,68,68,68,68,68,68, 67,67,67,67,67,66,66,65,65,65,65,65,65,65,64,64,64,64,64,64,63, 63,63,63,63,63,62,62,61,61,61,61,61,61,61,60,60,60,60,59,59,59, 58,58,57,57,57,57,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55, 55,54,54,53,53,53,53,53,53,53,53,53,53,52,52,52,52,52,52,51,51, 50,50,49,49,49,49,49,49,49,49,48,48,48,48,48,48,48,48,47,47,47, 47,47,47,47,47,47,47,47,46,46,46,46,45,45,45,45,45,44,44,44,44, 44,44,43,43,43,42,42,42,42,41,41,41,41,41,41,40,39,39,39,39,38, 38,38,38,38,38,38,38,38,37,37,37,37,37,37,36,36,36,36,36,36,35, 34,34,33,33,33,33,33,33,32,32,32,32,31,30,30,29,29,29,29,29,28, 28,28,28,27,27,27,27,27,26,26,26,26,26,26,26,26,26,26,25,25,25, 25,25,25,25,24,24,24,24,24,23,23,23,23,23,23,23,22,22,22,21,21, 21,21,21,21,21,21,21,20,20,20,20,20,20,19,19,19,18,18,18,18,18, 18,17,17,17,16,16,16,16,15,15,15,15,14,14,14,14,13,13,13,13,12, 12,12,12,12,11,11,11,11,10,10,9,9,9,9,9,8,8,8,8,8,7,7,7,7,7,7, 6,6,6,6,5,5,5,5,5,5,5,4,4,4,4,4,4,4,4,4,3,3,3,3,2,2,2,2,1,1,1, 1,1,1,1 }; const int n4c3w1_h[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,98,98,97,97,97,97,97,97,97,97,97,97,96, 96,96,96,95,95,95,95,95,94,94,94,94,94,94,94,94,93,93,93,93,92, 92,92,92,92,92,91,91,91,91,90,90,90,90,90,90,90,90,89,89,89,89, 89,88,88,88,88,88,88,87,87,87,87,87,87,87,87,87,87,87,86,86,86, 86,86,86,86,86,86,85,85,85,85,85,85,84,84,84,83,83,83,82,82,82, 82,82,81,81,81,81,81,81,80,80,79,79,79,79,79,79,79,79,79,78,78, 78,78,78,77,77,77,76,76,76,76,75,75,75,75,74,74,74,74,74,73,73, 73,73,73,72,72,72,71,70,70,70,70,70,70,70,69,69,69,69,69,68,68, 68,68,68,68,68,68,67,67,67,67,67,67,67,66,66,66,66,66,66,66,65, 65,65,65,65,65,64,64,63,63,63,63,63,63,62,62,62,62,62,61,61,61, 61,60,60,60,60,60,60,59,59,59,59,59,59,58,58,58,58,57,57,57,57, 56,56,55,55,55,55,54,54,54,54,54,54,53,53,53,53,53,53,53,53,52, 52,52,52,51,51,50,50,50,50,50,49,49,49,49,48,47,47,47,47,47,47, 47,47,47,47,46,46,46,46,46,45,45,44,44,43,43,42,42,42,41,41,41, 41,41,40,40,40,40,40,40,40,40,40,40,40,39,39,39,39,39,38,38,38, 38,37,37,37,37,36,36,36,35,35,35,35,35,35,34,34,34,33,33,33,33, 33,33,32,32,32,32,32,32,32,32,32,32,32,31,31,30,30,30,30,30,29, 29,28,28,28,27,27,27,27,27,26,26,26,26,26,26,25,25,25,25,25,24, 24,24,23,23,23,23,23,23,22,22,22,22,22,22,21,21,21,21,21,21,20, 20,20,20,19,19,19,19,18,18,18,18,18,17,17,16,16,16,16,16,16,16, 16,15,15,15,15,15,15,15,15,15,14,14,14,14,14,13,13,13,13,12,12, 12,12,12,12,11,11,11,11,11,11,10,10,9,9,9,9,9,8,8,8,8,8,8,7,7, 7,7,7,7,7,7,7,6,6,6,6,6,6,5,5,5,5,5,4,4,4,3,3,3,3,3,3,3,2,2,2, 2,2,1,1,1 }; const int n4c3w1_i[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,99,99,99,99,98,97,97,96,96,96,96, 96,96,95,95,94,94,94,94,93,93,93,92,92,92,92,92,91,91,90,90,90, 90,90,90,89,89,89,89,89,88,88,88,88,88,87,87,87,87,86,86,86,86, 86,86,85,85,85,85,85,85,85,84,84,84,83,83,83,82,82,82,82,81,81, 81,81,81,81,81,81,80,80,80,80,80,80,80,79,79,79,79,79,79,78,78, 78,78,78,78,78,78,77,77,77,77,77,77,77,77,77,76,76,75,75,75,75, 74,74,74,74,74,73,73,73,73,73,72,72,72,72,72,72,72,71,71,71,71, 71,71,70,70,70,70,70,70,69,69,69,68,68,68,68,67,67,67,67,67,67, 67,66,66,66,66,66,66,66,66,66,65,65,65,65,65,65,64,64,64,64,64, 64,63,63,63,63,63,62,62,62,62,62,61,61,61,61,61,60,60,60,60,60, 60,60,59,59,58,58,58,58,58,58,57,57,57,56,56,56,56,56,55,55,55, 55,55,55,54,54,54,54,53,53,53,53,53,53,52,52,52,52,51,51,50,50, 50,50,49,48,48,48,48,48,48,47,47,47,47,47,47,47,47,46,46,46,46, 46,46,46,45,45,44,44,44,44,43,43,43,42,42,42,41,41,41,41,41,41, 41,40,40,40,40,40,40,39,39,38,38,38,38,38,38,37,37,37,37,37,37, 37,37,37,37,36,36,35,35,35,35,35,35,35,34,34,33,33,33,33,33,32, 32,32,32,31,31,31,31,31,31,31,30,30,30,30,30,30,30,29,29,29,29, 29,29,29,29,29,28,28,27,27,27,27,27,27,26,26,26,26,26,26,26,26, 26,25,25,25,25,25,25,24,24,24,24,24,24,24,24,23,23,23,23,22,22, 22,22,21,21,21,21,21,21,21,20,20,20,20,20,20,20,20,19,19,19,19, 19,18,18,18,18,18,17,17,16,16,16,16,16,16,16,15,15,15,15,14,14, 14,14,14,13,13,13,13,12,12,12,12,12,12,12,12,11,11,11,11,11,11, 10,10,10,10,10,9,8,8,8,8,8,8,8,7,6,6,6,5,5,5,5,5,5,4,4,4,4,4, 4,3,3,3,2,2,2,1,1,1,1,1 }; const int n4c3w1_j[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,98,98,98,98,98,98,97, 97,96,96,95,95,95,95,95,95,95,95,94,93,93,93,92,92,92,92,92,92, 92,91,91,91,91,91,91,90,89,89,89,89,88,88,88,88,87,87,87,87,87, 87,87,87,87,86,86,86,86,86,86,85,85,85,85,85,84,84,84,84,84,83, 83,82,82,82,82,82,82,81,81,81,81,81,81,81,81,80,80,80,80,80,80, 80,79,79,79,79,79,78,78,78,78,78,77,77,77,77,77,77,76,76,76,76, 76,76,75,75,75,75,75,75,74,73,73,73,73,73,73,72,72,72,72,72,72, 71,71,71,71,71,71,71,70,70,69,69,69,68,68,68,68,68,68,68,68,67, 67,67,67,67,66,66,66,66,66,66,66,66,65,65,65,65,65,65,65,64,64, 63,63,62,62,62,62,62,62,61,61,61,61,61,61,60,60,59,59,59,59,59, 59,59,59,58,58,58,58,58,58,58,58,58,57,57,56,56,56,56,56,55,55, 55,55,55,55,55,55,54,54,53,53,53,53,53,53,52,52,52,52,52,52,52, 51,51,51,51,51,51,50,50,50,50,50,49,49,49,49,49,49,48,48,48,48, 48,47,47,47,47,47,47,47,46,46,46,46,46,46,45,45,45,45,45,44,44, 44,44,44,44,43,43,42,42,42,42,42,42,42,41,41,41,41,40,40,40,40, 40,40,40,40,39,39,39,39,39,39,38,38,38,38,37,37,37,37,37,36,36, 36,36,36,36,35,35,35,35,35,35,34,34,34,34,34,33,33,33,33,33,32, 32,32,31,30,30,30,30,30,30,29,29,29,28,28,28,28,27,27,26,26,25, 25,25,25,24,24,24,24,23,23,23,23,23,23,23,22,22,22,22,22,22,21, 21,21,20,20,20,20,20,19,19,19,19,19,18,18,18,17,17,17,17,17,17, 17,17,16,16,16,16,16,16,15,15,14,14,14,14,14,14,14,13,13,13,13, 13,12,12,12,11,11,10,10,10,10,10,10,9,9,9,9,9,9,8,8,8,8,8,8,8, 8,7,7,7,7,7,7,7,6,6,5,5,5,4,4,4,4,4,3,3,3,3,3,2,2,2,2,2,2,2,2, 2,2,2,1,1,1 }; const int n4c3w1_k[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,98, 98,97,97,97,97,97,97,96,96,96,96,96,96,96,95,95,95,94,94,94,94, 94,94,93,93,92,92,91,91,91,91,91,90,90,90,90,89,89,89,89,89,89, 88,88,88,87,87,86,86,85,85,85,85,84,84,84,84,84,83,83,83,83,83, 82,82,82,82,82,82,81,81,81,81,81,81,80,80,80,80,80,79,79,79,79, 79,78,78,78,78,78,78,78,77,77,77,77,77,77,76,76,76,76,76,76,76, 75,75,75,75,74,74,74,74,74,74,73,73,73,72,72,72,72,72,72,72,71, 71,70,70,70,70,70,70,69,69,69,69,68,68,68,68,68,67,67,67,67,67, 67,67,66,66,66,66,66,66,66,65,65,65,64,64,64,64,63,63,63,63,63, 63,63,63,62,62,62,62,60,59,59,59,59,59,59,59,59,58,58,58,58,56, 56,56,56,55,55,55,54,53,53,53,53,52,52,52,52,52,52,51,51,51,51, 51,51,51,50,50,50,49,49,49,48,48,48,48,48,48,48,47,47,47,47,47, 47,47,46,46,46,46,46,45,45,45,45,45,45,45,44,44,44,44,43,43,43, 43,43,42,42,42,42,42,42,41,41,41,41,41,41,41,41,40,40,40,40,40, 40,40,40,39,39,39,39,39,38,38,37,37,37,37,36,36,36,36,36,36,36, 35,35,35,35,35,35,35,35,35,34,34,34,34,33,33,33,33,33,33,32,32, 32,32,31,31,31,31,31,30,30,30,29,29,29,29,29,29,29,28,28,28,28, 28,27,27,27,26,26,26,26,26,26,25,25,25,25,25,24,24,24,24,23,23, 23,23,23,23,23,23,22,22,22,22,21,21,21,21,21,20,20,20,20,20,20, 20,19,19,19,19,19,18,18,18,18,18,18,18,18,18,18,18,17,17,17,17, 17,17,16,16,15,15,14,14,14,14,14,14,14,14,13,13,13,13,13,13,12, 12,12,12,11,11,11,10,10,10,10,9,9,9,9,9,9,9,8,8,8,8,7,7,7,7,7, 7,7,7,6,6,6,6,6,5,5,5,4,4,4,4,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2, 1,1,1,1,1 }; const int n4c3w1_l[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,98,98,98,98,98,98,97,97,97,97,97, 97,97,97,97,96,96,95,95,94,94,94,94,93,93,93,93,93,93,92,92,92, 92,92,92,91,91,91,91,91,90,89,89,88,88,88,88,88,87,87,87,87,86, 85,85,85,85,84,84,84,83,83,83,83,82,81,81,81,81,81,81,81,80,80, 79,79,79,79,79,79,79,79,78,78,78,78,78,78,77,77,77,77,77,77,77, 76,76,76,76,76,75,75,75,74,74,74,74,74,74,74,74,73,73,73,73,72, 72,72,72,72,72,71,71,71,71,70,70,70,70,70,69,69,69,69,68,68,68, 68,67,67,67,67,67,66,66,66,66,66,66,65,65,65,65,65,64,64,64,64, 64,64,64,63,63,63,63,63,63,63,62,62,61,61,61,60,60,60,60,59,59, 59,59,59,58,58,58,58,57,57,57,57,57,57,57,57,56,56,56,56,56,55, 55,55,54,54,54,53,53,53,52,52,52,52,52,52,52,51,51,51,50,50,50, 50,50,50,50,49,49,49,49,49,48,48,48,48,48,48,48,48,48,47,47,47, 47,47,47,46,46,46,46,46,46,45,45,45,45,45,45,45,44,44,44,44,44, 44,44,43,43,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,41,41, 41,41,40,40,40,40,39,39,39,39,39,38,38,38,38,38,38,37,37,37,36, 36,36,36,36,35,35,35,35,35,35,35,35,34,34,34,33,32,32,32,32,32, 32,32,32,32,32,32,32,31,31,31,31,31,31,30,30,30,30,30,29,29,29, 29,28,28,28,28,28,28,28,28,27,27,27,27,26,26,26,26,26,26,26,26, 26,26,25,25,25,25,25,25,25,24,24,24,23,23,23,23,23,23,23,23,23, 22,22,22,22,22,21,21,21,21,21,21,21,21,20,20,20,19,19,18,18,18, 17,17,17,17,16,16,16,15,15,14,14,14,14,14,14,13,13,13,13,13,13, 13,12,12,11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,9,9,9,8, 8,8,8,8,8,7,7,7,7,7,7,7,6,6,6,5,5,5,5,4,4,4,4,4,4,4,4,4,3,3,3, 3,2,2,2,2,1,1,1 }; const int n4c3w1_m[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,98,98,98,98,98,98,98,97,97,97,96,96, 96,96,96,95,95,95,95,95,94,94,93,93,93,93,92,92,92,92,91,90,90, 89,89,89,89,89,89,88,88,87,87,87,87,87,87,87,87,87,86,86,86,85, 85,85,85,85,85,84,84,84,84,84,84,84,84,84,83,83,83,82,82,82,82, 82,81,81,81,81,81,81,81,80,80,80,80,80,80,79,79,79,78,78,77,77, 77,76,76,76,76,76,76,76,75,75,75,75,75,75,75,75,74,74,74,74,74, 74,74,74,74,73,73,73,73,73,73,73,73,73,72,72,72,72,71,71,71,71, 71,71,71,71,71,71,70,70,70,70,70,70,70,70,69,69,69,69,69,69,69, 68,68,68,68,68,68,67,67,67,67,67,67,67,66,66,66,66,66,66,65,65, 65,64,64,64,64,64,63,62,62,62,62,61,61,60,60,60,60,60,60,59,59, 59,59,59,58,58,58,58,58,57,57,56,56,56,55,55,55,55,54,54,54,54, 54,54,54,54,54,54,53,53,53,53,53,52,51,51,51,51,51,50,50,50,50, 50,50,49,49,49,49,49,49,49,48,48,48,47,47,47,47,47,46,46,45,45, 45,45,45,45,45,45,44,44,44,44,43,43,43,43,43,42,42,42,42,42,42, 42,41,41,41,41,41,41,41,41,41,40,40,40,40,39,39,39,38,38,38,38, 37,37,37,37,37,37,37,36,36,36,36,35,35,35,35,35,35,35,34,34,34, 34,34,33,33,33,33,32,32,32,32,32,32,32,32,32,31,31,31,31,31,31, 29,29,29,29,29,29,29,28,28,27,27,27,27,27,27,26,26,26,26,25,25, 25,25,25,24,24,24,24,24,23,23,23,22,22,22,21,21,21,21,20,20,20, 20,20,18,18,18,18,18,18,18,17,17,17,17,17,17,17,17,17,16,16,16, 16,15,15,15,15,15,15,15,15,15,14,14,14,14,14,14,14,13,13,13,13, 13,13,13,12,12,12,12,12,12,11,11,11,11,11,11,11,10,10,10,10,10, 10,10,10,10,9,8,8,8,8,8,7,7,7,7,6,6,6,6,5,5,5,4,4,4,4,4,3,3,3, 3,2,2,2,2,2,2,1,1,1,1 }; const int n4c3w1_n[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,98,98,98,98,98,98,98,98,98,97,97, 97,97,97,97,97,97,96,96,96,96,96,95,95,95,95,95,95,95,94,94,94, 94,94,94,94,94,93,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92, 91,91,91,90,90,90,89,89,89,89,89,89,89,89,89,89,89,88,88,88,88, 87,86,86,86,86,85,85,84,84,84,84,84,84,83,83,83,83,83,83,83,82, 82,81,81,81,81,81,81,81,81,80,80,80,80,80,80,80,79,79,79,79,79, 79,79,78,78,78,78,77,77,77,77,77,77,77,77,76,76,76,76,75,75,75, 75,74,74,74,74,73,73,73,73,72,72,72,71,71,71,71,71,71,71,71,71, 71,71,70,70,70,69,69,69,69,69,69,69,68,68,67,67,67,67,67,67,67, 67,67,66,66,66,65,65,65,65,64,64,64,64,64,64,64,64,64,63,63,63, 63,63,63,63,62,62,61,61,61,60,60,60,60,59,59,59,59,59,59,59,58, 58,58,58,58,58,58,58,58,57,57,57,57,57,57,57,56,56,56,55,55,54, 54,54,54,54,54,53,53,53,52,52,52,52,52,51,51,51,51,51,51,51,51, 51,51,50,50,50,50,50,49,49,49,48,48,48,47,46,46,46,46,45,45,45, 45,44,44,44,44,44,43,43,43,43,43,43,42,41,41,41,41,41,41,41,40, 40,40,40,39,39,39,39,38,38,38,38,38,38,37,37,37,37,37,37,35,35, 35,34,34,34,33,33,33,33,32,32,32,32,32,32,32,32,31,31,31,31,31, 30,30,30,30,30,30,30,30,29,29,29,29,29,29,28,28,28,27,27,27,26, 26,26,26,26,26,26,26,26,25,25,25,25,25,25,24,24,24,23,23,23,23, 23,23,22,22,22,21,21,21,20,20,19,19,19,19,19,19,18,18,18,18,18, 18,18,17,17,17,17,17,16,15,15,15,15,14,14,14,14,14,14,13,13,13, 13,13,12,12,11,11,11,10,10,10,10,10,9,9,9,9,9,8,8,8,8,8,7,7,7, 7,7,7,7,6,6,6,5,5,5,5,5,5,4,4,4,4,3,3,3,3,3,3,3,3,3,2,2,2,2,2, 2,2,1,1,1 }; const int n4c3w1_o[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,98,98, 98,97,97,97,97,97,97,96,96,95,95,95,95,95,95,95,95,94,94,94,94, 94,94,93,92,92,92,92,91,91,91,91,91,91,91,91,91,90,90,90,90,90, 90,90,89,89,89,89,89,89,89,88,88,88,88,87,87,87,87,87,87,86,86, 86,86,85,84,84,84,84,83,83,83,82,82,82,82,82,82,82,82,82,82,82, 81,81,81,81,81,81,81,81,80,80,80,80,80,80,79,79,78,78,77,77,77, 77,77,76,76,76,75,75,75,75,75,74,74,74,74,74,73,73,72,72,72,72, 71,71,70,70,70,70,70,70,69,69,69,69,68,68,68,68,67,67,67,67,66, 66,66,66,66,66,65,65,65,65,64,64,64,64,64,64,64,64,64,64,63,63, 63,63,63,62,62,62,62,62,62,61,61,61,60,60,60,60,60,60,59,59,59, 58,58,58,58,58,57,57,57,57,57,57,56,56,56,56,56,56,56,56,56,55, 55,55,55,55,54,54,54,54,54,53,53,53,53,53,53,52,52,52,52,52,52, 52,52,51,51,51,49,49,49,49,49,49,48,48,48,48,48,47,47,47,47,47, 46,46,46,46,46,46,46,46,45,45,45,45,44,44,44,44,43,43,42,42,42, 42,42,42,42,42,42,41,41,41,41,41,41,41,40,40,40,39,39,38,38,38, 38,38,38,38,38,37,37,36,36,36,35,35,35,34,34,34,33,33,33,33,33, 32,32,32,32,32,32,31,31,31,31,31,31,31,31,31,30,30,30,30,30,29, 29,28,28,28,28,27,27,27,27,27,27,26,26,26,26,25,25,25,25,25,25, 25,25,25,24,24,24,24,24,23,23,23,23,23,23,23,23,22,22,22,22,22, 22,22,21,21,21,21,20,20,20,20,20,19,19,18,18,18,18,18,18,17,17, 17,17,17,17,16,16,16,16,16,15,15,15,14,14,14,13,13,13,13,13,13, 13,12,12,12,12,12,11,10,10,10,10,10,10,10,9,9,9,9,9,9,8,8,8,8, 8,7,7,7,7,7,7,7,6,6,6,5,5,5,5,5,5,5,4,4,4,4,4,4,3,3,3,2,2,2,2, 2,2,2,1,1,1,1,1 }; const int n4c3w1_p[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,99,99,99,98,98,98,98,97,97,97,97,97,97,97,97,96,96, 96,96,96,96,95,95,95,95,94,94,94,94,94,94,94,94,94,93,93,93,93, 93,93,93,93,92,91,91,91,91,90,90,89,89,89,89,89,89,88,88,87,86, 86,86,86,86,85,85,85,85,85,85,85,84,84,84,84,84,84,84,83,83,82, 82,82,82,82,81,80,80,79,79,79,79,79,79,79,79,79,78,78,78,78,78, 78,77,77,77,77,77,76,76,76,76,76,76,75,75,75,75,74,74,74,74,74, 74,74,74,74,74,74,74,74,74,73,73,73,73,72,72,72,72,72,72,72,72, 72,72,72,71,71,71,71,71,71,70,70,70,70,70,70,69,69,69,69,69,69, 69,68,68,68,68,68,68,67,67,67,66,66,66,66,65,65,65,65,65,65,65, 64,64,64,64,63,63,63,63,63,63,62,62,62,61,61,61,61,61,60,60,59, 59,59,59,59,59,59,58,58,58,58,58,57,57,56,56,56,56,54,54,54,54, 54,54,53,53,53,53,53,53,52,52,52,52,52,52,52,51,51,51,51,51,50, 50,50,50,49,49,48,48,48,48,48,48,48,47,47,47,46,46,46,46,46,46, 46,46,45,45,45,45,45,44,44,44,44,44,44,44,44,44,44,43,43,43,43, 43,43,42,42,41,41,41,41,41,41,41,40,40,40,40,39,39,38,38,38,38, 37,37,37,37,36,36,36,36,36,35,35,35,35,35,35,34,34,34,34,34,33, 33,33,33,32,32,32,32,32,31,31,31,30,29,29,29,29,29,29,28,28,28, 28,28,27,27,27,27,26,26,26,26,26,26,26,26,25,25,25,25,24,24,24, 24,24,23,23,23,23,23,23,22,22,22,22,22,22,21,21,21,20,20,20,20, 20,19,19,18,18,18,17,17,17,17,17,16,16,16,16,16,16,16,16,16,15, 14,14,14,14,14,14,14,13,13,13,13,13,12,12,12,12,12,12,12,11,11, 11,11,11,11,11,10,10,10,10,10,10,10,10,9,9,9,9,9,8,8,8,8,8,7, 7,6,6,6,6,5,5,5,5,5,4,4,4,4,4,4,4,4,3,3,3,3,2,2,2,2,2,2,2,2,1, 1,1,1,1,1 }; const int n4c3w1_q[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,98,98,98,98,97,97,97,97,97,96,96,96,96, 96,96,96,96,96,95,95,95,95,95,95,94,94,94,94,94,94,93,93,93,93, 93,92,92,92,92,92,92,92,91,91,90,90,90,90,90,89,89,89,89,89,89, 89,88,87,87,87,87,87,86,86,86,86,86,86,86,85,85,85,85,85,85,84, 84,84,84,84,84,84,83,83,83,83,83,83,83,83,83,82,82,81,81,81,81, 81,80,80,80,80,79,79,79,79,78,78,78,78,78,78,77,77,77,77,77,76, 76,76,76,76,76,76,76,76,75,75,74,74,74,74,73,73,73,72,72,72,72, 72,72,71,71,71,71,71,71,71,70,70,70,70,70,70,69,69,69,69,69,68, 68,68,68,68,67,67,67,67,67,67,67,67,67,66,66,66,66,66,66,66,66, 66,66,66,66,65,65,65,65,65,64,64,64,64,64,64,64,64,64,64,63,63, 62,62,62,62,62,62,61,61,61,61,60,60,60,60,60,59,59,59,58,58,58, 58,58,58,58,58,57,57,57,56,56,56,56,56,56,56,56,56,55,55,55,54, 54,54,54,53,53,53,53,53,53,53,53,52,52,51,51,51,51,51,51,51,50, 50,50,50,49,49,49,49,48,48,48,48,48,47,47,46,46,46,46,45,45,44, 44,44,44,43,43,43,43,43,42,42,42,42,42,42,42,42,41,41,41,41,41, 41,41,40,40,40,40,40,40,40,40,40,40,40,39,39,39,39,39,39,39,39, 39,38,38,38,38,38,37,37,37,37,36,36,36,36,36,36,36,36,36,35,35, 35,34,34,34,34,33,33,33,32,32,32,31,31,31,31,31,30,30,29,29,29, 28,28,28,28,28,28,27,27,27,26,26,26,26,26,26,26,26,25,25,25,25, 25,25,25,24,23,23,23,23,23,22,22,21,21,20,20,20,20,20,20,19,18, 18,18,18,17,17,17,17,16,16,16,15,15,15,15,15,15,15,15,15,14,14, 14,14,14,14,13,13,13,13,13,13,12,12,12,12,12,12,12,12,11,11,11, 10,10,10,10,10,10,10,9,9,9,9,9,8,8,8,8,8,8,7,7,7,7,6,6,5,5,4, 4,4,3,2,2,2,2,2,2,1,1,1,1 }; const int n4c3w1_r[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,98,98,98,98,98,97, 97,96,96,96,96,95,95,95,95,95,95,95,95,95,95,94,94,94,94,93,93, 93,93,92,92,92,92,92,92,91,91,91,91,90,90,90,90,90,90,89,89,89, 89,88,88,88,88,87,87,87,87,87,87,86,86,85,85,84,84,83,83,83,83, 83,83,82,82,82,82,81,81,81,81,80,80,80,80,80,80,80,80,79,79,79, 79,79,79,79,79,79,79,78,78,78,78,77,77,77,76,76,76,76,75,75,75, 75,75,75,74,74,73,73,73,72,72,72,72,72,72,72,72,71,71,71,71,71, 71,71,71,70,70,70,70,70,70,70,69,69,69,68,68,68,68,67,67,67,67, 67,67,67,67,67,66,66,66,66,65,65,65,65,65,64,64,64,64,63,63,63, 63,62,62,62,62,62,61,61,61,61,61,61,61,61,61,61,61,61,60,60,60, 60,60,59,59,59,58,58,58,58,58,58,58,58,57,57,57,57,56,56,55,55, 55,55,55,54,54,54,54,53,53,53,53,53,52,52,52,52,52,52,51,51,51, 51,51,51,51,51,50,49,48,48,48,48,48,48,47,47,47,46,46,46,46,45, 45,45,45,45,45,44,44,43,43,43,42,42,42,42,42,41,41,41,40,40,40, 40,40,40,40,40,40,40,39,39,39,39,38,38,38,38,38,38,38,38,37,37, 37,37,36,36,36,36,36,34,34,34,34,33,33,33,33,33,32,32,32,32,32, 32,31,31,31,31,31,31,31,31,30,30,30,30,29,29,29,29,29,29,29,29, 29,28,28,28,28,28,28,28,28,28,28,28,28,27,27,27,27,26,26,26,26, 26,25,25,25,25,25,24,24,24,24,24,24,23,23,23,23,23,22,22,22,22, 22,22,21,21,21,20,20,19,19,19,19,19,19,19,19,18,18,18,18,17,17, 17,17,17,17,16,16,16,16,15,15,14,14,14,14,13,13,13,13,13,13,13, 12,12,12,12,11,11,11,11,11,11,11,11,11,11,10,10,10,9,9,9,9,9, 9,8,8,8,8,7,7,7,7,6,6,6,6,6,6,6,6,5,5,5,5,5,4,4,4,4,4,4,4,4,4, 3,3,3,2,2,2,1,1,1 }; const int n4c3w1_s[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,99,99,99,99,99,98,98,98,98,98,98,97,97,97,97,96,96,96, 96,96,96,95,95,95,95,95,95,95,95,94,94,94,94,94,94,93,93,93,93, 93,92,92,92,92,91,91,91,91,91,90,90,90,90,90,90,89,89,89,89,89, 89,89,88,88,87,87,87,86,86,86,86,86,86,85,85,85,85,85,85,85,84, 84,84,84,83,83,83,82,82,82,82,81,81,80,80,80,80,80,80,79,79,78, 78,78,78,78,78,78,78,78,78,77,77,77,77,77,76,76,76,76,76,76,75, 75,75,74,74,74,74,74,74,73,73,73,73,72,72,71,71,71,71,70,70,70, 70,70,70,70,69,69,69,68,68,68,68,68,67,67,67,66,66,66,66,66,66, 66,66,66,66,65,65,65,64,64,64,63,63,63,63,62,62,62,62,62,61,61, 61,61,61,61,60,60,60,60,59,59,59,59,58,58,58,58,58,58,58,58,57, 57,57,57,57,57,57,57,56,56,55,55,55,55,55,55,54,54,54,54,54,54, 54,54,53,53,53,53,52,52,52,52,52,52,52,52,52,51,51,51,51,51,50, 50,50,50,50,50,50,50,49,49,49,49,49,49,49,49,49,48,48,48,48,48, 47,47,47,47,47,46,46,46,46,46,45,45,45,45,45,45,45,45,44,44,43, 43,43,43,42,42,42,41,40,40,39,39,39,39,39,38,38,38,38,37,37,37, 37,36,36,36,36,36,35,35,35,34,34,34,34,34,33,33,33,33,33,33,33, 32,32,32,32,32,32,32,32,31,31,31,30,30,30,30,30,29,29,29,29,29, 29,29,29,29,29,28,28,27,27,27,27,27,26,26,26,26,26,26,25,25,25, 25,25,25,25,25,24,24,24,24,24,24,24,24,23,23,23,23,23,22,22,22, 22,22,22,21,21,21,21,21,21,20,20,20,20,20,19,19,19,18,18,18,18, 18,18,17,17,17,16,15,15,15,15,14,14,14,14,13,13,13,13,13,13,12, 12,12,12,12,12,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10, 9,9,9,9,9,8,8,8,7,7,7,7,6,5,5,5,5,4,4,4,4,4,4,4,3,3,3,3,3,3,2, 2,2,2,2,1,1,1,1 }; const int n4c3w1_t[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,99,99,98,98,98,97,97,97,97,96,96,96,96,96,96,95,95, 95,95,95,95,94,94,94,94,94,94,93,93,93,92,92,92,92,92,91,91,91, 91,91,90,90,90,90,90,90,89,89,89,89,89,89,88,88,88,88,88,88,88, 88,88,88,87,87,86,86,86,86,85,85,85,85,85,85,84,84,84,84,83,83, 82,82,82,82,82,82,81,81,81,81,80,80,80,80,79,79,79,79,79,79,79, 79,79,79,79,78,78,78,78,78,78,77,77,76,76,76,76,76,76,76,76,76, 75,75,75,75,75,74,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73, 73,72,72,72,72,72,72,72,71,71,70,70,70,70,70,70,70,70,70,70,70, 70,70,69,69,69,69,69,69,68,68,68,68,68,68,67,67,67,67,67,66,66, 66,66,65,65,65,65,65,65,65,64,63,63,63,62,62,62,62,61,61,61,61, 60,60,60,60,59,59,59,59,59,59,58,58,58,58,58,57,57,57,57,57,56, 56,56,56,56,55,55,55,55,55,54,54,54,54,54,53,53,53,53,53,53,53, 53,52,51,51,51,50,50,50,50,50,50,50,50,50,49,49,49,49,49,49,49, 48,48,48,48,47,47,47,46,46,46,46,46,45,45,45,44,44,44,44,44,43, 43,43,43,43,43,43,43,42,42,42,41,41,41,41,41,40,40,40,40,40,40, 40,40,40,39,39,39,38,38,38,37,37,37,37,37,37,37,37,37,37,37,36, 36,36,36,36,35,35,35,34,34,34,34,33,33,33,33,32,32,32,32,31,31, 31,31,31,31,31,31,31,31,30,30,30,29,29,29,29,29,28,28,28,28,28, 27,27,27,27,27,26,26,26,26,26,26,25,25,25,24,24,24,24,24,24,23, 23,23,23,23,22,22,22,22,22,22,21,21,21,21,20,20,20,20,19,19,19, 18,18,18,18,17,17,17,17,17,16,16,16,16,16,16,15,15,15,14,14,14, 14,14,13,13,13,13,13,13,12,12,12,12,12,12,12,12,11,11,11,11,11, 11,11,10,9,9,9,9,9,9,9,9,8,8,8,8,7,7,7,7,7,7,6,6,6,6,5,4,4,3, 3,3,3,3,3,3,3,2,2,2 }; const int n4c3w2_a[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,99,99,99,98,98,98,98,97,97,97,97, 97,97,96,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95, 95,93,93,93,93,93,93,93,93,92,92,92,92,91,91,91,91,91,91,91,91, 90,90,90,90,90,90,90,90,89,89,89,89,89,89,89,88,88,88,88,88,88, 88,88,88,87,87,87,87,87,87,87,87,87,87,86,86,86,86,86,86,85,85, 85,85,85,85,85,84,84,84,84,84,84,83,83,83,83,83,83,82,82,82,82, 81,81,81,81,81,81,81,81,81,81,81,81,80,80,79,79,79,78,78,78,78, 78,77,77,77,77,76,76,76,76,76,76,76,75,75,75,75,75,75,75,74,74, 74,74,74,74,74,74,74,74,74,73,73,73,73,73,73,73,72,72,72,72,72, 71,71,71,71,71,71,71,70,70,70,70,70,70,70,70,69,69,69,69,68,68, 68,68,68,68,67,67,67,67,67,67,67,67,67,67,66,66,66,66,65,65,65, 64,64,64,64,64,64,64,64,64,64,64,64,63,63,63,63,63,63,63,63,63, 62,62,62,62,62,61,61,61,61,61,61,61,60,60,60,60,60,59,59,59,59, 59,59,58,58,58,58,58,57,57,57,57,57,56,56,56,56,56,56,56,56,56, 55,54,54,54,54,54,53,53,53,53,52,52,52,52,52,52,52,52,51,51,51, 51,51,51,50,50,50,50,50,50,49,49,49,49,49,49,49,49,48,47,47,47, 47,47,47,47,47,47,47,46,46,46,46,46,45,45,45,45,45,45,44,44,44, 44,44,43,42,42,42,42,42,42,42,42,41,41,41,41,41,41,40,40,40,40, 40,40,40,39,39,39,39,39,39,38,38,38,38,38,38,38,38,37,37,37,37, 37,37,37,37,37,37,36,36,36,36,36,35,35,35,35,35,34,34,34,34,34, 34,34,33,33,33,33,33,33,33,32,32,32,32,32,31,31,31,31,31,31,30, 30,30,30,29,29,29,29,29,28,28,28,28,28,27,27,27,27,27,26,26,26, 25,25,25,25,25,25,24,24,24,24,24,24,24,24,23,23,23,23,23,23,23, 23,22,22,22,22,22,22,22,21,21,21,21,21,21,21,21,21,20,20 }; const int n4c3w2_b[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,98,98,98,98,98,97,97, 97,97,97,97,96,96,96,96,96,95,95,95,95,95,95,94,94,94,94,94,94, 94,94,93,93,93,93,93,92,92,92,92,92,92,92,91,91,91,91,91,91,91, 91,90,90,89,89,89,89,89,89,89,89,89,89,89,88,88,88,88,88,87,87, 87,86,86,86,86,86,86,86,85,85,85,85,85,85,84,84,84,84,83,83,83, 83,83,83,83,83,83,83,83,82,82,82,82,82,81,81,81,81,81,81,80,80, 80,80,80,80,80,80,80,80,80,79,79,79,79,79,79,79,78,78,78,78,78, 78,78,78,77,77,77,77,77,77,77,76,76,76,76,76,76,76,76,76,76,75, 75,75,74,74,74,74,74,73,73,73,73,73,73,73,73,73,72,72,72,72,72, 72,72,72,71,71,71,71,71,71,71,71,71,70,70,70,70,70,69,69,69,69, 69,68,68,68,68,68,68,68,68,68,68,68,67,67,67,67,67,67,67,67,66, 66,66,66,66,66,65,65,65,65,65,64,64,64,63,63,63,63,63,63,63,62, 62,62,62,62,62,62,61,61,61,61,61,61,60,60,60,60,59,59,59,58,58, 58,58,58,57,57,57,56,56,56,56,55,55,55,55,55,55,55,54,54,54,54, 54,54,54,54,54,54,53,53,53,53,52,52,52,52,52,52,52,51,51,51,51, 50,50,50,50,50,49,49,49,49,49,49,49,49,48,48,48,48,48,47,47,47, 47,47,47,47,47,47,47,46,46,46,45,45,45,45,45,45,44,44,44,44,44, 43,43,43,43,43,43,42,42,42,42,41,41,41,41,41,41,40,40,40,40,40, 40,40,40,40,39,39,39,39,39,39,38,38,38,38,38,38,37,37,37,37,37, 37,36,36,36,36,36,36,36,36,36,36,36,35,35,35,35,35,35,35,35,35, 34,34,34,34,33,33,33,33,33,33,32,32,32,32,32,32,32,32,32,32,31, 31,31,31,31,31,30,30,30,30,30,30,30,30,29,29,29,29,29,29,28,28, 28,28,28,28,28,28,26,26,26,26,26,26,26,25,25,25,24,24,24,24,23, 23,23,23,22,22,22,22,22,22,21,21,21,21,21,20,20,20,20,20,20 }; const int n4c3w2_c[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,99,99,99,99,99,99,98,98,98,97,97, 97,97,97,97,97,96,96,96,96,96,95,95,95,94,94,94,94,94,93,93,93, 93,93,93,93,92,92,92,92,92,92,92,92,91,91,91,91,91,91,91,91,91, 90,90,90,90,90,89,89,89,89,89,88,88,88,88,88,88,88,88,88,87,87, 87,87,87,87,87,87,87,86,86,86,86,86,86,86,85,85,85,85,84,84,84, 83,83,83,83,83,83,83,82,82,82,82,82,82,82,81,81,81,81,80,80,80, 80,79,79,79,79,79,79,79,78,78,78,78,78,77,77,77,77,77,77,77,77, 77,76,76,76,76,76,76,75,75,75,75,75,75,74,74,74,74,74,74,73,73, 73,73,72,72,72,72,72,71,71,71,71,71,71,71,71,70,70,70,70,70,70, 70,70,70,70,70,69,69,69,69,69,69,69,69,69,68,68,68,68,68,68,68, 68,68,68,68,68,67,67,67,67,66,66,66,65,65,64,64,64,64,64,64,63, 63,63,63,63,63,63,63,62,62,62,62,62,62,62,61,61,61,60,60,60,60, 60,60,60,60,60,60,59,59,59,59,59,59,59,58,58,58,58,58,58,58,58, 58,58,57,57,57,57,57,57,56,56,56,56,56,56,56,56,56,56,55,55,55, 55,54,54,54,54,54,54,54,54,54,54,53,53,53,53,53,52,52,52,52,52, 52,52,51,51,51,51,51,51,50,50,50,50,50,49,49,49,49,49,48,48,48, 47,47,47,47,47,47,47,46,46,46,46,46,46,46,45,45,45,45,45,45,44, 44,44,44,44,44,44,43,42,42,42,42,42,41,41,41,41,40,40,40,40,40, 39,39,39,39,39,39,39,39,39,38,38,38,38,37,37,37,36,36,36,36,36, 36,35,35,35,35,34,34,34,34,34,34,34,34,34,33,33,33,33,33,33,32, 32,32,32,32,32,32,31,31,31,31,31,31,31,31,30,30,29,29,29,29,29, 29,28,28,28,28,28,28,27,27,27,27,27,27,26,26,26,26,26,26,26,26, 26,26,26,25,25,25,25,25,24,24,24,24,24,24,24,23,23,23,23,23,22, 22,22,22,22,22,22,21,21,21,21,21,21,21,21,20,20,20,20,20 }; const int n4c3w2_d[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,99,99,99,98,98,98,98,98,97,97,97, 97,97,97,97,96,96,96,95,95,95,95,95,95,95,94,94,94,94,94,94,93, 93,93,93,93,93,93,93,93,92,92,92,92,91,91,91,91,91,90,90,90,90, 90,90,90,89,89,89,89,89,89,89,88,88,88,88,88,88,88,87,87,87,87, 87,87,87,87,86,86,86,86,86,85,85,85,85,84,84,84,84,84,83,83,83, 83,83,82,82,81,81,80,80,80,80,80,80,80,80,80,79,79,79,79,79,79, 79,79,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,77,77, 77,77,77,76,76,76,76,76,76,75,75,75,75,74,74,74,74,74,74,74,73, 73,73,73,73,73,72,72,72,71,71,71,71,71,71,71,70,70,70,70,70,69, 69,69,69,69,69,69,69,69,68,68,68,67,67,67,67,67,66,66,66,66,66, 65,65,65,65,65,65,65,65,64,64,64,64,64,64,63,63,63,63,63,63,63, 63,63,63,62,62,62,62,62,62,61,61,61,61,61,61,61,60,60,60,60,60, 60,60,60,60,59,59,59,59,59,59,59,59,59,59,59,59,59,58,58,58,58, 58,58,57,57,57,57,57,56,56,56,56,56,56,55,55,54,54,54,54,54,54, 54,54,54,54,54,53,53,53,53,53,53,53,53,52,52,52,52,52,52,52,52, 52,52,51,51,51,51,51,50,50,50,50,50,50,49,49,49,49,49,49,48,48, 48,47,47,47,47,47,47,47,46,46,46,46,46,46,45,45,45,45,45,45,45, 45,44,43,43,43,43,43,43,42,42,42,42,41,41,41,40,40,40,40,40,40, 40,40,40,39,39,39,39,39,39,39,39,39,39,38,38,38,38,38,38,38,37, 37,37,37,37,37,37,36,36,36,36,35,35,35,35,35,35,34,34,34,34,34, 34,34,34,34,34,34,34,34,33,33,33,32,32,32,32,32,32,31,31,30,30, 30,30,30,30,30,29,29,29,29,29,29,29,29,29,28,28,28,28,28,27,27, 27,27,27,27,27,27,26,26,26,26,25,25,25,24,24,24,23,22,22,22,22, 22,22,22,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20 }; const int n4c3w2_e[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,99,99,98,98,98,98,98, 98,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,96,95,95,95, 95,94,94,94,94,94,94,93,93,93,93,93,92,92,92,92,91,91,91,91,91, 91,90,90,90,90,90,90,90,90,90,90,90,89,89,89,89,89,89,88,88,88, 88,87,87,87,87,87,86,86,85,85,85,85,85,85,85,84,84,84,84,84,84, 83,83,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,82,82,82,82, 82,81,81,81,81,80,80,80,80,80,79,79,79,79,79,79,79,79,78,78,78, 78,78,77,77,77,77,77,77,76,76,76,76,76,75,75,75,75,74,74,74,74, 74,74,74,74,74,74,73,73,73,73,73,73,72,72,72,72,72,72,71,71,71, 71,71,71,70,70,70,69,69,69,69,69,69,69,69,69,69,69,69,68,68,68, 68,68,68,68,68,68,67,67,66,66,66,66,66,65,65,64,64,64,64,64,63, 63,63,63,62,62,62,62,61,61,61,61,61,60,60,60,60,60,59,59,59,59, 59,59,58,58,58,58,58,58,58,57,57,57,57,57,57,56,56,56,56,56,56, 56,55,55,55,55,54,54,54,54,54,54,54,53,53,53,53,53,53,53,52,52, 52,52,51,51,50,50,50,49,49,49,49,49,49,49,49,48,48,48,48,48,48, 48,48,47,47,47,47,47,46,46,46,46,46,46,46,46,45,45,45,45,45,45, 45,45,45,44,44,44,44,44,44,43,43,43,43,43,43,43,43,43,43,43,42, 42,42,42,42,42,41,41,41,41,41,40,40,40,40,40,40,39,39,39,39,39, 38,38,38,38,38,38,38,37,37,37,37,37,37,37,37,37,36,36,35,35,35, 35,35,35,35,34,34,34,34,33,33,33,33,32,32,32,32,32,32,32,32,32, 32,32,32,32,32,32,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30, 30,30,30,29,29,29,29,29,29,29,29,28,28,28,28,28,28,28,28,28,28, 27,27,27,27,27,26,26,26,26,26,25,25,24,24,24,24,24,23,23,23,23, 23,23,23,23,22,22,22,22,22,22,22,22,22,21,21,20,20,20,20,20 }; const int n4c3w2_f[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,99, 99,98,98,98,98,98,97,97,97,97,97,97,97,97,97,96,96,96,96,95,95, 95,95,95,95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,94,94,93, 93,93,93,93,92,92,92,91,91,91,91,91,91,91,90,90,90,90,90,90,90, 90,90,89,89,89,89,89,89,89,88,88,88,88,88,87,87,87,87,87,87,87, 86,86,86,86,85,85,85,85,85,85,85,84,84,84,84,84,84,84,84,84,83, 83,83,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,81,81,81,81, 81,81,80,80,80,80,80,79,79,79,79,79,79,79,79,79,78,78,78,78,78, 78,78,77,77,77,76,76,76,76,76,76,75,75,75,75,75,75,74,74,74,74, 74,73,73,73,73,73,73,73,73,73,73,72,72,72,72,72,72,72,72,72,72, 71,71,71,71,71,70,70,70,69,69,69,69,68,68,68,68,68,68,68,68,67, 67,67,67,67,67,67,67,66,66,66,66,66,65,65,65,65,64,64,64,64,64, 63,63,63,63,63,63,63,62,62,62,62,62,61,61,61,61,61,61,61,60,60, 60,60,60,59,59,59,59,59,59,59,59,58,58,58,58,58,58,57,57,57,57, 57,57,57,56,56,56,56,56,56,55,55,55,55,55,55,54,54,54,54,54,54, 54,54,53,53,52,52,52,52,52,52,52,51,51,51,51,51,50,50,49,49,49, 49,49,49,48,48,48,48,48,48,48,48,48,48,47,47,47,47,47,47,47,46, 46,46,46,46,46,46,45,45,45,45,45,45,45,45,44,44,44,44,44,44,43, 43,43,43,43,43,43,42,42,42,42,42,42,42,41,41,41,41,41,41,41,40, 40,40,39,39,39,38,38,38,38,38,38,38,37,37,37,37,37,37,37,36,35, 35,35,35,35,34,34,34,34,34,34,34,33,33,33,33,33,32,32,32,32,32, 31,31,31,31,31,30,30,30,30,30,30,30,29,29,29,29,29,29,28,28,28, 28,28,28,28,27,27,27,27,27,27,27,26,26,26,26,26,26,25,25,24,24, 24,24,24,24,23,22,22,22,22,22,22,22,22,21,21,21,21,20,20,20,20 }; const int n4c3w2_g[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,99,99,98,98,98,98,98,98, 97,97,97,97,97,96,96,96,96,96,96,96,95,95,95,95,95,95,94,94,94, 94,94,94,93,93,93,93,93,93,93,92,92,92,92,92,92,92,91,91,91,91, 91,91,91,91,90,90,89,89,88,88,88,88,88,88,87,87,87,87,86,86,86, 86,86,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,84,84,84,84, 84,83,83,83,83,82,82,82,82,81,81,81,81,81,80,80,80,80,80,79,79, 79,79,79,79,79,79,78,78,78,78,78,77,77,77,77,77,77,77,76,76,76, 76,76,76,76,75,75,75,75,75,75,75,75,75,74,74,74,74,74,74,74,74, 74,74,74,73,73,73,73,73,73,73,72,72,72,72,72,72,71,71,71,71,70, 70,70,70,70,70,70,70,69,69,69,69,69,68,68,68,68,68,68,67,67,67, 67,67,67,67,66,66,66,66,66,66,65,65,65,65,65,65,64,64,64,63,63, 63,63,62,62,62,62,61,61,61,61,61,61,61,61,61,60,60,60,59,59,59, 59,59,58,58,58,58,58,57,57,57,57,57,57,57,57,57,56,56,56,56,56, 56,56,56,56,56,56,56,55,55,55,54,54,54,54,54,54,54,53,53,53,53, 53,53,53,53,53,53,52,52,52,52,52,52,51,51,51,51,51,51,51,51,50, 50,50,50,50,49,49,49,49,49,49,49,49,49,49,49,48,48,48,48,48,48, 48,47,47,47,47,47,47,46,46,46,46,45,45,45,45,45,45,45,45,44,44, 44,44,44,43,43,43,43,42,42,42,42,41,41,41,40,40,40,40,39,39,39, 39,39,39,38,38,38,38,38,38,38,38,37,37,37,37,37,37,37,36,36,36, 36,36,36,36,36,35,35,35,35,35,35,34,34,34,34,34,33,33,33,33,33, 33,33,33,33,33,33,32,32,32,32,32,32,32,32,31,31,31,31,31,31,31, 31,30,30,30,30,30,30,29,29,29,29,29,28,28,28,28,27,27,27,27,27, 27,27,27,27,27,27,26,26,26,26,26,25,24,24,24,24,24,24,24,23,23, 23,23,23,22,22,22,22,22,22,22,21,21,21,21,21,21,21,20,20 }; const int n4c3w2_h[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,99,98,98,98,98,98,98, 97,97,97,96,96,96,96,96,96,95,95,95,94,94,94,94,94,94,94,93,93, 93,93,93,93,92,92,92,92,91,91,91,91,91,91,91,91,91,90,90,90,90, 89,89,89,89,89,89,89,88,88,88,88,88,88,88,88,87,87,87,87,87,86, 86,86,86,86,86,85,85,85,85,85,85,84,84,84,84,84,84,84,83,83,83, 83,83,83,83,83,82,82,82,82,82,82,82,82,81,81,81,81,81,81,81,80, 80,80,80,80,80,80,80,80,79,79,79,79,79,79,79,79,78,78,78,78,78, 77,77,77,77,77,77,76,76,76,75,75,75,75,75,74,74,74,74,74,74,74, 74,73,73,73,73,73,73,73,72,72,72,72,72,72,71,71,71,71,71,71,71, 71,71,70,70,70,70,70,70,70,69,69,69,68,68,68,68,68,68,68,67,67, 67,67,67,67,67,66,66,66,66,66,66,66,66,65,65,65,65,65,65,65,64, 64,64,64,64,64,64,64,64,64,63,63,63,63,62,62,62,62,61,61,61,61, 60,60,60,60,60,60,60,60,60,60,59,59,59,59,59,58,58,58,58,58,58, 58,58,58,58,57,57,57,57,57,57,56,56,56,56,56,56,55,55,55,55,55, 54,54,54,53,53,52,52,52,52,52,52,52,52,51,51,51,51,51,50,50,50, 50,50,49,49,49,49,49,49,49,48,48,48,48,48,48,48,48,47,47,47,47, 47,47,46,46,46,46,46,46,45,45,45,45,45,45,45,45,45,45,45,44,44, 44,44,43,43,43,43,43,43,42,41,41,41,41,41,41,41,41,40,40,40,40, 40,40,40,40,40,40,40,39,39,39,38,38,38,37,37,37,37,37,37,37,36, 36,36,36,35,35,35,35,35,35,35,34,34,34,34,34,34,34,33,33,33,33, 33,33,32,32,31,31,31,31,31,31,31,30,30,30,30,30,30,30,29,29,29, 29,29,29,29,29,29,29,29,28,28,28,28,28,28,28,28,28,28,27,27,27, 27,27,26,26,26,26,26,26,25,25,25,25,25,25,25,25,25,24,24,24,23, 23,23,23,23,23,23,22,22,22,22,22,22,21,21,21,21,21,20,20,20 }; const int n4c3w2_i[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,98,98,98, 98,98,98,98,97,97,97,97,97,96,96,96,96,95,95,95,95,95,94,94,94, 94,94,93,93,93,93,92,92,92,92,92,92,92,92,91,91,91,91,91,91,90, 90,90,90,90,89,89,89,89,89,89,88,88,88,87,87,87,87,87,87,87,86, 86,86,86,85,85,85,85,84,84,84,84,83,83,83,83,83,83,83,83,83,82, 82,82,82,81,81,81,81,81,81,81,80,80,80,80,80,80,80,80,80,79,79, 79,79,79,79,79,79,79,78,78,78,77,77,77,77,77,76,76,76,76,76,75, 75,75,75,75,75,75,74,74,74,74,74,73,73,73,73,73,73,73,72,72,72, 72,72,71,71,71,71,71,71,71,70,70,70,70,69,69,69,69,69,69,68,68, 68,68,68,68,68,68,68,67,67,67,67,67,67,66,66,66,66,66,66,65,65, 65,65,65,65,65,64,64,64,64,64,64,64,64,63,63,63,63,63,63,63,62, 62,62,62,62,62,61,61,61,61,61,61,60,60,60,60,60,60,60,60,60,60, 59,59,59,59,59,58,58,58,58,58,58,57,57,57,57,57,56,56,56,56,56, 56,56,56,56,55,55,55,55,55,54,54,54,54,54,54,54,53,53,53,53,53, 52,52,52,52,52,52,52,51,51,51,51,51,51,50,50,50,50,50,50,49,49, 49,49,49,48,48,48,48,48,48,48,47,47,47,47,46,46,46,46,46,46,46, 45,45,45,45,45,45,45,45,44,44,44,44,44,44,44,44,44,44,44,44,43, 43,43,43,43,42,42,42,42,42,42,42,42,42,42,42,41,41,41,40,40,40, 39,38,38,38,38,38,38,38,37,37,37,37,37,37,37,37,37,36,36,36,36, 36,36,35,35,35,34,34,34,34,34,34,33,33,33,33,33,32,32,32,32,32, 32,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30,30,30,29, 29,29,29,29,29,29,28,28,28,28,28,28,27,27,27,27,27,27,27,27,26, 26,26,26,26,26,26,26,25,25,25,25,25,25,25,24,24,24,24,24,24,24, 24,24,24,23,23,23,23,22,22,21,21,21,21,21,21,21,21,20,20,20 }; const int n4c3w2_j[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,98,98, 98,98,98,98,98,98,98,98,98,97,97,97,97,97,96,96,96,96,96,95,95, 95,95,95,94,94,94,94,93,93,93,93,93,92,92,92,92,91,91,91,91,91, 91,91,90,90,90,90,90,90,90,90,90,90,89,89,89,89,88,88,88,88,88, 88,88,88,88,87,87,87,87,86,86,86,86,86,86,86,86,85,85,84,84,84, 84,84,84,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,82,82,81, 81,81,81,80,80,80,80,80,80,79,79,78,78,78,78,78,78,78,78,78,78, 78,77,77,77,77,77,77,77,77,77,77,77,76,76,76,76,76,76,75,75,75, 75,75,74,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73,72,72,72, 72,71,71,71,71,70,70,70,70,70,70,70,69,69,69,69,69,68,68,68,67, 67,67,67,67,67,67,67,66,66,66,66,66,66,66,65,65,65,65,65,64,64, 63,63,63,63,62,62,62,62,62,62,62,62,62,61,61,61,61,60,60,60,60, 60,60,60,60,60,60,60,59,59,59,59,59,58,58,58,58,58,58,58,58,58, 57,57,57,56,56,56,56,56,56,56,56,55,55,55,55,54,54,54,54,54,53, 53,53,52,52,52,52,52,52,52,52,52,52,52,52,51,51,51,51,51,50,50, 50,50,50,50,50,50,49,49,49,49,49,49,49,49,49,49,49,48,48,48,48, 48,48,48,48,48,48,48,48,47,47,47,47,47,46,46,46,46,46,46,46,45, 45,45,45,45,44,44,44,44,44,44,44,44,44,43,43,43,43,43,43,43,42, 42,42,42,42,42,42,41,41,40,40,40,40,40,40,40,39,39,39,39,39,39, 38,38,38,38,38,38,37,37,37,37,37,36,36,36,36,36,35,35,35,35,35, 35,34,34,33,33,33,33,33,33,33,33,33,32,32,32,32,32,32,32,32,31, 31,31,31,30,30,30,30,30,30,29,29,29,29,29,29,29,28,28,28,27,27, 27,27,27,27,27,26,26,26,26,26,26,26,25,25,25,25,24,24,24,24,23, 23,23,23,23,23,23,23,22,22,22,22,22,22,22,21,21,21,21,21,20 }; const int n4c3w2_k[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,99,99,98,98,98,98, 98,98,98,98,97,97,97,97,97,96,96,96,96,96,96,96,96,96,95,95,95, 95,95,95,95,95,95,94,94,94,94,94,94,93,93,93,93,93,93,93,93,93, 92,92,92,92,92,92,92,92,92,91,91,91,91,91,91,91,91,91,90,90,90, 90,90,89,89,89,89,89,88,88,88,88,88,88,88,88,88,87,87,87,87,87, 87,86,86,85,85,85,85,84,84,84,84,84,84,84,83,83,83,83,83,82,82, 82,82,82,82,82,81,81,81,81,80,80,80,79,79,79,79,79,78,78,78,78, 78,78,78,78,78,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,76, 75,75,75,75,75,75,75,75,74,74,74,73,73,73,73,73,73,73,72,72,72, 72,72,72,72,72,72,71,71,71,71,71,70,70,70,70,70,69,69,69,69,69, 68,68,68,68,68,68,67,67,67,67,67,66,66,66,66,66,65,65,65,65,65, 65,65,65,65,65,65,64,64,64,64,64,64,64,63,63,63,63,63,63,63,63, 63,63,63,62,62,62,61,61,61,61,61,61,61,61,60,60,60,59,59,58,58, 58,58,58,57,57,57,57,57,57,57,57,56,56,56,56,56,56,55,55,55,55, 54,54,54,54,54,53,53,53,53,53,53,52,52,52,52,52,52,52,52,51,51, 51,51,51,50,50,50,50,50,49,49,49,49,48,48,48,48,48,47,47,46,46, 46,46,46,46,46,46,46,45,45,45,45,45,45,45,44,44,44,43,43,43,43, 43,43,43,42,42,42,42,41,41,41,41,41,41,41,41,41,41,40,40,40,40, 40,40,40,40,40,40,40,39,39,39,39,39,39,39,38,38,38,38,38,37,37, 37,37,37,37,37,36,35,35,35,35,35,35,35,35,35,34,34,34,34,34,34, 33,33,33,33,33,32,32,32,32,32,32,32,32,31,31,31,30,30,30,30,29, 29,29,29,29,29,29,28,28,28,28,28,27,27,27,27,27,27,26,26,26,26, 25,25,25,25,25,25,25,25,24,24,24,24,24,24,24,24,24,24,24,24,24, 23,23,23,22,22,22,22,21,21,21,21,21,20,20,20,20,20,20,20,20 }; const int n4c3w2_l[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,99,98,98,98,98,98, 98,98,98,97,97,97,97,97,97,97,97,96,96,96,95,95,94,94,94,94,94, 94,94,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,91,91,91, 91,91,91,91,91,90,90,90,90,90,90,90,89,89,89,89,89,89,88,88,88, 88,88,88,88,88,87,87,87,87,86,86,86,86,86,86,86,86,86,85,85,85, 85,85,85,85,84,84,84,84,84,84,84,84,83,83,83,83,83,83,83,83,83, 82,82,81,81,81,81,81,81,81,80,80,80,80,80,79,79,79,79,79,79,79, 79,79,79,78,78,78,78,78,78,78,77,77,76,76,76,76,75,75,75,75,75, 75,75,74,74,74,74,74,74,73,73,73,73,73,72,72,72,72,72,72,72,71, 71,71,71,71,71,70,70,70,70,70,70,70,70,69,69,69,69,69,69,69,69, 68,68,68,68,68,68,67,67,67,66,66,66,66,66,66,65,65,65,65,65,64, 64,64,64,64,64,63,63,63,63,63,63,62,62,62,62,62,62,62,61,61,61, 61,61,60,60,60,60,60,60,59,59,59,59,59,59,59,59,58,58,58,58,58, 57,57,57,57,57,56,56,56,56,56,56,56,56,56,56,55,55,55,55,55,55, 55,54,54,53,53,53,53,52,52,52,51,51,51,50,50,50,50,50,49,49,49, 49,48,48,48,48,48,48,48,48,47,47,47,47,47,47,46,46,46,45,45,45, 45,45,45,45,45,44,44,44,44,44,44,44,44,43,43,43,42,42,42,42,42, 42,42,42,41,41,41,40,40,40,40,40,40,40,39,39,39,39,39,39,39,39, 38,38,38,38,38,38,38,38,38,37,37,37,37,37,37,37,37,37,36,36,36, 36,35,35,35,35,35,35,35,35,34,34,34,34,33,33,33,33,33,33,33,33, 33,33,33,33,32,32,32,32,32,32,32,32,31,31,30,30,30,29,29,29,28, 28,28,28,28,28,28,27,27,27,26,26,26,26,26,25,25,25,25,25,25,25, 25,25,25,25,25,24,24,24,24,24,24,24,24,24,24,23,23,23,23,23,23, 23,23,23,23,22,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20 }; const int n4c3w2_m[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,98,98, 98,98,98,98,97,97,97,97,97,97,97,97,96,96,96,96,95,95,95,94,94, 94,94,93,93,93,93,93,93,93,93,92,92,92,91,91,91,91,91,91,91,91, 91,91,91,90,90,90,90,90,89,89,89,88,88,88,88,88,88,87,87,87,87, 87,87,87,86,86,86,85,85,85,85,85,85,84,84,84,84,84,84,84,83,83, 83,83,83,83,82,82,82,82,82,82,81,81,81,81,81,80,80,80,80,80,80, 79,79,79,79,79,79,79,78,78,78,78,78,78,77,77,77,77,77,77,77,77, 77,76,76,76,76,76,76,76,76,75,75,75,75,75,75,75,74,74,74,74,73, 73,73,73,73,72,72,72,72,72,72,71,71,71,71,71,71,71,70,70,70,70, 70,70,70,69,69,69,69,69,68,68,68,68,67,67,67,67,67,66,66,66,66, 66,66,65,65,65,65,65,64,64,64,64,64,63,63,63,63,63,62,62,62,62, 62,62,62,62,62,62,61,61,61,61,61,61,61,60,60,60,60,60,60,59,59, 59,59,59,59,59,58,58,58,58,57,57,57,57,57,57,56,56,56,56,56,56, 56,56,56,55,55,55,55,55,55,55,55,55,54,54,54,54,54,54,54,53,53, 53,53,53,53,53,53,53,52,52,52,52,51,51,50,50,50,50,50,50,50,50, 50,50,49,49,49,49,48,48,48,48,48,48,48,48,48,47,46,46,46,46,46, 45,45,45,45,45,44,44,44,44,44,43,43,43,43,42,42,42,42,42,41,41, 41,41,41,41,40,40,40,40,40,40,40,39,39,39,39,39,39,39,39,39,39, 39,38,38,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,35,35,35, 35,34,34,34,33,33,33,33,33,33,33,33,33,33,32,32,32,32,32,32,31, 31,31,31,31,31,30,30,30,30,30,29,29,29,29,29,29,29,28,28,28,28, 28,27,27,27,27,26,26,26,26,26,26,25,25,25,25,25,25,25,25,25,24, 24,24,24,24,24,24,24,23,23,23,23,23,23,23,23,22,22,22,22,22,21, 21,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20,20,20,20 }; const int n4c3w2_n[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,98,98,98,98,98,98,97,97,97,97, 97,97,97,97,96,96,96,96,96,96,96,95,95,95,95,94,94,94,94,94,94, 94,94,94,94,93,93,93,92,92,92,92,91,91,91,91,91,91,91,91,91,91, 90,90,90,90,90,90,89,89,89,88,88,88,88,87,87,87,87,87,87,87,86, 86,86,86,86,85,85,85,84,84,84,84,84,83,83,83,83,83,83,83,83,83, 83,82,82,82,82,82,82,81,81,81,81,81,81,81,81,80,80,80,80,79,79, 79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,77,77,77,76,76,76, 76,76,76,76,76,75,75,75,75,75,74,74,74,74,73,73,73,73,73,73,73, 73,73,72,72,72,72,72,72,72,72,72,72,71,71,71,71,71,71,71,70,70, 70,70,70,70,70,69,69,69,68,68,68,68,68,67,67,67,67,66,66,66,65, 65,65,65,65,65,64,64,64,64,64,64,63,63,63,63,63,63,63,63,62,62, 62,62,62,62,62,61,61,61,61,60,60,60,60,60,59,59,59,59,59,59,59, 59,59,59,59,59,59,58,58,58,58,58,57,57,57,57,57,57,56,56,56,56, 56,56,56,56,55,55,55,55,55,54,54,54,54,54,54,54,54,54,54,54,53, 53,53,53,53,53,53,52,52,51,51,51,51,51,51,51,51,50,50,50,50,50, 49,49,49,49,49,49,49,48,48,48,48,48,47,47,47,47,47,47,47,46,46, 46,46,46,45,45,45,45,45,44,44,44,44,44,44,43,43,43,43,43,43,42, 42,42,42,42,42,42,41,41,41,40,40,40,40,39,39,39,39,39,39,39,39, 38,38,38,38,38,38,38,38,37,37,37,37,37,37,37,36,36,36,35,35,35, 35,35,34,34,34,34,33,33,33,33,33,33,33,33,33,33,33,33,33,32,32, 32,32,32,32,32,32,32,31,31,31,31,31,31,31,31,31,31,31,30,30,30, 30,30,29,29,29,29,29,28,28,27,27,27,27,26,26,26,26,26,25,25,25, 25,25,25,24,24,24,24,24,24,24,23,23,23,23,23,23,22,22,22,22,22, 22,21,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20,20 }; const int n4c3w2_o[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,100,100,99,99,99, 99,99,98,98,98,97,97,97,97,96,96,96,96,96,96,96,96,96,95,95,95, 95,95,95,95,95,95,95,94,94,94,94,94,94,93,93,93,93,93,93,93,93, 92,92,92,92,92,92,91,91,91,91,91,90,90,90,90,90,90,89,89,89,89, 89,89,89,88,87,87,87,87,87,86,86,86,86,86,86,86,86,85,85,85,85, 85,85,85,85,85,85,84,84,84,84,84,84,83,83,83,82,82,82,82,82,82, 81,81,81,81,81,81,81,81,81,81,80,80,80,79,79,79,79,79,78,78,78, 78,78,78,78,77,77,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76, 75,75,75,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73,72,72,72, 72,72,71,71,71,71,71,70,70,70,70,70,70,70,70,70,70,70,70,70,70, 69,69,69,69,69,69,69,69,69,69,69,69,69,68,68,68,68,68,68,68,68, 68,68,68,67,67,67,67,67,67,67,66,66,66,66,65,65,65,65,65,65,64, 64,64,63,63,63,63,63,63,63,62,62,62,62,62,62,62,61,61,61,61,61, 61,61,61,60,60,60,60,59,59,59,59,59,58,58,58,58,58,57,57,57,57, 57,57,57,57,57,56,56,56,56,56,56,55,55,55,55,54,54,54,54,54,54, 54,54,53,53,53,53,53,52,52,52,52,52,52,52,52,52,51,51,51,51,51, 51,51,51,51,51,51,51,51,51,51,50,50,50,50,50,49,49,49,49,49,49, 49,49,48,48,48,48,48,48,48,47,47,47,47,47,47,47,47,47,45,45,45, 44,44,44,44,44,44,44,43,43,43,43,43,42,42,42,42,42,42,41,41,41, 41,41,41,41,40,40,40,40,40,40,40,39,39,39,39,39,39,39,38,38,38, 38,37,37,37,37,37,37,37,36,36,36,35,35,35,35,35,34,34,34,34,34, 33,33,32,32,32,32,32,32,32,31,31,31,31,31,30,30,30,30,30,30,29, 29,29,28,28,28,28,28,27,27,27,26,26,26,26,26,25,24,24,24,23,23, 22,22,22,22,22,22,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20, 20 }; const int n4c3w2_p[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,100,99,99,99,99,99, 99,99,98,98,98,98,98,98,97,97,97,97,97,97,96,96,96,96,96,95,95, 95,95,95,95,94,94,94,94,94,93,93,93,93,93,93,92,92,92,92,92,91, 91,91,91,91,91,90,90,90,90,90,90,90,90,90,89,89,89,89,89,88,88, 88,88,88,88,87,87,87,87,87,87,87,87,86,86,86,86,85,85,85,85,85, 85,85,85,85,85,84,84,84,84,84,84,84,84,84,84,83,83,83,83,83,83, 83,83,83,82,82,82,81,81,81,80,80,80,80,80,80,80,79,79,79,79,78, 78,78,78,78,78,78,78,77,77,77,77,77,77,77,76,76,76,75,75,74,74, 74,74,74,74,74,74,74,73,73,73,73,73,73,72,72,72,72,71,71,71,71, 71,71,70,70,70,70,70,70,70,69,69,68,68,68,68,68,68,67,67,67,67, 67,67,67,66,66,66,66,65,65,65,65,65,64,64,64,64,64,64,64,63,63, 63,63,63,63,63,63,62,62,62,62,62,62,62,62,61,61,61,60,60,60,60, 60,60,60,60,60,59,59,59,59,59,59,59,59,59,58,58,58,58,58,57,57, 57,57,57,56,56,56,56,56,56,56,55,55,55,55,55,54,54,54,54,54,53, 53,53,53,53,53,53,52,52,52,52,52,51,51,51,51,51,50,50,50,50,50, 49,49,49,49,49,49,48,48,48,48,48,47,47,47,47,47,47,47,47,47,47, 46,46,46,46,46,46,45,45,45,45,45,44,44,44,44,44,44,43,43,43,43, 43,43,43,42,42,42,42,42,42,42,42,42,42,42,42,41,41,41,41,41,41, 41,41,40,40,39,39,39,39,39,39,39,39,39,39,38,38,38,37,37,37,37, 37,37,37,37,37,37,37,37,36,36,36,36,35,34,34,34,34,34,34,34,34, 34,33,33,33,33,33,33,33,32,32,32,32,32,31,31,31,30,30,30,29,29, 29,29,29,29,29,29,29,28,28,28,28,28,28,27,27,27,27,27,27,27,27, 26,26,25,25,25,25,25,25,25,25,24,24,24,24,24,24,24,24,23,23,23, 23,22,22,22,22,22,22,22,22,22,22,21,21,21,21,21,21,20,20,20,20 }; const int n4c3w2_q[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,98,98,98,98,98,98,98, 98,98,98,97,97,97,97,97,97,97,97,96,96,96,96,96,95,95,95,95,94, 94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,93,93,93,92,92, 92,92,92,92,92,92,92,91,91,91,90,90,90,90,90,90,89,89,89,89,89, 89,88,88,88,88,88,88,88,88,88,88,87,87,87,87,87,86,86,86,86,86, 86,86,86,86,85,85,85,85,85,85,85,84,84,84,84,84,84,84,84,84,84, 83,83,83,82,82,82,82,81,81,81,81,81,81,81,80,80,80,80,79,79,79, 79,79,79,79,78,78,78,78,77,77,77,77,76,76,76,76,76,75,75,75,75, 74,74,73,73,73,73,73,73,72,72,72,72,72,72,72,72,71,71,71,71,71, 71,71,70,70,70,70,70,70,70,69,69,69,69,69,68,68,68,68,68,67,67, 67,67,66,66,65,65,65,65,65,64,64,64,64,64,64,64,64,64,64,64,63, 63,63,63,63,63,63,62,62,62,62,62,62,62,62,61,61,61,61,60,60,60, 60,60,60,59,59,59,58,58,58,57,57,57,57,56,56,56,56,56,56,55,55, 55,55,54,54,54,54,54,54,54,54,54,54,54,53,53,53,53,53,53,52,52, 52,52,52,52,51,51,51,51,51,51,51,51,50,50,49,49,49,49,49,49,49, 48,48,48,48,48,48,48,48,48,48,47,47,46,46,46,46,46,46,46,45,45, 45,45,45,45,45,45,44,44,44,44,44,44,43,43,43,43,42,42,42,42,42, 41,41,41,41,40,40,40,40,39,39,39,38,38,38,38,38,37,37,37,36,36, 36,36,36,35,35,35,34,34,34,34,34,34,34,34,34,33,33,33,33,33,33, 33,33,32,32,32,32,32,32,32,31,31,31,31,31,31,31,30,30,30,30,30, 30,30,30,29,29,29,29,29,29,29,29,28,28,28,28,28,28,28,28,27,27, 27,27,27,26,26,26,26,26,26,26,26,25,25,25,25,25,25,25,25,25,25, 25,24,24,24,24,24,24,24,24,24,24,23,23,23,23,22,22,22,22,22,22, 22,22,22,22,21,21,21,21,21,21,21,20,20,20,20,20,20,20,20,20 }; const int n4c3w2_r[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,98,98,98,98,98,97,97,97,97,96, 96,96,95,95,95,95,95,95,95,95,94,94,94,94,94,93,93,92,92,92,92, 92,92,91,91,91,91,91,91,90,90,90,90,90,90,90,89,89,89,89,89,89, 89,89,88,88,88,87,87,87,87,87,86,86,86,86,86,86,86,86,86,86,85, 85,85,85,85,85,85,84,84,84,84,84,84,84,83,83,83,83,83,83,83,83, 83,83,83,82,82,82,82,82,82,82,82,82,82,82,82,81,81,81,81,80,80, 80,80,80,80,79,79,78,78,78,77,77,77,77,77,77,76,76,76,76,76,75, 75,75,74,74,73,73,73,73,73,73,73,72,72,72,72,72,72,72,72,72,72, 72,71,71,71,71,71,70,70,70,70,70,69,69,68,68,68,68,67,67,67,67, 67,67,67,67,66,66,66,66,66,66,66,66,66,66,66,65,65,65,65,65,64, 64,64,64,64,64,64,64,64,64,63,63,63,63,62,62,61,61,61,61,61,61, 61,61,61,61,61,60,60,60,60,60,60,60,60,59,59,59,59,59,59,59,59, 59,59,58,58,58,58,57,57,57,57,57,57,57,56,56,56,55,55,55,55,55, 55,55,54,54,54,54,54,54,54,53,53,53,53,53,53,52,52,52,52,52,52, 52,52,52,51,51,51,51,51,51,51,50,50,50,49,49,49,49,49,48,48,48, 48,48,48,47,47,47,47,47,47,46,46,46,46,46,46,46,45,45,45,45,44, 44,44,44,44,43,43,43,43,43,43,42,42,42,42,42,42,42,41,41,41,41, 41,40,40,40,40,40,40,39,39,39,39,39,39,38,38,38,38,37,37,37,37, 37,36,36,35,35,35,35,35,34,34,34,34,34,34,34,34,33,33,33,33,33, 33,33,33,33,32,32,32,32,32,32,32,31,31,31,31,31,31,31,30,30,30, 30,30,30,30,30,30,29,29,29,29,29,29,29,29,28,28,28,28,28,28,28, 28,28,27,27,27,27,27,27,27,27,27,26,26,26,25,25,25,25,25,24,24, 24,24,24,24,24,24,23,23,23,23,23,23,23,23,23,23,23,22,22,22,22, 22,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20,20,20,20 }; const int n4c3w2_s[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,99,99,99,98,98,98,98,97, 97,97,97,97,97,97,97,97,96,96,96,96,96,96,95,95,95,95,95,95,94, 94,94,94,94,94,94,94,93,93,93,93,93,93,93,92,92,92,92,92,91,91, 91,91,90,90,90,89,89,89,89,89,89,89,89,89,88,88,88,88,88,87,87, 87,87,87,87,87,86,86,86,86,86,86,86,85,85,85,85,85,85,85,84,83, 83,83,83,83,83,82,82,82,82,82,81,81,81,81,81,81,81,81,80,80,80, 80,80,80,80,80,80,80,80,79,79,79,79,79,79,79,78,78,78,78,78,78, 78,78,77,77,76,76,76,76,75,75,75,75,74,74,74,74,73,73,73,73,73, 73,72,72,72,72,72,71,71,71,70,70,70,69,69,69,69,68,68,68,68,68, 67,67,67,67,67,67,67,66,66,66,66,66,66,66,66,66,66,65,65,65,65, 65,65,65,64,64,64,64,64,64,64,63,63,63,63,63,63,63,63,63,63,62, 62,62,62,62,62,61,61,61,60,60,60,60,60,60,60,59,59,59,59,59,59, 58,58,58,57,57,57,57,57,57,56,56,56,56,55,55,55,55,55,55,54,54, 54,53,53,53,53,53,53,53,53,53,52,52,52,52,52,52,52,52,51,51,51, 51,51,51,51,50,50,50,50,50,50,50,50,49,49,49,49,49,49,49,48,48, 48,48,48,48,48,47,47,47,46,46,46,45,45,45,45,45,45,44,44,44,43, 43,43,43,43,43,43,42,42,42,42,42,42,41,41,41,41,41,41,41,41,40, 40,40,40,40,39,39,39,39,39,39,38,38,38,38,38,38,38,38,37,37,37, 37,37,37,37,36,36,36,36,36,36,36,36,36,36,36,35,35,35,35,35,35, 35,35,34,34,34,34,34,34,33,33,33,32,32,32,32,32,32,31,31,31,31, 31,31,31,31,31,31,30,30,30,30,30,29,29,29,29,29,28,28,28,28,28, 28,27,27,27,27,27,27,27,26,26,26,26,26,26,26,25,25,25,25,24,24, 24,24,24,24,24,24,24,24,24,23,23,23,23,23,23,23,23,23,23,22,22, 22,22,22,22,22,21,21,21,21,21,21,20,20,20,20,20,20,20,20 }; const int n4c3w2_t[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,98,98,98,97,97,97,97,97, 97,97,97,96,96,96,96,96,95,95,95,95,95,95,95,94,94,94,93,93,93, 93,93,93,93,92,92,92,92,91,91,91,91,91,90,89,89,89,89,89,89,88, 88,88,88,87,87,87,87,87,86,86,86,86,85,85,85,85,85,85,85,85,84, 84,84,84,84,84,84,84,83,83,83,83,83,83,82,82,82,82,82,81,81,81, 81,81,81,80,80,80,80,80,79,79,79,79,78,78,78,78,78,78,78,77,77, 77,77,77,77,77,77,77,77,77,77,77,77,76,76,76,76,76,75,75,75,75, 75,75,75,75,75,75,74,74,73,73,73,73,73,73,72,72,72,72,71,71,71, 71,71,71,71,70,70,70,70,70,70,70,70,70,69,69,69,69,68,68,68,68, 67,67,67,67,67,67,67,67,66,66,66,65,65,65,65,64,64,64,64,64,64, 64,63,63,63,63,62,62,62,61,61,61,61,61,61,61,61,60,60,59,59,59, 59,59,59,59,59,59,59,58,58,58,58,58,58,58,58,57,57,57,57,57,57, 57,56,56,56,56,56,56,56,56,56,56,56,55,55,55,55,55,54,54,54,54, 54,54,54,54,53,53,53,53,53,53,52,52,52,52,52,52,51,51,51,51,51, 51,51,50,50,50,50,50,50,50,50,49,49,49,49,49,49,49,49,49,49,49, 48,48,48,48,48,48,48,48,48,48,48,47,47,47,47,47,47,47,47,46,46, 46,46,46,46,46,45,45,45,45,44,44,44,44,44,43,43,43,43,43,43,43, 43,42,42,42,42,42,42,41,41,41,41,41,40,40,40,40,40,40,40,40,39, 39,39,39,39,39,39,38,38,38,38,37,37,37,37,37,37,37,37,37,37,36, 36,36,36,36,36,36,35,35,35,35,34,34,34,34,33,33,33,33,33,33,32, 32,32,31,31,31,31,31,31,31,31,30,29,29,29,29,28,28,28,28,28,28, 28,28,28,28,27,27,27,27,27,27,27,27,27,26,26,26,26,26,26,26,26, 25,25,25,25,25,24,24,24,24,24,24,24,24,24,23,23,23,22,22,22,22, 22,22,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20,20,20 }; const int n4c3w4_a[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,98,98,98,98,98,98, 98,98,98,98,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,95,95, 95,95,95,94,94,94,94,94,94,93,93,93,93,93,93,93,92,92,92,92,92, 92,92,92,91,91,91,91,91,91,91,91,91,90,90,90,90,90,90,89,89,89, 89,88,88,88,88,88,88,87,87,87,87,87,87,87,87,87,86,86,86,86,86, 86,85,85,85,85,85,85,85,85,85,85,85,84,84,84,84,84,84,84,84,83, 83,83,83,83,83,83,82,82,82,81,81,81,81,81,81,80,80,80,80,80,80, 80,80,79,79,79,79,78,78,78,78,78,78,78,77,77,77,77,77,77,77,76, 76,76,76,76,76,76,76,76,76,75,75,75,75,75,75,75,75,74,74,73,73, 73,73,73,73,73,73,73,72,72,72,72,72,72,72,72,72,72,72,72,72,71, 71,71,71,71,70,70,70,70,70,70,70,70,70,70,70,69,69,69,69,69,69, 68,68,68,67,67,67,67,67,66,66,66,66,66,65,65,65,65,65,65,65,65, 65,64,64,64,64,64,64,64,63,63,63,63,63,63,63,62,62,62,62,62,62, 62,61,61,61,61,61,60,60,60,60,60,59,59,59,59,58,58,58,58,58,58, 58,58,58,57,57,57,57,57,57,57,57,57,56,56,56,56,56,56,56,56,56, 55,55,55,55,55,55,55,55,55,54,54,54,54,53,53,53,53,53,53,53,53, 53,53,53,53,52,52,52,52,52,52,52,52,52,52,52,52,51,51,51,51,51, 51,50,50,50,49,49,49,49,48,48,48,48,48,48,48,48,48,48,48,48,48, 47,47,47,46,46,46,46,46,46,45,45,45,45,45,45,44,44,44,44,44,44, 43,43,43,43,43,43,43,43,43,43,43,43,42,42,41,41,41,41,40,40,40, 40,40,40,40,40,40,40,40,40,39,39,39,39,39,38,38,38,38,38,38,38, 38,38,38,37,37,37,37,37,37,36,36,36,36,36,36,36,36,35,35,35,35, 35,35,34,34,33,33,33,33,33,33,33,32,32,32,32,32,32,32,32,31,31, 31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30,30 }; const int n4c3w4_b[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,99,98,98,98,98,98,98,98,98,98,98, 98,97,97,97,97,97,97,97,97,97,97,96,96,95,95,95,95,95,94,94,94, 94,94,94,94,94,93,93,93,93,93,93,93,92,92,92,92,92,92,91,91,91, 91,91,91,91,91,91,91,90,90,90,90,90,90,89,89,89,89,89,89,89,89, 89,88,88,88,88,88,88,88,87,87,87,87,87,87,86,86,86,86,86,85,85, 85,85,85,85,85,85,85,84,84,84,84,84,84,84,84,83,83,83,82,82,82, 82,82,81,81,81,81,81,81,81,80,80,80,80,80,80,80,79,79,79,79,79, 79,78,78,78,78,78,78,77,77,77,77,77,77,77,77,76,76,76,76,76,75, 75,75,75,75,75,75,74,74,74,74,74,74,74,74,74,74,74,73,73,73,73, 73,73,73,73,73,72,72,72,72,72,72,71,71,71,71,71,71,71,70,70,70, 70,70,70,70,69,69,69,69,69,68,68,68,67,67,67,67,67,67,67,67,67, 67,67,66,66,66,66,66,65,65,65,65,65,64,64,64,64,64,63,63,63,63, 63,63,63,62,62,62,62,62,62,62,62,61,61,61,61,60,60,60,60,60,60, 60,60,60,60,60,59,59,59,59,58,58,58,58,58,58,58,57,57,57,57,57, 56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,55,54,54,54,54,54, 54,53,53,53,53,53,53,53,52,52,52,52,52,51,51,51,51,51,51,51,51, 51,51,51,51,50,50,50,50,50,49,49,49,49,49,49,49,48,48,48,48,48, 48,47,47,47,47,47,47,47,47,47,46,46,46,46,46,46,46,46,46,45,45, 45,45,45,45,45,45,44,44,44,44,44,43,43,43,43,43,43,43,43,43,43, 43,43,43,43,42,42,42,42,42,42,42,42,42,42,42,42,42,41,41,41,41, 41,41,41,41,41,40,40,40,40,40,40,40,40,40,39,39,39,39,39,38,38, 38,38,38,37,37,37,37,37,37,36,36,36,36,36,36,36,35,35,35,35,35, 35,35,35,35,34,34,34,34,34,34,34,34,34,34,34,33,33,33,33,33,33, 32,32,32,32,32,31,31,31,31,31,31,31,31,30,30,30,30,30,30 }; const int n4c3w4_c[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,99, 99,99,99,99,99,99,98,98,98,98,97,97,97,97,97,97,96,96,96,96,96, 96,96,96,96,95,95,95,95,95,95,95,95,94,94,94,94,94,94,93,93,93, 93,93,93,93,93,92,92,92,92,92,92,91,91,91,91,91,91,91,91,90,90, 90,90,90,89,89,89,89,89,89,88,88,88,88,88,88,87,87,86,86,86,86, 86,86,85,85,85,85,85,85,85,85,84,84,84,83,83,83,83,83,83,83,83, 83,83,82,82,82,82,82,81,81,81,81,81,81,81,81,80,80,80,80,80,80, 80,80,80,80,80,80,80,80,79,79,79,79,79,79,79,79,79,79,79,78,78, 78,77,77,77,77,77,77,77,76,76,76,76,76,76,76,76,76,75,75,75,75, 74,74,74,74,74,74,74,74,74,73,73,73,73,73,73,73,72,72,72,72,72, 72,72,72,71,71,71,71,71,70,70,70,70,70,70,70,70,69,69,69,69,68, 68,68,68,68,68,68,67,67,67,67,66,66,66,66,66,66,66,66,65,65,65, 65,65,65,65,65,64,64,64,64,64,64,64,64,64,64,63,63,63,63,63,63, 62,62,62,62,62,62,62,62,61,61,61,61,61,60,59,59,59,59,58,58,58, 58,58,58,58,58,58,57,57,57,57,57,57,57,56,56,56,56,56,56,56,56, 56,56,56,55,55,55,55,55,55,55,54,54,54,54,54,53,53,53,53,53,52, 52,52,52,52,52,52,52,51,51,51,51,51,51,51,51,50,50,50,50,50,50, 50,50,50,50,50,49,49,49,49,49,49,49,48,48,48,48,48,47,47,47,47, 47,47,47,47,47,46,46,45,45,44,44,44,44,44,44,44,44,44,44,44,44, 43,43,43,43,43,43,43,43,43,43,42,42,42,42,42,41,41,41,41,41,41, 41,41,41,40,40,40,40,39,39,39,39,39,38,38,38,38,38,38,38,38,38, 38,38,38,37,37,37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36, 36,35,35,35,35,35,35,35,35,34,34,34,34,34,33,33,33,33,33,33,33, 33,33,33,32,32,32,32,32,32,32,32,32,31,31,31,30,30,30,30,30,30 }; const int n4c3w4_d[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,99,99,99,99,99,98,98,98,98,98,98,97,97,97,97,97,97,97,97, 96,96,96,96,96,96,96,95,95,95,95,95,94,94,94,94,94,94,94,94,94, 93,93,93,93,92,92,92,92,92,92,92,92,92,92,91,91,91,91,91,91,91, 90,90,90,90,89,89,89,89,89,88,88,88,88,88,88,88,88,87,87,87,87, 87,87,86,86,86,86,86,86,85,85,85,84,84,84,84,84,84,84,84,84,84, 84,84,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,82,82,81,81, 81,81,81,81,81,81,81,81,81,80,80,80,80,80,80,80,80,80,79,79,79, 79,78,78,78,78,78,77,77,77,77,77,77,76,76,76,76,76,76,76,76,76, 76,75,75,75,75,75,75,75,75,75,75,74,74,74,74,74,74,74,74,74,74, 74,74,73,73,73,73,72,72,72,72,71,71,71,71,70,70,70,70,70,70,70, 69,69,69,69,69,69,69,69,69,69,69,69,68,68,68,68,68,68,68,68,68, 68,68,68,67,67,67,67,67,66,66,66,66,66,66,66,66,66,66,66,65,65, 65,65,65,65,64,64,64,64,64,64,64,64,63,63,63,63,63,63,63,62,62, 62,62,62,62,62,61,61,61,61,61,61,61,61,60,60,60,60,60,60,59,59, 59,59,59,58,58,58,58,58,58,58,58,58,58,58,58,58,57,57,57,57,57, 56,56,56,56,55,55,55,55,55,54,54,54,54,54,54,54,53,53,53,53,53, 53,53,52,52,52,52,52,52,52,52,51,51,51,51,51,51,50,50,50,50,50, 50,50,50,49,49,49,49,49,48,48,48,48,48,48,47,47,47,47,47,47,47, 46,46,46,46,45,45,45,45,45,45,45,45,45,44,44,44,44,44,44,44,44, 44,44,43,43,43,43,43,43,43,43,42,42,42,41,41,41,41,41,41,41,40, 40,40,40,40,40,40,40,39,39,39,39,39,39,38,38,38,38,38,38,38,37, 37,37,37,37,37,36,36,36,36,36,36,36,36,35,35,35,35,35,35,35,35, 35,35,34,34,34,34,34,34,34,34,34,33,33,33,33,33,33,32,32,32,32, 32,32,32,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30 }; const int n4c3w4_e[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,98,98, 98,98,98,98,98,97,97,97,97,97,97,97,97,96,96,96,96,96,95,95,95, 95,95,95,94,94,94,94,94,94,94,94,94,94,94,93,93,93,92,92,92,92, 92,92,92,92,92,92,92,92,92,91,91,91,91,91,91,91,91,91,90,90,90, 90,90,89,89,88,88,88,88,88,88,87,87,87,87,87,87,87,86,86,86,86, 86,85,85,85,85,85,85,85,84,84,83,83,83,83,83,83,83,83,82,82,82, 82,82,82,82,82,82,82,81,81,81,81,81,81,80,80,80,80,80,80,80,80, 80,80,80,79,79,79,79,79,79,78,78,78,78,78,78,78,77,77,76,76,76, 76,76,76,76,76,76,75,75,75,75,75,75,75,75,75,75,75,74,74,74,74, 74,74,74,74,74,74,73,73,73,73,73,73,73,73,73,72,72,72,72,72,72, 72,71,71,71,71,71,71,71,70,70,70,70,70,70,70,70,70,70,69,69,69, 68,68,68,67,67,67,67,67,67,67,67,67,66,66,66,66,65,65,65,65,65, 65,65,64,64,64,64,64,64,64,63,63,63,63,63,63,63,63,63,62,62,62, 62,62,62,61,61,61,61,61,61,61,61,61,61,60,60,60,60,60,60,59,59, 59,59,59,59,58,58,58,58,58,58,58,58,57,57,57,57,57,57,57,57,57, 56,56,56,56,56,56,55,55,55,55,55,55,54,54,54,54,54,54,54,54,54, 54,54,53,53,53,53,53,52,52,52,52,52,51,51,51,51,51,51,51,51,51, 50,50,50,50,50,50,50,50,50,50,49,49,49,49,49,48,48,48,48,48,48, 48,48,47,47,47,47,47,47,47,46,46,46,46,46,46,46,46,46,46,46,45, 45,45,45,45,45,45,45,45,45,45,44,44,44,44,44,44,44,44,43,43,43, 43,42,42,42,42,42,41,41,41,41,40,40,40,40,40,39,39,39,39,39,39, 39,39,39,39,39,38,38,38,38,38,38,38,37,37,37,37,37,37,37,37,36, 36,36,36,35,35,35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,34, 33,33,33,33,33,32,32,32,32,32,32,31,31,31,31,31,30,30,30,30 }; const int n4c3w4_f[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,99,99,99,99,98,98,98,98,98,98,98,97,97,97,97,97,97,97, 97,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,95,94,94,94, 94,94,94,94,94,94,94,94,94,94,94,94,94,94,93,93,93,93,92,92,92, 92,92,92,92,92,92,92,92,91,91,91,91,91,91,91,91,90,90,90,90,90, 89,89,89,89,89,89,89,89,89,89,89,89,88,88,88,88,88,88,87,87,87, 87,87,87,87,86,86,86,86,86,86,86,85,85,85,85,85,85,85,84,84,84, 84,84,84,84,84,83,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82, 82,82,82,82,82,82,82,81,81,81,81,81,81,81,81,80,80,80,80,80,79, 79,79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,77,77,77,77,77, 77,76,76,76,76,76,75,75,75,75,75,75,74,74,74,74,74,74,74,74,74, 73,73,73,73,73,73,73,73,73,72,72,72,72,72,72,72,72,71,71,71,71, 71,71,70,70,70,69,69,69,69,69,69,69,69,68,68,68,68,68,68,68,68, 67,67,67,66,66,66,66,66,65,65,65,65,65,64,64,63,63,63,63,63,63, 63,63,62,62,62,62,62,61,61,61,61,61,61,61,61,61,60,60,60,60,60, 60,60,59,59,59,59,59,59,58,58,58,58,57,57,57,57,57,57,56,56,56, 56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,54,54,54,54,54,54, 53,53,53,53,53,52,52,52,52,52,52,50,50,50,50,50,50,50,50,50,50, 50,49,49,49,49,49,49,49,49,49,49,48,48,48,48,48,48,47,47,47,47, 47,47,46,46,46,45,45,45,45,45,44,44,44,44,44,44,44,44,43,43,43, 43,43,43,42,42,42,42,42,42,42,41,41,41,41,41,41,41,41,41,41,40, 40,40,40,40,40,40,38,38,38,38,38,38,38,38,37,37,37,37,37,37,37, 37,36,36,36,36,36,36,36,35,35,35,35,35,35,35,35,35,35,35,35,34, 34,34,34,34,34,34,33,33,33,33,33,33,33,32,32,32,32,32,32,32,32, 31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30,30,30 }; const int n4c3w4_g[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,98, 98,98,98,98,97,97,97,97,97,97,97,96,96,96,96,96,96,96,95,95,95, 95,95,94,94,94,94,94,93,93,93,93,93,93,93,93,93,93,93,93,92,92, 92,92,92,92,92,92,92,92,92,92,91,91,91,91,91,91,90,90,90,90,89, 89,89,89,89,89,89,88,88,88,88,88,88,87,87,87,87,87,86,86,86,86, 86,86,86,86,86,86,86,85,85,85,85,85,85,85,84,84,84,84,84,84,84, 84,84,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,81,81,81,81, 81,81,81,81,81,81,80,80,80,80,80,80,80,79,79,79,79,79,79,79,79, 79,79,78,78,77,77,77,77,77,77,76,76,76,75,75,75,75,75,75,75,75, 75,74,74,74,74,74,74,74,74,74,74,74,74,73,73,73,73,73,72,72,72, 72,72,72,72,72,72,72,71,71,71,71,71,71,71,70,70,70,70,70,70,70, 69,69,69,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68, 67,67,67,67,67,67,67,67,67,66,66,66,66,66,66,66,66,66,66,66,66, 66,66,65,65,65,65,65,65,65,64,64,64,63,63,63,63,63,63,63,62,62, 62,62,62,61,61,61,61,61,60,60,60,60,60,60,60,60,60,60,60,60,59, 59,59,59,59,59,59,59,59,59,58,58,58,58,58,58,58,57,57,57,57,57, 57,56,56,56,56,56,56,56,56,55,55,55,55,55,55,55,55,54,54,54,54, 54,54,54,54,53,53,53,53,53,52,52,52,52,52,51,51,51,51,51,51,50, 50,50,49,49,49,49,49,49,49,48,48,48,48,47,47,47,47,47,47,46,46, 46,46,46,46,46,46,46,45,45,45,45,45,45,44,44,44,44,43,43,43,43, 43,42,42,42,42,42,42,42,41,41,41,41,41,40,40,40,40,39,39,39,39, 39,39,39,39,38,38,38,38,38,38,38,38,38,37,37,37,37,36,36,36,36, 36,36,36,36,36,35,35,35,35,34,34,34,34,33,33,33,33,33,33,33,33, 32,32,32,32,32,32,32,31,31,31,31,31,31,31,31,31,30,30,30,30,30 }; const int n4c3w4_h[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,98,98,98, 98,98,98,98,98,97,97,97,97,96,96,96,96,96,96,96,96,96,96,96,96, 95,95,95,95,95,95,94,94,94,94,94,94,94,94,93,93,93,93,93,93,93, 93,92,92,92,92,92,91,91,91,91,91,91,91,91,91,91,90,90,90,90,89, 89,88,88,88,88,88,88,88,88,88,87,87,87,87,87,87,87,87,87,87,87, 86,86,86,86,86,86,85,85,85,85,85,85,85,84,84,84,84,83,83,83,83, 83,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,82,82,81,81,81, 81,81,81,81,81,80,80,80,80,80,80,80,80,79,79,79,79,79,79,79,79, 79,79,79,78,78,78,78,78,78,78,77,77,77,76,76,76,76,76,76,76,75, 75,75,75,75,74,74,74,74,74,73,73,73,73,73,73,73,72,72,72,72,72, 72,71,71,71,71,71,70,70,70,70,70,70,70,70,70,69,69,69,69,69,69, 69,68,68,68,68,68,68,68,68,68,68,67,67,67,67,67,67,66,66,66,66, 66,66,66,65,65,65,65,65,65,65,65,64,64,64,64,64,64,63,63,63,63, 63,63,63,62,62,62,62,62,61,61,61,61,61,61,60,60,60,60,60,60,60, 60,59,59,59,59,59,59,59,58,58,58,58,58,58,58,58,58,58,57,57,57, 57,57,57,57,57,57,56,56,56,56,56,56,55,55,55,55,55,55,55,55,54, 54,54,54,54,54,54,53,53,53,53,53,53,53,52,52,52,52,52,52,52,52, 52,51,51,51,51,51,51,51,51,50,50,50,49,49,49,49,49,49,49,49,49, 49,49,48,48,48,48,47,47,46,46,46,46,46,45,45,45,45,45,45,45,44, 44,44,44,44,44,43,43,43,43,43,43,42,42,42,42,42,42,42,41,41,41, 41,41,41,40,40,40,40,40,40,39,39,39,39,39,39,39,38,38,38,38,38, 38,38,37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,35,35,35,35, 35,35,34,34,34,34,34,34,33,33,33,33,33,32,32,32,32,32,32,31,31, 31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30,30 }; const int n4c3w4_i[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,99,99, 99,99,99,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,96,96,96, 96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,94,94,94,94,94,94, 94,94,94,94,94,94,93,93,93,93,93,93,92,92,92,92,92,92,92,92,92, 91,91,91,91,91,91,91,91,90,90,90,90,90,89,89,89,89,89,89,89,88, 88,88,88,88,88,88,87,87,87,87,87,87,87,87,86,86,86,86,86,85,85, 85,85,85,85,85,84,84,84,84,84,84,84,84,84,84,83,83,83,83,83,83, 83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,81,81,81,81,80,80, 80,80,80,80,80,80,80,80,79,79,79,79,79,79,79,78,78,78,78,78,77, 77,77,77,76,76,76,76,76,75,75,75,75,74,74,74,74,74,73,73,73,73, 73,73,73,73,72,72,72,72,72,72,72,71,71,71,71,71,71,71,71,70,70, 70,70,70,70,70,70,70,70,69,69,69,69,69,69,69,68,68,68,68,68,68, 67,67,67,67,67,67,67,67,66,66,66,66,66,66,66,65,65,65,64,64,64, 64,64,63,63,63,63,63,63,63,63,62,62,62,62,62,62,61,61,61,61,61, 61,61,61,61,61,60,60,60,60,60,60,60,60,59,59,59,58,58,58,58,58, 57,57,57,57,56,56,56,56,56,55,55,55,55,55,55,55,55,55,54,54,54, 54,54,54,54,54,54,54,54,54,53,53,53,53,53,53,53,52,52,52,52,52, 52,52,52,52,52,52,52,52,51,51,51,51,50,50,50,50,50,49,49,49,49, 49,49,49,49,48,48,48,48,48,48,48,48,47,47,47,47,47,47,47,47,46, 46,46,46,45,45,45,45,45,45,44,44,44,43,43,43,43,43,42,42,42,42, 42,41,41,41,41,41,41,40,40,39,39,39,39,39,39,39,39,39,39,38,38, 38,38,38,38,37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,35, 35,35,34,34,34,34,34,34,34,33,33,33,33,33,33,33,33,33,32,32,32, 32,32,32,32,32,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30 }; const int n4c3w4_j[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,98,98,98,98,98,98,98,98,97,97, 97,97,97,97,97,97,97,96,96,96,96,95,95,95,95,95,94,94,94,94,94, 93,93,93,93,92,92,92,92,92,92,92,92,91,91,91,90,90,90,90,90,90, 90,90,90,89,89,89,89,89,89,89,89,89,89,89,89,88,88,88,88,88,87, 87,87,87,87,87,86,86,86,86,86,86,85,85,85,85,85,84,84,84,84,84, 84,83,83,83,83,82,82,82,82,82,81,81,81,81,81,80,80,80,80,80,80, 80,79,79,79,79,79,79,78,78,78,78,78,78,78,77,77,77,77,77,77,77, 77,77,76,76,76,76,76,76,76,75,75,75,75,75,75,75,74,74,74,74,74, 74,74,74,74,73,73,73,73,73,73,73,72,72,72,72,72,72,72,72,72,71, 71,71,71,71,71,71,71,71,71,71,70,70,70,70,70,70,69,69,69,69,69, 69,69,69,69,69,69,68,68,68,68,67,67,67,67,67,67,66,66,66,66,66, 66,66,66,66,66,65,65,65,65,65,65,65,65,64,64,64,64,64,63,63,63, 63,63,63,63,63,63,63,63,62,62,62,62,62,62,62,62,62,61,61,61,61, 60,60,60,60,60,59,59,59,59,59,59,59,59,58,58,58,58,58,57,57,57, 57,57,57,57,57,56,56,56,56,56,56,56,56,56,55,55,55,54,54,54,54, 54,53,53,53,53,53,53,53,53,52,52,52,52,52,52,52,52,52,52,51,51, 51,51,51,51,51,51,51,50,50,50,50,50,50,50,50,50,50,50,49,49,49, 49,49,49,49,49,49,49,49,49,48,48,48,48,48,48,48,48,48,47,47,47, 47,47,47,47,47,46,46,46,46,46,45,45,45,45,45,45,45,44,44,44,44, 44,44,44,44,44,43,43,43,43,43,42,42,42,42,42,41,41,41,40,40,40, 40,40,40,40,40,40,40,40,40,39,39,39,39,39,39,39,39,39,38,38,38, 38,38,38,38,38,38,38,37,37,37,37,37,37,37,37,37,37,36,36,36,36, 35,35,35,35,35,35,35,35,35,35,34,34,34,34,34,33,33,33,33,33,33, 32,32,32,32,32,32,32,31,31,31,31,30,30,30,30,30,30,30,30 }; const int n4c3w4_k[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,99, 98,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,96,96,95, 95,95,95,95,95,94,94,94,94,94,94,94,94,93,93,93,93,92,92,92,92, 92,92,92,92,92,91,90,90,90,89,89,88,88,88,88,88,88,88,88,88,88, 88,87,87,87,86,86,86,86,86,86,86,85,85,85,85,85,85,85,85,85,85, 84,84,84,84,84,84,83,83,83,83,83,82,82,82,81,81,81,81,81,81,80, 79,79,79,79,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78,78,78, 77,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,76,75,75,75,75, 75,75,75,75,75,74,74,74,74,74,74,74,74,73,73,73,73,73,73,73,72, 72,72,72,72,72,72,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71, 71,71,71,71,71,70,70,70,70,70,70,70,70,69,69,69,69,68,68,68,68, 67,67,67,67,67,67,67,66,66,66,66,65,65,65,65,65,65,65,65,65,65, 65,65,65,64,64,64,64,63,63,63,63,62,62,62,62,62,61,61,61,61,61, 61,61,60,60,60,60,60,60,59,59,59,58,58,58,58,58,58,57,57,57,57, 57,57,57,57,56,56,56,55,55,55,55,55,55,55,55,55,54,54,54,54,54, 54,54,54,54,53,53,53,53,53,53,52,52,52,52,52,52,52,52,52,51,51, 51,51,51,51,50,50,50,50,50,50,50,49,49,49,49,49,49,49,49,49,49, 49,49,49,49,49,48,48,48,48,48,48,48,48,48,48,48,48,48,47,47,47, 47,47,47,47,47,47,46,46,46,46,46,45,45,45,45,45,45,45,45,45,44, 44,44,44,44,44,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,41, 41,41,41,41,41,41,41,41,41,40,40,40,40,40,40,39,39,39,39,39,39, 39,39,39,39,38,38,38,38,38,37,37,37,37,37,36,36,36,36,36,36,36, 36,36,36,35,35,35,35,35,35,35,35,35,34,34,33,33,33,33,33,33,33, 32,32,32,32,32,32,31,31,31,31,31,31,31,31,30,30,30,30,30,30 }; const int n4c3w4_l[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,99,99,98,98,98,98, 97,97,97,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,95, 95,95,95,95,94,94,94,94,94,94,94,94,93,93,93,93,93,92,92,92,92, 92,92,92,92,92,91,91,91,91,91,91,91,91,91,90,90,90,90,90,90,89, 89,89,89,89,89,89,89,89,88,88,88,88,88,88,88,88,87,87,87,87,87, 87,87,87,87,86,86,86,86,86,86,86,86,86,86,86,86,85,85,85,85,85, 84,84,84,84,84,84,84,84,84,84,83,83,83,83,83,81,81,81,81,81,81, 81,80,80,80,80,80,80,80,79,79,79,79,79,79,79,79,78,78,78,78,78, 77,77,76,76,76,76,76,76,76,76,76,75,75,75,75,75,75,75,75,74,74, 74,74,74,74,73,73,73,73,73,73,73,73,73,73,73,72,72,72,72,71,71, 71,71,71,70,70,70,70,70,70,70,69,69,69,69,69,69,68,68,68,68,68, 68,68,68,67,67,67,67,67,66,66,66,66,66,66,66,65,65,65,65,65,65, 65,65,65,65,65,64,64,64,64,64,64,64,64,64,64,63,63,63,63,63,63, 62,62,62,62,62,62,62,62,62,62,62,62,61,61,61,61,61,61,60,60,60, 60,60,60,60,60,60,60,60,60,60,59,59,58,58,58,58,58,58,57,57,57, 57,56,56,56,56,56,55,55,55,55,54,54,54,54,54,54,54,54,54,53,53, 53,53,52,52,52,52,52,52,51,51,51,51,50,50,50,50,50,50,50,49,49, 49,49,49,49,49,49,49,48,48,48,48,48,47,47,47,47,47,47,47,46,46, 46,46,46,46,46,45,45,45,45,45,45,45,45,44,44,44,44,44,44,44,44, 44,43,43,43,43,43,43,43,43,43,43,43,43,43,42,42,42,42,42,41,41, 41,41,41,41,41,40,40,40,40,40,40,39,39,39,39,39,38,38,38,38,38, 38,38,37,37,37,37,37,37,37,37,37,37,36,36,36,36,36,36,35,35,35, 35,34,34,34,34,34,34,33,33,33,33,33,33,33,33,33,33,33,32,32,32, 32,32,32,32,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30 }; const int n4c3w4_m[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,99,99,99,99,99,99,99,99,99,99,99,99,98,98,98, 98,98,98,98,98,98,97,97,97,97,97,97,97,96,96,96,96,96,95,95,95, 94,94,94,94,94,94,94,93,93,93,93,93,93,93,92,92,92,92,92,91,91, 91,91,91,91,91,90,90,90,90,90,90,90,90,90,89,89,89,89,89,89,89, 88,88,88,88,87,87,87,87,87,87,87,86,86,86,86,86,86,86,86,85,85, 85,85,85,85,84,84,84,84,84,84,84,84,83,83,83,82,82,82,82,81,81, 81,80,80,80,80,80,80,80,80,80,79,79,79,79,79,79,79,78,78,78,78, 78,78,78,78,78,78,77,77,77,77,77,77,77,77,77,77,76,76,76,76,76, 76,76,76,76,76,76,75,75,75,75,74,74,74,74,74,74,73,73,73,73,73, 73,73,72,72,72,72,72,72,72,72,71,71,71,71,71,71,71,71,71,70,70, 70,70,70,70,70,70,69,69,69,69,69,68,68,68,68,68,68,68,67,67,67, 67,67,67,67,67,66,66,66,66,66,66,66,66,66,66,66,65,65,65,65,65, 65,65,65,64,63,63,63,63,63,62,62,62,62,62,62,62,62,61,61,61,61, 61,60,60,60,60,60,60,60,60,60,60,59,59,58,58,58,58,58,58,57,57, 57,57,57,57,57,57,56,56,56,55,55,55,55,55,55,55,55,55,55,54,54, 54,54,54,54,53,53,53,53,53,53,53,53,53,53,53,52,52,52,52,52,52, 52,52,52,52,52,52,52,51,51,51,51,51,51,51,50,50,50,50,50,50,49, 49,49,49,49,49,49,49,49,49,48,48,48,48,48,48,48,48,48,47,47,47, 47,47,47,46,46,46,46,46,46,46,45,45,45,45,45,45,45,45,44,44,44, 44,44,44,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42,42,42, 41,41,41,41,41,41,41,41,41,41,40,40,40,40,40,40,40,40,39,39,39, 39,38,38,38,38,38,38,37,37,37,37,37,37,36,36,36,36,36,36,36,36, 35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,33,33,33,33,33,33, 32,32,32,32,32,32,31,31,31,31,31,31,30,30,30,30,30,30,30 }; const int n4c3w4_n[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,99, 99,99,99,99,98,98,98,98,97,97,97,97,97,97,97,97,96,96,96,96,96, 96,96,96,96,96,96,96,96,96,96,96,95,95,95,94,94,94,94,94,94,94, 94,94,94,93,93,93,93,93,92,92,92,92,92,92,92,92,92,92,92,92,91, 91,91,91,91,90,90,90,90,89,89,89,89,89,89,89,88,88,88,88,88,88, 88,88,88,88,88,87,87,87,87,87,87,86,86,86,86,86,86,86,86,85,85, 85,85,85,85,84,84,84,84,84,84,84,84,84,83,83,83,83,83,83,83,82, 82,82,82,82,82,81,81,81,81,81,81,81,81,81,81,81,81,81,80,80,80, 80,80,80,80,80,80,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78, 77,77,77,77,77,77,76,76,76,76,76,76,76,76,75,75,75,75,75,75,75, 75,74,74,74,74,74,74,74,73,73,73,73,73,73,73,73,72,72,72,72,72, 72,71,71,71,70,70,70,70,70,70,70,70,70,70,69,69,69,69,69,69,68, 68,68,68,68,68,68,68,68,67,67,67,67,67,67,67,66,66,66,66,66,66, 65,65,65,65,65,65,65,65,65,64,64,64,64,64,64,64,63,63,63,63,63, 63,63,63,62,62,62,62,62,62,61,61,61,61,61,61,61,60,60,60,60,60, 60,60,60,60,59,59,59,58,58,58,58,57,57,57,57,57,57,56,56,56,55, 55,55,55,55,54,54,54,54,54,54,54,54,53,53,53,53,53,53,52,52,51, 51,51,51,51,50,50,50,50,50,49,49,49,49,49,49,49,48,48,48,48,48, 48,48,47,47,47,47,47,47,47,47,47,46,46,46,46,46,46,46,46,45,45, 45,45,45,44,44,44,44,44,44,44,44,44,43,43,43,43,43,42,42,42,42, 42,42,42,42,42,42,42,41,41,41,41,41,40,40,40,40,40,40,40,39,39, 39,39,39,39,39,38,38,38,38,38,38,38,38,37,36,36,36,36,36,36,36, 36,36,36,35,35,35,35,35,35,35,35,35,34,34,34,34,33,33,33,33,33, 33,33,33,32,32,32,32,32,32,32,31,31,31,31,31,30,30,30,30,30,30 }; const int n4c3w4_o[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,99,99,99,98,98,98,98,98, 98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,96,96,95,95,95,95, 95,95,95,95,94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,93, 93,92,92,92,91,91,91,91,91,91,91,90,90,90,90,90,90,90,90,90,89, 89,89,89,89,89,89,89,88,88,88,88,88,88,88,88,88,88,87,87,87,87, 87,87,87,87,87,86,86,86,86,86,86,86,85,85,85,85,85,85,85,85,85, 84,84,84,84,84,84,84,84,84,83,83,83,83,83,83,83,83,83,83,83,83, 82,82,82,82,82,82,82,82,81,81,81,81,81,81,81,81,80,80,80,80,80, 79,79,79,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78,77,77,77, 77,77,77,77,76,76,76,76,76,76,75,75,75,75,75,75,75,75,75,75,75, 74,74,74,74,74,74,74,74,73,73,73,73,73,73,72,72,72,72,72,72,72, 71,71,71,71,71,71,71,71,71,71,71,70,70,70,70,70,70,70,70,70,70, 69,69,69,69,69,68,68,68,68,68,68,68,68,67,67,67,67,67,67,67,66, 66,66,66,66,66,66,66,66,65,65,65,65,65,64,64,64,64,64,64,64,64, 64,64,64,64,64,64,63,63,63,63,63,63,63,62,62,62,62,62,61,61,61, 60,60,60,60,59,59,59,59,59,58,58,58,58,58,58,57,57,57,57,57,57, 57,57,57,56,56,56,56,56,56,56,56,56,56,55,55,55,55,55,55,55,55, 55,54,54,54,54,54,54,54,53,53,53,53,53,53,53,52,52,52,52,52,52, 51,51,51,50,50,50,50,49,49,49,49,49,49,48,48,48,48,48,48,48,48, 48,47,47,47,47,46,46,46,46,45,44,44,44,44,44,44,44,43,43,43,43, 43,43,43,42,42,42,42,42,41,41,40,40,40,40,40,39,39,39,39,38,38, 38,38,38,38,38,37,37,37,37,37,37,37,37,37,37,36,36,36,36,36,35, 35,35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,34,34,34,33,33, 33,32,32,32,32,32,32,32,32,31,31,31,31,31,31,30,30,30,30 }; const int n4c3w4_p[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,99,99,98,98,98,98,98,98, 97,97,97,97,97,97,97,97,97,97,97,97,96,96,96,96,96,96,95,95,95, 95,95,95,94,94,93,93,93,93,93,92,92,92,92,92,92,92,92,92,92,92, 92,91,91,91,91,91,91,91,91,91,91,90,90,90,90,90,90,90,90,90,90, 90,90,90,89,89,89,89,89,89,89,89,89,89,88,88,88,88,88,88,88,87, 87,87,87,87,87,87,87,86,86,86,86,86,86,86,85,85,85,84,84,84,84, 84,84,83,83,82,82,82,82,81,81,81,81,81,81,81,81,80,80,80,80,80, 80,80,80,79,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78,77,77, 77,77,77,77,77,77,76,76,76,76,76,76,76,76,75,75,75,75,75,75,75, 74,74,74,74,74,74,74,74,73,73,73,73,73,73,73,73,73,72,72,72,72, 72,71,71,71,71,71,71,71,70,70,70,70,70,69,69,69,69,69,69,69,68, 68,68,68,68,68,68,67,67,67,67,66,66,66,66,66,66,66,66,65,65,65, 65,65,65,65,64,64,64,64,64,64,64,64,64,63,63,63,63,63,63,63,62, 62,62,61,61,61,61,61,61,61,61,60,60,60,60,60,60,60,60,60,59,59, 59,59,59,59,59,58,58,58,58,58,57,57,57,57,57,57,56,56,56,56,56, 56,56,56,55,55,55,55,55,55,54,54,54,54,54,54,53,53,53,53,53,53, 53,53,53,53,53,52,52,52,52,52,52,51,51,51,51,51,51,51,50,50,50, 50,50,49,49,49,49,49,48,48,48,48,48,48,48,47,47,47,47,47,46,46, 46,46,46,46,46,46,46,46,46,46,45,45,45,45,45,45,45,45,45,45,44, 44,44,44,44,44,44,43,43,43,43,43,43,42,42,42,42,42,42,42,41,41, 41,41,41,41,41,41,41,40,40,40,39,39,39,39,39,39,39,38,38,38,38, 38,38,37,37,37,37,37,37,37,37,37,37,37,37,36,36,36,36,36,36,35, 35,35,35,35,35,35,34,34,34,34,34,34,34,33,33,33,33,33,33,33,33, 32,32,32,32,32,31,31,31,31,31,31,30,30,30,30,30,30,30,30 }; const int n4c3w4_q[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,99,99,99,99,99,99,99,99,99,99,98,98,98,98,98,98,98, 98,98,98,98,98,98,98,97,97,97,97,97,97,96,96,96,96,96,96,96,95, 95,95,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,93,92,92,92, 92,92,91,91,91,91,91,91,91,91,91,91,91,91,90,90,90,90,90,90,90, 90,89,89,89,89,89,89,89,89,89,88,88,88,88,88,88,88,88,88,88,87, 87,87,87,87,86,86,86,86,86,86,86,86,86,85,85,85,85,85,84,84,84, 84,84,84,84,84,83,83,83,83,83,83,83,83,82,82,82,82,81,81,81,81, 81,81,80,80,80,80,80,80,80,80,80,79,79,79,79,79,78,78,78,78,78, 77,77,77,77,77,77,77,76,76,76,76,76,76,76,76,76,75,75,75,75,75, 75,75,75,74,74,74,74,73,73,73,73,72,72,72,72,72,72,72,72,72,72, 72,72,71,71,71,71,71,71,71,71,70,70,70,70,70,70,70,70,70,69,69, 69,69,69,68,68,68,68,68,68,68,68,67,67,67,67,67,67,67,66,66,66, 66,66,66,66,66,66,66,65,65,65,65,65,65,65,65,65,64,64,64,64,64, 63,63,63,63,63,63,63,62,62,62,62,62,62,62,62,62,62,61,61,61,61, 61,61,61,61,60,60,60,60,60,60,60,60,60,60,60,59,59,59,59,59,59, 58,58,58,58,58,58,57,57,57,56,56,56,56,56,56,55,55,55,55,55,55, 55,54,54,54,54,53,53,53,53,53,53,53,53,52,52,52,52,52,52,52,52, 51,51,51,51,51,51,51,51,51,50,50,50,50,50,50,50,49,49,49,49,49, 49,49,49,49,49,48,48,48,48,48,47,47,47,47,47,47,47,46,46,46,46, 46,46,45,45,45,45,45,45,45,44,44,43,43,43,43,43,43,43,43,42,42, 42,42,42,42,42,41,41,41,41,41,41,41,41,41,41,41,41,40,40,40,40, 40,40,39,39,39,39,39,39,39,39,38,38,38,38,38,38,37,37,37,37,37, 36,36,36,36,36,35,35,35,35,35,35,34,34,34,34,34,34,33,33,33,33, 33,33,32,32,32,32,31,31,31,31,31,30,30,30,30,30,30,30 }; const int n4c3w4_r[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,99,98,98,98,98,98,98,98, 98,97,97,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,95,95, 95,95,95,95,94,94,94,94,94,94,94,93,93,93,92,92,92,92,92,92,92, 92,92,91,91,91,91,91,91,90,90,90,90,90,90,90,90,89,89,89,89,89, 89,89,89,88,88,88,88,88,88,87,87,87,87,87,86,86,86,86,86,86,85, 85,85,85,85,84,84,84,84,84,84,84,84,83,83,83,83,83,83,83,83,82, 82,82,82,82,82,81,81,81,81,81,80,80,80,80,80,80,80,80,80,79,79, 79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,77, 77,77,77,77,77,76,76,76,76,76,75,75,75,75,75,75,74,74,74,74,74, 74,73,73,73,73,73,73,73,73,73,73,72,72,72,72,72,72,72,71,71,71, 71,70,70,70,70,70,70,69,69,69,69,69,68,68,68,68,68,67,67,67,67, 67,67,66,66,66,66,66,65,65,65,65,65,64,64,64,64,63,63,63,63,63, 63,63,63,63,63,62,62,62,62,62,62,62,62,61,60,60,60,60,60,60,60, 59,59,59,59,59,59,58,58,58,58,58,58,58,57,57,57,57,57,57,57,57, 56,56,56,56,56,56,56,56,56,55,55,55,55,55,55,54,54,54,54,54,53, 53,53,53,53,53,53,53,52,52,52,52,52,52,52,51,51,51,51,51,51,50, 50,50,50,49,49,49,49,49,49,48,48,48,48,48,48,48,48,48,48,48,47, 47,47,47,47,47,47,46,46,46,46,46,46,45,45,45,45,45,44,44,44,44, 44,44,43,43,43,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42, 41,41,41,41,41,41,40,40,40,40,40,40,40,40,40,40,40,40,40,39,39, 39,39,38,38,38,38,38,38,38,38,38,38,38,38,37,37,37,37,37,37,37, 37,37,37,37,36,36,36,36,36,36,36,36,36,35,35,35,35,35,35,35,35, 34,34,34,34,34,34,34,34,34,34,34,34,33,33,33,33,33,33,32,32,32, 32,32,32,32,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30 }; const int n4c3w4_s[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,99,99,98,98,98,98, 98,98,97,97,97,97,96,96,96,96,96,96,96,95,95,94,94,94,94,94,94, 94,94,94,94,93,93,93,93,93,93,93,93,93,93,93,93,93,92,92,92,92, 92,92,92,91,91,91,91,91,91,91,90,90,90,90,90,90,89,89,89,89,89, 88,88,88,88,88,88,88,88,87,87,87,87,87,87,87,86,86,86,86,86,86, 86,86,86,85,85,85,85,85,85,84,84,84,83,83,83,83,83,83,82,82,82, 82,82,82,82,82,82,81,81,81,81,81,80,80,80,80,80,80,80,80,80,79, 79,79,79,79,79,79,78,78,78,78,77,77,77,77,77,76,76,76,76,76,76, 76,76,75,75,75,75,75,75,75,75,75,74,74,74,74,74,74,74,74,73,73, 73,73,73,73,73,73,73,73,73,73,73,72,72,72,72,72,71,71,71,71,71, 71,71,71,70,70,70,70,70,69,69,69,69,69,69,69,69,69,68,68,68,68, 68,68,68,68,68,68,67,67,67,67,66,66,66,66,66,66,66,66,65,65,65, 65,65,65,65,65,64,64,64,64,64,64,64,63,63,63,63,63,63,63,62,62, 62,62,62,62,62,61,61,61,61,61,61,60,60,60,60,60,60,59,59,59,59, 59,59,59,58,58,58,58,58,58,57,57,57,57,57,56,56,56,56,56,56,56, 56,55,55,55,55,55,55,55,55,55,55,55,54,54,54,54,54,54,54,54,54, 53,53,53,52,52,52,52,52,52,51,51,51,51,51,51,51,51,51,51,50,50, 50,50,50,50,49,49,49,49,49,49,49,49,49,49,48,48,48,48,48,48,47, 47,46,46,46,46,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,44, 44,44,44,44,44,44,43,43,43,43,43,43,43,43,43,42,42,42,42,42,41, 41,41,41,41,41,41,40,40,40,40,40,40,40,40,39,39,39,39,38,38,38, 38,37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,35,35,35,35,35, 35,35,35,34,34,34,34,34,34,34,34,34,33,33,33,33,33,32,32,32,32, 32,32,32,32,32,31,31,31,31,31,31,31,31,31,31,31,31,31,30,30 }; const int n4c3w4_t[] = { 150, // Capacity 500, // Number of items // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,99,99,99,98,98,98,98,98, 98,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,95,95,95,95,95, 95,95,95,94,94,94,94,94,93,93,93,93,93,93,93,92,92,92,92,92,92, 91,91,91,91,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90, 89,89,88,88,88,88,88,88,88,88,88,88,88,88,87,87,87,87,87,86,86, 86,86,86,86,86,86,85,85,85,85,85,85,85,85,84,84,84,83,83,82,82, 82,82,82,82,82,82,82,82,82,82,82,81,81,81,81,81,81,81,80,80,80, 80,80,79,79,79,79,78,78,78,77,77,77,77,77,77,77,77,76,76,76,76, 75,75,75,75,75,75,75,74,74,74,74,74,74,74,74,74,74,74,73,73,73, 73,73,73,73,73,73,72,72,72,72,72,72,72,72,71,71,71,71,71,71,71, 70,70,70,70,70,70,69,69,69,69,69,69,69,69,68,68,68,68,68,68,68, 68,67,67,67,67,67,67,67,67,67,67,66,66,66,66,66,66,66,65,65,65, 65,65,65,64,64,64,64,64,64,64,63,63,63,63,63,63,63,63,62,62,62, 62,62,61,61,61,60,60,60,60,60,60,60,59,59,59,59,59,59,59,59,58, 58,58,58,57,57,57,57,56,56,56,56,56,56,56,56,56,55,55,55,55,55, 55,55,55,55,54,54,54,54,54,54,54,53,53,53,53,53,52,52,52,52,52, 52,52,52,51,51,51,51,51,51,51,51,50,50,50,50,49,49,49,49,49,49, 49,48,48,48,48,48,48,48,48,47,47,47,47,47,46,46,46,46,46,46,46, 46,45,45,45,45,45,44,44,44,44,44,44,44,44,44,44,44,44,43,43,43, 43,43,43,42,42,42,42,42,42,42,42,41,41,41,41,41,41,40,40,40,40, 40,39,39,39,39,39,38,38,38,38,38,38,38,38,38,38,38,37,37,37,37, 37,37,37,37,37,37,36,36,36,36,36,36,35,35,35,35,35,35,35,35,35, 35,35,34,34,34,34,34,34,34,34,33,33,33,33,33,33,33,32,32,32,32, 32,32,32,32,32,32,32,31,31,31,30,30,30,30,30,30,30,30,30 }; /* * Data set 2 * */ const int n1w1b1r0[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 395,394,394,391,390,389,388,384,383,382,380,379,376,371,368,365, 360,360,354,350,346,346,344,342,340,335,335,333,330,330,328,327, 317,316,311,310,310,306,300,300,297,296,295,294,294,286,285,278, 275,275 }; const int n1w1b1r1[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 392,392,391,390,390,388,386,382,381,380,380,380,375,375,375,374, 373,372,370,364,360,360,359,355,346,345,343,341,332,320,317,317, 314,313,311,308,307,305,303,296,294,290,283,282,280,274,273,272, 269,267 }; const int n1w1b1r2[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 396,393,392,389,389,385,383,383,381,380,380,380,379,378,376,369, 367,363,361,361,358,358,357,357,355,353,346,343,341,337,336,335, 334,333,329,323,321,312,311,302,295,295,293,292,291,288,280,279, 274,271 }; const int n1w1b1r3[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 390,389,388,384,382,381,377,377,377,375,375,373,364,363,363,362, 357,357,353,347,344,341,337,336,336,335,334,333,333,332,332,326, 323,319,314,311,309,307,306,301,301,297,295,293,292,292,290,284, 280,278 }; const int n1w1b1r4[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 396,394,388,381,380,378,377,377,372,363,359,358,358,358,353,352, 352,350,350,349,346,340,337,333,332,328,326,323,319,317,313,312, 309,298,297,295,295,294,286,285,285,282,281,280,278,278,276,275, 274,271 }; const int n1w1b1r5[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 394,392,391,386,383,382,380,370,369,368,368,365,356,356,355,354, 348,342,339,338,337,335,333,333,332,326,326,326,324,321,321,318, 317,312,305,304,303,302,299,291,287,281,281,279,278,278,274,274, 267,266 }; const int n1w1b1r6[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 396,394,394,392,387,387,384,367,366,365,364,363,362,361,358,356, 351,350,346,340,339,337,335,333,332,332,328,327,324,323,323,322, 320,317,314,312,310,308,307,306,306,304,303,299,295,292,288,283, 282,277 }; const int n1w1b1r7[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 396,395,394,391,389,388,382,381,380,379,376,371,366,366,365,364, 359,356,353,348,346,345,343,336,335,335,327,325,320,320,320,308, 306,302,299,297,295,294,290,286,285,283,281,280,277,275,272,270, 269,269 }; const int n1w1b1r8[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 396,394,391,390,390,389,386,382,380,379,378,377,377,369,368,361, 359,358,357,356,353,350,348,345,341,340,333,332,328,327,322,319, 315,306,305,305,304,304,300,300,294,293,291,285,280,279,274,271, 269,266 }; const int n1w1b1r9[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 394,393,391,385,384,377,373,371,370,366,365,364,359,359,359,358, 357,356,352,348,346,346,324,324,323,323,323,321,320,317,316,315, 310,300,296,295,295,291,289,288,287,285,283,282,281,280,280,280, 274,269 }; const int n1w1b2r0[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 494,489,481,470,468,467,443,442,440,437,434,418,404,401,400,393, 374,371,363,362,361,355,353,351,349,347,337,333,328,322,321,315, 283,260,257,255,255,246,237,231,224,212,211,205,191,186,184,182, 174,173 }; const int n1w1b2r1[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 483,476,471,455,443,441,434,434,426,426,421,417,408,397,395,394, 389,380,380,378,375,373,357,340,325,319,318,310,304,292,291,277, 275,271,265,265,263,244,240,224,218,214,202,202,198,195,189,184, 181,169 }; const int n1w1b2r2[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 492,489,483,482,481,455,452,448,443,439,438,423,419,410,405,389, 386,381,374,367,366,361,357,348,322,316,300,293,292,285,283,279, 279,276,271,264,254,249,241,231,226,223,220,201,193,192,189,182, 178,170 }; const int n1w1b2r3[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 490,489,485,473,456,444,436,428,424,420,409,407,395,384,382,376, 372,370,360,358,340,338,338,335,326,319,305,302,293,291,287,271, 262,256,249,248,245,231,203,198,196,194,194,194,182,182,171,169, 169,168 }; const int n1w1b2r4[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 492,491,485,480,467,463,458,455,451,446,437,422,421,416,409,406, 404,387,385,379,354,343,336,332,323,316,309,301,290,288,284,281, 275,255,253,244,243,229,227,223,223,215,214,211,208,203,203,185, 176,167 }; const int n1w1b2r5[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 489,488,473,468,459,450,443,434,429,417,415,404,393,379,376,376, 375,372,363,362,360,359,348,348,343,341,338,334,334,332,324,301, 291,289,288,270,268,255,255,242,228,228,227,218,203,196,195,181, 179,173 }; const int n1w1b2r6[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 478,469,466,465,444,439,436,434,433,429,428,418,398,395,387,387, 386,385,376,374,360,355,349,345,341,340,330,324,320,299,279,278, 264,260,257,249,247,241,237,219,215,205,199,196,193,191,187,185, 182,175 }; const int n1w1b2r7[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 495,492,489,488,487,487,486,475,473,469,469,463,455,454,452,432, 430,404,401,396,396,377,368,352,344,341,321,311,309,288,285,282, 275,274,266,256,252,245,244,238,227,226,213,207,203,203,197,196, 170,168 }; const int n1w1b2r8[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 491,473,468,467,449,447,444,422,420,410,408,402,392,385,378,377, 358,358,356,342,334,329,327,322,319,314,306,303,296,279,264,263, 263,263,252,250,244,235,230,228,217,217,210,206,190,185,182,175, 172,168 }; const int n1w1b2r9[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 489,489,486,484,478,475,463,460,460,452,447,447,436,432,432,429, 427,426,420,419,382,369,367,356,341,336,329,324,311,304,302,283, 283,274,271,271,267,262,261,258,243,236,225,223,218,203,202,200, 186,186 }; const int n1w1b3r0[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 627,600,598,588,551,543,536,518,509,503,487,484,472,468,463,461, 424,417,405,401,397,369,369,356,340,339,324,304,272,269,250,225, 217,183,168,162,156,155,147,132,125,117,115,114,114,95,77,71, 69,48 }; const int n1w1b3r1[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 626,618,617,606,588,561,558,530,526,523,518,500,496,486,483,476, 472,463,459,452,424,374,346,345,319,318,303,296,278,276,257,238, 236,216,211,193,181,171,164,161,159,157,128,115,114,108,108,82, 38,35 }; const int n1w1b3r2[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 624,617,601,599,583,553,513,484,478,468,466,465,462,421,410,403, 370,368,358,353,347,325,321,318,281,262,253,237,215,201,194,184, 183,173,159,158,148,140,133,123,116,87,84,81,78,77,74,57,51,46 }; const int n1w1b3r3[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 623,596,581,568,568,563,544,517,481,478,467,444,428,408,398,387, 382,378,364,363,357,356,353,343,341,330,304,300,260,252,252,252, 239,221,217,195,178,163,156,153,147,144,143,143,138,137,127,78, 68,59 }; const int n1w1b3r4[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 627,626,604,580,565,546,540,524,517,509,506,489,485,481,476,472, 446,441,426,411,410,407,404,390,385,379,374,368,364,354,351,345, 316,303,300,287,282,232,203,197,166,153,137,136,124,120,111,99, 96,88 }; const int n1w1b3r5[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 627,611,609,607,559,554,550,525,517,508,484,481,476,475,457,438, 427,425,414,407,401,391,369,352,334,330,314,295,235,234,232,208, 195,175,168,154,145,113,107,103,100,97,90,82,77,70,55,52,43,39 }; const int n1w1b3r6[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 614,600,591,569,557,536,518,515,514,507,504,498,476,460,436,425, 418,411,408,380,344,322,313,313,299,274,273,243,231,218,210,204, 198,176,171,167,134,121,119,112,99,94,83,74,61,56,56,53,52,38 }; const int n1w1b3r7[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 603,599,578,556,539,532,531,524,522,522,520,520,514,514,495,492, 478,471,458,457,457,445,439,434,433,413,374,364,338,333,320,300, 284,278,205,199,197,194,190,179,161,157,154,130,122,118,97,85, 69,37 }; const int n1w1b3r8[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 611,561,544,528,521,472,470,462,458,439,434,432,426,424,412,375, 373,365,363,359,350,348,344,344,341,313,310,309,301,294,290,279, 260,245,221,219,211,206,203,199,198,145,124,112,110,82,78,69, 66,39 }; const int n1w1b3r9[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 607,597,582,581,571,552,550,543,532,499,491,482,477,458,453,449, 419,417,412,403,394,392,385,363,343,339,299,299,290,286,283,269, 256,250,237,229,192,162,146,115,105,104,103,90,87,73,72,70,55, 38 }; const int n1w2b1r0[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 239,236,235,234,232,232,230,230,230,230,228,226,225,223,220,218, 217,217,216,215,214,213,213,210,210,209,209,206,206,205,205,198, 197,196,196,196,196,192,189,186,184,180,176,174,172,167,164,164, 164,163 }; const int n1w2b1r1[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 240,239,238,235,234,234,233,232,232,232,230,228,226,226,226,224, 220,215,215,214,214,210,209,209,207,206,205,201,198,197,195,194, 191,191,185,183,181,181,181,178,177,176,176,174,171,171,171,170, 168,168 }; const int n1w2b1r2[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 239,237,237,235,234,232,231,231,231,228,224,224,221,220,218,217, 216,214,212,210,208,208,202,199,198,198,197,193,193,191,189,189, 185,184,184,183,181,179,177,176,176,175,174,173,172,171,171,164, 162,162 }; const int n1w2b1r3[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 239,238,237,237,235,234,233,232,231,231,230,228,224,224,222,222, 221,220,218,216,214,214,210,206,205,204,202,202,200,199,198,198, 197,197,197,192,191,186,185,184,184,181,180,173,173,173,167,166, 165,164 }; const int n1w2b1r4[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 240,239,239,237,237,233,233,232,231,228,228,227,227,226,225,225, 225,225,221,220,220,214,214,214,210,209,206,206,205,202,202,200, 198,198,198,198,197,192,190,185,184,177,176,175,171,170,167,166, 163,162 }; const int n1w2b1r5[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 240,237,235,234,233,232,231,227,224,224,223,217,215,213,213,212, 210,206,205,205,204,204,203,202,201,201,200,199,193,190,189,186, 185,183,181,180,178,173,171,169,169,169,168,166,166,166,165,165, 164,163 }; const int n1w2b1r6[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 240,238,237,237,236,234,231,225,225,224,221,220,220,218,217,215, 214,212,209,209,202,201,200,200,199,197,197,197,197,196,195,193, 189,189,187,187,185,182,180,180,179,178,177,175,170,169,169,168, 167,163 }; const int n1w2b1r7[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 240,239,238,238,237,236,234,232,228,226,225,222,218,215,213,211, 210,210,206,204,203,203,203,202,201,200,199,197,196,196,195,188, 188,188,187,186,185,184,182,181,180,178,177,175,169,167,166,164, 164,163 }; const int n1w2b1r8[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 240,240,240,239,238,238,237,231,229,228,228,221,219,218,216,213, 209,209,206,202,202,202,201,201,199,197,197,196,190,189,189,186, 184,184,181,178,178,176,176,174,174,174,168,168,167,164,164,164, 163,163 }; const int n1w2b1r9[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 240,240,239,239,238,237,236,234,233,231,228,228,223,223,222,219, 218,218,215,213,212,211,209,204,198,197,196,195,188,186,185,185, 184,182,182,182,181,179,178,178,178,177,176,173,170,165,165,162, 162,162 }; const int n1w2b2r0[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 299,295,295,287,278,277,271,269,264,258,253,241,241,232,230,228, 226,221,213,212,211,210,203,202,200,198,197,194,172,172,170,167, 163,158,156,149,149,145,140,139,137,135,127,126,120,114,113,111, 109,102 }; const int n1w2b2r1[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 297,288,285,281,279,275,274,269,268,268,267,266,262,250,244,243, 241,241,238,230,229,226,220,219,218,203,202,201,201,201,189,188, 188,188,180,180,179,176,162,158,156,150,146,120,116,112,111,109, 104,102 }; const int n1w2b2r2[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 297,296,288,279,271,249,241,239,234,232,231,227,226,220,214,212, 212,209,205,200,199,194,193,191,187,186,184,183,175,172,167,154, 151,150,146,143,141,138,137,129,127,122,121,115,113,110,110,107, 104,103 }; const int n1w2b2r3[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 297,297,294,280,277,270,270,269,260,255,255,254,252,250,241,237, 223,222,221,217,216,211,209,209,206,204,193,192,192,191,187,182, 173,172,166,165,161,160,149,148,146,139,135,131,130,125,118,116, 111,102 }; const int n1w2b2r4[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 300,283,280,259,259,258,257,254,250,248,246,244,242,239,237,236, 225,222,212,206,205,205,203,201,193,190,188,185,185,185,182,179, 178,174,174,161,157,153,150,141,141,133,124,123,122,121,117,110, 106,103 }; const int n1w2b2r5[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 299,295,295,290,286,283,282,276,268,259,254,251,245,242,242,240, 236,234,231,223,217,214,208,205,200,183,181,179,172,171,169,165, 159,153,152,150,149,147,144,142,135,135,134,126,125,124,114,113, 106,105 }; const int n1w2b2r6[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 295,295,292,288,280,279,274,266,255,253,252,249,246,242,225,223, 217,212,210,209,203,200,190,188,173,172,171,165,164,163,158,157, 153,147,146,144,143,143,141,141,139,138,134,121,120,114,108,105, 104,103 }; const int n1w2b2r7[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 295,285,276,275,270,268,266,265,257,254,246,242,242,241,241,236, 231,231,229,224,223,216,215,209,207,200,195,194,178,177,177,159, 150,149,146,143,143,141,139,139,136,131,130,125,116,115,113,113, 103,102 }; const int n1w2b2r8[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 298,298,298,297,293,293,291,285,283,278,277,272,270,264,258,250, 246,236,232,231,230,229,225,219,216,216,215,211,208,193,192,190, 181,175,173,172,170,149,149,141,135,132,130,120,119,115,113,109, 107,105 }; const int n1w2b2r9[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 299,295,293,292,282,278,273,271,270,267,263,260,259,256,255,254, 245,238,229,228,228,228,228,226,206,205,204,198,196,195,191,163, 160,153,151,149,148,145,144,143,137,137,132,132,127,124,120,114, 109,105 }; const int n1w2b3r0[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 367,358,357,344,340,335,329,326,320,316,307,307,300,289,274,270, 244,225,225,216,212,208,200,193,190,186,186,167,166,163,157,156, 152,142,138,134,134,131,107,79,79,79,77,73,41,40,37,34,28,23 }; const int n1w2b3r1[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 376,355,355,350,336,327,314,308,308,300,299,297,296,277,275,264, 263,251,247,247,246,245,225,217,198,191,186,184,183,181,173,161, 157,153,137,133,121,109,108,107,93,80,80,76,76,74,69,67,44,26 }; const int n1w2b3r2[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 370,366,354,352,348,342,341,335,334,329,326,323,320,316,312,310, 302,270,264,247,231,217,217,202,183,181,180,150,141,136,135,135, 131,131,126,120,119,111,78,70,62,60,56,55,52,46,40,38,34,30 }; const int n1w2b3r3[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 350,348,338,335,334,328,322,306,306,305,296,288,287,286,284,279, 266,264,247,231,228,227,219,205,204,202,195,192,158,155,149,138, 135,134,131,129,128,121,118,118,113,103,103,98,96,83,82,82,77, 30 }; const int n1w2b3r4[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 374,372,342,328,313,313,293,290,283,282,280,244,243,234,233,227, 226,223,218,200,190,179,179,178,174,169,168,162,159,158,153,153, 152,129,126,121,119,114,111,93,85,82,67,67,54,49,46,36,25,25 }; const int n1w2b3r5[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 379,363,361,343,328,314,312,302,299,289,289,288,285,274,267,266, 263,257,255,234,220,212,208,194,186,186,184,164,163,160,160,125, 118,110,99,97,90,89,87,85,85,83,80,74,72,61,50,41,39,32 }; const int n1w2b3r6[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 375,360,360,355,342,331,325,321,305,299,296,294,292,288,262,257, 241,235,234,231,231,229,229,215,210,210,209,207,190,182,174,172, 163,163,161,159,141,135,125,106,102,89,87,72,58,46,34,34,29,27 }; const int n1w2b3r7[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 375,365,363,356,351,349,338,324,314,304,290,286,273,267,253,241, 240,238,223,220,219,213,211,208,193,182,167,139,133,132,132,131, 128,124,103,94,86,78,75,74,73,66,60,56,49,49,46,44,35,30 }; const int n1w2b3r8[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 370,364,361,326,323,323,319,310,303,300,289,284,278,267,257,244, 244,240,236,232,228,225,224,222,221,204,184,183,182,181,180,180, 179,177,173,170,143,140,136,131,125,121,93,87,80,67,64,59,37, 23 }; const int n1w2b3r9[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 361,360,352,350,343,324,311,300,298,290,277,277,275,274,269,267, 259,255,245,238,210,210,208,204,193,193,167,162,156,149,147,146, 141,134,132,125,123,112,105,81,76,72,71,62,58,56,41,36,33,24 }; const int n1w3b1r0[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 167,167,164,160,158,158,158,158,157,152,152,150,150,149,149,148, 146,144,144,144,142,142,141,137,137,136,135,134,133,133,133,133, 131,129,129,127,125,125,124,124,124,123,123,123,122,122,121,121, 119,118 }; const int n1w3b1r1[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 167,165,165,164,163,163,162,161,160,159,158,158,157,156,155,153, 153,151,151,151,150,148,148,147,147,147,147,147,146,146,146,143, 143,141,140,140,138,137,135,135,134,133,129,128,127,126,125,124, 123,115 }; const int n1w3b1r2[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 168,167,166,165,165,162,162,161,160,157,155,155,153,151,149,148, 148,144,144,144,143,141,141,141,140,139,137,136,134,134,133,133, 132,131,131,131,128,127,127,125,125,123,122,121,119,118,116,116, 115,114 }; const int n1w3b1r3[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 165,165,164,162,161,161,159,157,156,156,155,155,155,154,154,153, 151,150,149,148,148,146,146,146,145,144,138,138,137,137,136,135, 134,133,132,131,131,130,124,123,121,120,120,119,119,117,117,117, 116,114 }; const int n1w3b1r4[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 168,166,166,166,165,164,163,161,160,160,158,157,156,152,152,151, 148,148,147,146,144,144,143,141,139,139,139,135,134,133,133,133, 132,131,129,129,128,127,125,123,120,119,118,118,117,117,116,116, 116,115 }; const int n1w3b1r5[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 166,165,164,163,163,163,162,162,159,156,156,156,155,155,152,151, 151,150,149,149,148,147,146,145,143,143,143,137,137,135,135,134, 134,133,133,132,131,130,128,128,126,125,123,123,120,119,117,117, 117,115 }; const int n1w3b1r6[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 168,168,167,167,163,163,162,161,160,158,158,158,157,156,156,156, 156,155,154,154,153,152,151,151,149,149,148,145,143,142,142,142, 140,139,138,136,134,132,131,128,126,124,121,120,120,120,116,115, 114,114 }; const int n1w3b1r7[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 168,167,166,165,164,163,162,161,161,159,159,158,156,154,153,152, 152,152,151,151,150,148,146,145,145,139,138,137,136,136,135,135, 134,133,132,130,127,126,126,125,125,124,122,120,120,119,118,117, 117,116 }; const int n1w3b1r8[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 168,166,164,162,161,161,160,159,157,155,155,155,155,154,153,152, 151,148,148,146,144,144,144,143,142,141,140,137,136,135,132,131, 131,130,130,128,124,123,123,122,122,121,121,120,119,118,117,116, 115,114 }; const int n1w3b1r9[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 168,167,165,164,164,163,162,160,158,154,153,152,150,150,149,148, 147,147,146,144,144,143,142,142,141,141,140,139,136,135,135,134, 133,133,131,129,129,128,128,127,121,121,120,120,120,119,118,117, 116,115 }; const int n1w3b2r0[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 210,202,202,198,195,194,190,190,189,186,181,179,179,178,173,169, 168,166,165,165,158,148,146,143,140,137,137,135,133,129,126,121, 119,117,115,114,113,113,111,109,108,106,104,103,93,91,81,81,74, 74 }; const int n1w3b2r1[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 204,203,203,202,201,194,192,189,186,186,182,182,181,180,179,179, 176,174,172,171,163,161,155,154,154,151,147,146,144,140,134,132, 132,132,126,117,117,108,106,105,101,92,92,90,89,88,86,85,78,77 }; const int n1w3b2r2[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 208,203,203,201,193,193,191,190,189,172,169,168,166,165,165,162, 161,161,159,156,156,153,152,150,147,145,145,142,141,138,138,138, 128,121,119,118,113,110,109,107,106,101,101,97,91,84,83,74,74, 73 }; const int n1w3b2r3[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 204,202,199,199,195,192,191,190,187,181,172,169,169,166,163,163, 163,160,157,153,152,150,143,142,140,139,132,127,125,124,123,121, 119,116,113,108,108,107,98,95,95,94,90,90,88,86,82,81,80,78 }; const int n1w3b2r4[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 207,192,192,190,187,187,186,181,179,177,175,170,167,163,162,148, 148,148,147,147,133,132,131,130,130,129,127,125,122,119,118,114, 114,109,109,106,106,105,104,102,101,96,96,94,90,90,90,89,85,78 }; const int n1w3b2r5[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 205,201,200,200,189,187,180,177,173,170,169,167,166,162,160,151, 151,146,145,144,143,143,142,142,141,139,137,137,131,130,125,122, 120,120,119,116,107,104,95,92,91,90,88,85,84,83,83,79,76,73 }; const int n1w3b2r6[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 208,207,206,203,202,199,197,196,192,189,189,176,175,175,175,174, 171,170,167,164,164,158,156,156,154,153,152,150,148,143,141,134, 132,130,125,119,117,106,103,92,89,88,84,81,76,75,73,73,72,72 }; const int n1w3b2r7[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 210,207,205,204,203,202,201,192,191,190,187,185,184,183,181,178, 177,175,172,172,171,170,169,162,156,143,143,142,136,135,135,135, 129,124,122,119,116,112,97,95,92,89,87,81,80,78,75,74,73,72 }; const int n1w3b2r8[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 210,201,195,193,192,190,189,180,178,177,175,174,173,172,170,170, 167,166,166,165,164,163,162,159,159,158,156,148,147,145,143,136, 129,121,119,117,116,111,111,108,101,96,90,82,80,80,76,74,72,72 }; const int n1w3b2r9[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 208,205,204,204,202,196,190,190,188,185,182,181,175,169,166,164, 163,162,158,158,156,155,154,152,150,149,145,142,139,139,129,128, 123,119,113,102,102,95,93,92,90,89,86,84,81,80,80,75,75,73 }; const int n1w3b3r0[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 265,257,251,250,246,242,221,218,217,217,207,203,180,176,172,167, 162,162,160,156,145,141,140,135,132,132,129,126,121,116,113,112, 109,108,105,102,100,92,87,82,76,61,51,46,45,37,36,32,18,17 }; const int n1w3b3r1[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 251,249,247,241,235,227,222,215,207,207,203,199,198,196,195,185, 179,179,175,174,171,168,163,159,159,155,150,149,148,148,130,124, 119,112,109,105,100,95,89,72,68,64,58,57,55,51,45,27,26,21 }; const int n1w3b3r2[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 266,265,257,245,240,238,236,228,220,205,202,194,188,184,179,169, 164,163,159,156,154,153,145,143,135,134,130,127,115,109,100,88, 79,68,60,59,58,57,56,53,51,47,45,45,43,41,41,32,32,19 }; const int n1w3b3r3[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 254,248,246,238,237,223,221,219,219,217,215,208,208,208,202,198, 194,189,184,180,177,176,166,166,165,163,152,146,142,138,125,123, 115,114,113,110,96,94,88,88,86,78,67,56,43,35,34,32,25,16 }; const int n1w3b3r4[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 261,259,259,257,249,244,236,231,229,228,206,204,195,182,180,175, 172,170,169,165,161,160,156,155,153,148,147,147,146,131,115,113, 110,109,102,93,89,89,85,82,78,77,68,66,59,49,40,37,26,23 }; const int n1w3b3r5[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 259,252,249,240,235,216,199,194,189,177,175,172,170,170,167,167, 165,164,154,152,147,145,144,140,132,123,120,116,116,112,111,111, 108,95,79,75,75,71,66,64,55,52,50,49,49,47,35,22,19,19 }; const int n1w3b3r6[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 261,260,257,251,250,231,229,224,222,214,210,202,195,191,191,190, 189,175,165,160,159,157,156,146,139,137,133,132,132,126,123,119, 119,105,97,89,79,76,76,74,68,59,42,39,33,27,23,22,19,17 }; const int n1w3b3r7[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 266,265,259,258,258,242,240,235,229,227,218,213,211,206,204,199, 197,190,180,173,169,168,162,153,153,151,149,147,141,138,136,136, 130,122,120,118,94,90,88,87,75,65,61,45,43,27,27,25,22,22 }; const int n1w3b3r8[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 254,250,247,244,243,235,235,226,225,225,216,204,189,188,184,166, 159,139,135,133,130,126,121,119,118,114,108,104,102,94,93,89, 88,88,75,75,65,57,54,47,47,45,44,39,33,33,28,23,20,16 }; const int n1w3b3r9[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 265,262,259,251,251,249,244,243,234,233,227,224,200,200,195,189, 182,175,173,167,160,159,141,126,125,124,123,123,121,114,112,111, 103,100,95,72,70,65,55,49,49,44,36,28,25,25,24,20,19,16 }; const int n1w4b1r0[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 131,131,131,131,130,130,128,128,127,125,125,125,121,119,119,119, 118,117,116,113,111,110,109,109,108,108,106,106,105,104,104,103, 103,102,101,101,100,99,98,96,95,93,92,91,91,90,90,90,90,90 }; const int n1w4b1r1[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 132,131,131,130,130,129,128,128,127,127,127,126,124,122,122,122, 121,120,120,119,118,116,116,116,116,116,114,113,111,110,108,107, 104,104,101,101,99,97,95,95,95,94,93,92,92,92,92,91,91,91 }; const int n1w4b1r2[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 132,132,132,131,130,129,128,126,124,123,123,123,122,121,120,119, 119,118,118,118,118,115,113,113,110,109,108,108,107,104,103,102, 102,100,100,99,98,98,96,95,95,95,94,94,94,93,92,92,91,90 }; const int n1w4b1r3[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 132,132,131,130,130,127,124,124,123,122,122,121,121,120,119,119, 118,118,117,117,113,112,111,110,110,110,109,109,109,106,105,103, 103,103,101,101,98,98,98,97,97,97,97,96,95,94,94,92,91,91 }; const int n1w4b1r4[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 130,129,129,128,128,126,126,125,124,124,124,122,121,121,121,120, 120,119,119,116,114,114,114,114,112,112,111,110,109,107,107,103, 102,101,101,101,101,101,100,100,99,97,97,96,95,94,93,92,92,90 }; const int n1w4b1r5[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 132,132,132,131,129,127,127,125,125,123,122,121,120,118,116,116, 115,115,115,113,112,111,110,108,107,106,105,105,105,104,103,102, 102,101,99,99,99,98,97,96,96,95,94,93,93,93,92,92,91,90 }; const int n1w4b1r6[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 131,131,131,128,127,126,126,124,123,122,122,120,119,118,118,117, 117,116,115,115,114,114,113,112,111,110,110,109,107,107,107,106, 104,104,103,103,101,99,97,94,94,93,92,92,92,90,90,90,90,90 }; const int n1w4b1r7[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 132,130,130,130,130,130,128,128,127,126,126,124,124,122,121,120, 118,117,115,113,112,112,112,111,111,111,111,110,109,109,108,108, 105,105,105,101,100,99,99,98,96,95,94,94,94,93,92,92,92,90 }; const int n1w4b1r8[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 131,131,128,127,127,126,124,123,123,122,120,119,119,115,113,113, 112,112,112,111,110,109,109,108,105,105,103,102,102,102,102,101, 99,99,99,97,97,97,96,96,96,94,94,94,94,93,92,92,91,90 }; const int n1w4b1r9[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 132,130,130,128,125,124,123,121,121,121,120,119,117,116,116,115, 113,112,111,111,111,110,110,109,109,107,107,106,106,105,104,102, 102,101,101,100,99,98,97,96,96,95,95,94,92,92,92,91,91,90 }; const int n1w4b2r0[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 165,164,161,158,157,155,154,153,153,149,144,144,140,138,138,138, 137,134,133,133,131,128,124,120,119,117,117,115,112,111,107,107, 104,97,90,85,83,80,79,78,76,76,70,68,66,65,65,59,57,57 }; const int n1w4b2r1[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 163,156,155,154,152,151,150,149,146,137,136,128,126,125,122,122, 121,121,117,114,113,106,103,99,98,96,93,83,80,80,79,78,78,76, 74,71,70,69,68,68,68,67,67,67,64,59,59,59,59,58 }; const int n1w4b2r2[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 165,163,161,157,152,150,146,144,141,137,136,135,135,134,133,130, 122,120,118,117,116,112,111,108,105,104,100,97,96,95,94,91,89, 89,86,85,82,81,80,79,77,70,70,68,65,61,60,60,57,57 }; const int n1w4b2r3[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 165,164,164,159,155,155,155,150,146,141,138,138,137,135,131,130, 130,127,126,125,122,122,121,120,119,119,118,114,113,112,111,108, 104,104,100,97,96,89,83,79,76,75,75,73,70,67,65,64,62,60 }; const int n1w4b2r4[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 163,162,162,161,159,155,148,148,145,141,140,139,137,135,133,130, 130,123,122,122,120,117,117,115,113,113,111,111,111,109,105,105, 98,98,97,94,91,87,82,80,77,76,73,72,69,65,64,64,63,60 }; const int n1w4b2r5[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 165,165,164,163,162,156,155,154,153,152,152,149,148,143,140,137, 135,134,129,128,128,126,124,120,119,119,118,118,116,115,108,106, 105,101,98,97,97,96,94,89,85,82,79,77,76,75,67,65,64,58 }; const int n1w4b2r6[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 164,164,161,154,154,153,152,146,144,134,132,132,130,130,130,127, 125,124,123,123,120,119,116,115,114,111,110,109,108,105,105,103, 101,98,90,87,85,83,83,82,80,79,76,75,75,74,67,67,65,60 }; const int n1w4b2r7[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 162,159,157,150,148,145,136,136,135,133,133,132,128,126,126,125, 121,120,120,116,114,113,110,106,105,103,100,100,97,96,92,92,88, 83,78,78,75,75,75,75,73,65,65,65,64,64,58,57,57,57 }; const int n1w4b2r8[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 165,165,164,157,156,155,155,154,150,150,150,149,147,145,142,142, 139,137,137,136,134,131,127,126,124,122,121,116,115,112,111,109, 108,107,101,98,97,94,91,91,89,86,86,84,81,71,69,64,61,59 }; const int n1w4b2r9[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 163,158,156,154,153,153,148,142,131,130,128,126,125,119,117,117, 117,116,114,111,110,109,106,105,104,101,100,100,99,98,97,96,95, 93,89,86,86,81,80,78,78,78,75,72,72,71,65,65,59,58 }; const int n1w4b3r0[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 209,199,199,196,192,191,190,175,175,172,166,160,158,151,149,148, 140,135,134,126,121,113,113,103,94,94,93,87,84,82,77,69,67,64, 60,60,60,54,52,45,37,35,32,23,22,21,19,18,14,13 }; const int n1w4b3r1[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 209,204,184,183,179,170,169,167,167,166,163,163,160,157,152,150, 148,142,139,133,132,132,127,125,125,123,116,111,104,95,92,89, 86,79,76,74,70,65,62,60,45,43,37,30,29,29,25,22,15,13 }; const int n1w4b3r2[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 209,207,206,206,204,190,189,188,188,186,186,181,180,180,178,178, 177,175,171,157,156,153,138,136,135,134,133,128,123,98,98,97, 87,83,79,77,77,71,70,65,62,62,58,53,43,39,37,37,34,14 }; const int n1w4b3r3[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 204,195,192,192,190,188,184,178,176,170,157,155,148,146,138,135, 132,128,124,124,115,114,113,107,95,94,92,91,84,83,82,80,79,77, 76,76,75,69,68,64,60,59,58,52,50,38,33,22,19,15 }; const int n1w4b3r4[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 209,209,206,195,195,193,191,188,186,181,178,173,170,163,162,150, 133,131,129,127,126,125,124,117,113,109,101,98,93,89,86,85,77, 75,74,70,60,60,55,54,42,40,36,28,23,23,20,19,16,13 }; const int n1w4b3r5[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 206,203,201,197,196,184,177,176,174,174,173,168,164,162,161,160, 159,153,152,152,146,146,146,138,136,131,129,125,123,111,107,105, 103,93,79,79,79,73,70,61,59,55,52,44,37,33,32,31,26,18 }; const int n1w4b3r6[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 204,203,201,199,188,187,185,178,176,173,170,166,163,157,154,153, 145,143,131,131,126,124,124,121,118,114,107,103,95,91,86,85,81, 78,68,67,67,61,60,59,49,47,38,35,26,21,21,20,17,14 }; const int n1w4b3r7[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 208,204,203,202,202,197,185,182,177,173,166,164,157,157,150,146, 137,127,126,125,124,120,113,112,109,93,92,88,88,84,82,79,78,72, 71,55,44,43,42,40,36,35,33,32,28,25,25,24,17,14 }; const int n1w4b3r8[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 208,204,200,196,192,190,189,186,186,177,174,169,157,147,144,140, 132,129,129,128,127,126,124,117,115,113,108,106,105,105,104,104, 102,101,94,89,85,85,79,71,68,65,57,42,40,36,16,16,15,13 }; const int n1w4b3r9[] = { 1000, // Capacity 50, // Number of items // Size of items (sorted) 207,206,205,193,187,173,170,168,167,166,165,162,160,156,150,145, 145,143,139,138,135,132,128,125,124,117,114,114,112,111,108,103, 100,93,88,83,79,69,65,65,58,57,46,45,42,42,36,32,25,25 }; const int n2w1b1r0[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 393,390,390,389,386,382,381,381,381,380,379,379,377,375,372,370, 368,368,367,366,366,365,365,363,361,359,359,357,357,356,355,355, 355,353,352,352,347,347,346,344,344,341,337,336,334,334,333,333, 333,332,332,329,328,326,326,324,324,319,319,318,316,312,312,311, 310,309,307,306,305,305,301,300,299,298,298,296,296,294,292,290, 289,289,286,284,284,283,281,280,278,278,277,277,273,273,272,271, 269,268,268,267 }; const int n2w1b1r1[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 393,393,391,390,390,388,386,386,385,385,385,384,379,378,377,376, 375,374,373,372,368,367,367,366,366,365,364,364,362,362,361,358, 356,355,355,353,352,352,350,348,348,346,345,342,342,341,340,337, 337,336,335,332,332,332,331,328,327,326,324,322,322,320,320,319, 318,316,315,312,311,307,307,305,305,305,304,304,303,299,298,297, 296,296,295,291,291,291,288,287,283,282,282,282,280,278,277,276, 275,272,266,266 }; const int n2w1b1r2[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 396,394,393,393,393,392,392,387,387,385,384,384,382,382,381,378, 377,375,371,367,367,366,366,362,359,359,356,356,351,347,346,346, 346,346,345,341,341,341,340,339,339,336,334,334,332,330,326,325, 325,322,320,320,320,319,319,317,317,316,316,315,315,315,314,314, 312,312,310,310,306,306,306,303,300,299,298,298,295,295,295,292, 292,291,290,289,284,284,282,281,279,278,276,275,275,274,273,273, 271,270,270,268 }; const int n2w1b1r3[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 396,395,393,389,387,387,386,384,384,384,383,383,382,381,381,379, 377,376,376,376,375,371,371,370,367,364,363,360,359,359,358,357, 356,355,355,355,352,349,348,347,346,346,344,344,343,343,342,341, 338,336,335,335,332,332,328,325,325,324,321,321,318,318,312,312, 311,310,307,307,306,306,304,302,301,301,300,299,299,298,298,296, 295,294,293,293,292,289,289,288,284,283,282,280,280,279,277,277, 277,275,266,266 }; const int n2w1b1r4[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 394,390,390,389,388,384,383,381,380,380,380,378,377,377,377,376, 375,370,369,367,367,366,366,365,364,360,359,358,358,357,354,353, 353,353,352,351,349,347,346,346,345,345,343,343,340,339,338,334, 333,333,326,326,324,321,321,319,319,317,315,314,314,313,311,310, 308,307,306,305,303,302,302,301,301,300,299,299,296,295,292,292, 290,289,287,283,281,281,278,277,277,275,274,274,273,273,273,272, 272,267,267,266 }; const int n2w1b1r5[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 395,394,394,393,391,390,389,386,386,384,383,377,376,371,369,368, 367,367,366,365,362,362,361,360,359,359,359,355,353,350,350,349, 349,349,345,343,342,342,340,340,339,338,336,335,332,329,328,327, 327,327,323,321,320,316,315,312,312,311,311,310,310,309,308,306, 305,303,303,302,302,297,297,296,295,294,294,292,292,292,288,287, 287,287,284,282,282,282,282,282,281,278,278,277,273,272,272,270, 270,269,268,268 }; const int n2w1b1r6[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 396,396,394,394,393,389,388,387,387,387,386,386,385,383,383,381, 379,379,378,378,376,376,375,374,371,371,365,364,363,363,363,363, 361,358,357,355,354,353,350,349,349,348,346,346,346,345,344,343, 342,342,341,341,339,336,334,331,331,331,329,328,328,327,326,324, 321,318,316,316,314,311,310,307,305,303,299,297,297,290,290,287, 286,284,284,282,282,281,278,277,277,277,276,275,275,273,272,271, 271,267,267,266 }; const int n2w1b1r7[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 394,387,387,387,386,385,383,383,379,379,379,379,378,377,377,376, 375,375,374,374,373,372,367,366,364,364,360,357,356,355,355,353, 352,352,352,349,348,347,344,344,343,342,341,338,335,334,331,331, 331,330,328,327,326,325,325,325,325,325,325,324,324,323,323,322, 321,318,315,315,310,309,307,305,305,305,303,303,303,297,293,291, 291,291,291,290,289,289,287,282,282,281,280,280,277,276,275,274, 273,273,271,268 }; const int n2w1b1r8[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 396,395,394,394,393,389,387,387,387,385,385,384,383,380,379,378, 375,374,373,373,373,372,370,367,365,364,361,358,358,354,353,351, 348,347,347,347,344,344,343,343,342,342,342,341,341,340,340,338, 336,334,334,332,330,329,329,326,326,325,324,323,322,321,321,321, 319,317,316,312,311,310,310,310,309,306,306,305,301,300,300,298, 298,298,295,293,292,289,287,286,286,285,281,281,280,280,276,275, 274,274,274,271 }; const int n2w1b1r9[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 395,394,393,393,390,388,387,387,386,385,384,382,381,380,377,376, 375,373,370,369,367,367,367,363,362,361,360,358,358,357,356,356, 354,354,354,354,351,350,349,349,348,348,346,345,345,337,335,335, 334,333,332,329,329,328,328,325,325,322,322,321,321,320,320,317, 316,312,309,308,308,307,306,305,305,303,303,303,303,301,301,300, 297,294,294,287,285,284,282,281,281,280,278,277,276,275,274,273, 273,269,268,267 }; const int n2w1b2r0[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 494,493,490,488,477,474,470,465,462,449,449,448,447,447,444,442, 436,436,432,428,428,423,421,418,417,416,410,409,408,405,402,401, 401,400,399,395,395,394,388,387,387,380,378,378,372,372,364,364, 360,356,354,347,346,346,332,331,331,326,317,317,315,314,313,312, 308,305,303,301,299,295,294,292,291,288,288,283,282,279,278,275, 272,270,268,268,255,255,242,240,237,236,234,215,211,208,206,206, 203,196,191,167 }; const int n2w1b2r1[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 495,495,494,494,486,485,484,479,469,465,462,456,450,447,447,444, 441,437,436,423,419,414,410,410,405,404,400,396,395,389,388,387, 385,380,374,373,373,370,369,369,368,366,364,352,351,342,342,337, 335,333,331,326,325,319,317,313,303,294,293,293,292,292,285,284, 281,257,257,253,250,247,245,243,241,240,238,237,234,233,233,232, 229,228,224,223,222,205,202,198,196,192,190,189,183,182,182,181, 178,175,172,170 }; const int n2w1b2r2[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 493,489,486,476,470,468,460,457,455,451,450,449,447,447,445,445, 443,442,440,437,432,430,425,424,424,418,415,412,408,408,408,407, 404,404,402,400,394,389,389,388,386,384,380,379,373,373,373,367, 364,362,362,359,346,343,343,342,332,330,326,320,312,302,298,293, 284,283,281,278,276,273,273,272,271,266,259,255,255,245,243,242, 240,239,239,233,230,214,209,209,207,205,200,199,195,194,185,184, 181,179,177,175 }; const int n2w1b2r3[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 491,489,485,485,483,479,477,476,476,475,473,472,471,464,462,461, 459,456,454,453,449,446,443,439,438,437,417,415,415,410,408,404, 400,399,396,391,388,385,381,380,373,372,370,369,364,362,359,356, 355,354,353,352,348,345,343,333,330,329,326,323,320,310,307,307, 290,288,285,285,282,279,276,273,264,263,263,260,254,251,250,248, 246,233,232,231,218,214,205,201,198,196,195,195,195,192,185,184, 183,180,170,170 }; const int n2w1b2r4[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 493,489,488,486,482,480,470,467,449,444,443,432,430,425,423,415, 414,411,410,407,404,401,398,398,392,389,384,378,377,376,374,374, 373,370,369,368,366,366,361,354,346,342,341,338,332,328,328,327, 318,317,315,311,311,310,305,302,302,299,298,294,290,285,282,277, 274,272,269,268,260,257,256,254,253,252,252,251,241,236,234,231, 224,223,222,221,220,219,216,216,213,205,193,190,182,180,179,177, 176,172,169,167 }; const int n2w1b2r5[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 495,493,487,485,484,479,478,478,477,475,470,469,467,466,465,463, 461,458,457,456,455,454,453,452,450,446,436,429,425,422,414,409, 409,405,402,397,397,397,391,387,387,375,370,369,364,355,354,351, 338,337,335,331,329,319,309,307,299,294,293,293,292,291,290,290, 289,288,285,282,272,272,269,265,247,245,242,242,240,234,233,229, 229,229,226,221,217,217,212,209,206,201,201,194,194,191,186,183, 182,179,179,175 }; const int n2w1b2r6[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 495,487,487,485,484,484,481,477,471,467,466,466,463,462,458,449, 448,445,443,431,422,420,419,418,415,414,406,405,403,400,399,398, 396,392,392,386,385,377,376,375,374,373,372,371,370,370,370,369, 365,365,360,360,355,350,346,346,331,327,321,310,308,305,304,303, 299,293,291,290,286,276,271,270,266,264,261,261,260,260,256,254, 252,251,250,248,242,241,212,211,209,206,205,201,195,195,192,191, 191,189,174,167 }; const int n2w1b2r7[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 494,485,482,475,475,460,458,458,454,454,445,445,442,436,435,431, 424,424,422,413,412,411,409,408,405,403,400,398,392,392,380,380, 379,378,375,370,370,366,360,353,348,343,343,343,342,340,338,334, 333,329,328,326,314,312,309,297,297,294,293,290,287,285,280,275, 274,274,272,267,263,263,258,253,252,248,243,236,235,235,233,230, 229,229,228,227,226,225,211,209,204,200,196,190,189,188,186,178, 177,172,170,169 }; const int n2w1b2r8[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 494,493,491,485,480,478,473,472,462,459,458,457,452,452,446,443, 439,438,437,437,436,429,425,422,421,416,415,415,410,408,407,406, 399,394,391,391,388,386,385,383,373,373,372,361,361,357,353,346, 344,342,340,327,325,325,320,319,313,308,307,305,303,298,294,290, 287,283,283,280,280,278,277,275,273,273,267,267,265,262,258,253, 248,243,243,242,240,232,232,228,223,211,209,207,198,197,192,192, 191,176,172,171 }; const int n2w1b2r9[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 494,491,483,473,472,465,464,461,461,460,457,453,445,444,443,442, 442,438,435,424,421,421,412,409,406,405,402,395,395,391,391,389, 389,380,378,375,374,371,369,366,361,360,360,357,353,349,348,346, 343,341,338,336,335,334,330,326,316,310,308,307,302,298,288,287, 283,281,272,263,262,259,255,248,247,243,234,230,229,229,228,226, 223,222,221,218,214,205,203,196,195,192,189,187,183,182,180,176, 175,175,173,173 }; const int n2w1b3r0[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 617,617,610,608,606,604,600,597,588,585,584,578,568,564,555,552, 533,531,531,521,506,500,494,486,485,476,475,474,471,468,462,450, 446,445,440,419,418,409,407,401,398,394,393,387,372,370,367,361, 360,351,345,339,319,316,313,304,299,297,294,279,275,275,258,257, 252,251,247,246,246,223,220,215,213,213,212,207,206,200,191,181, 174,166,163,160,156,149,144,144,133,131,131,114,84,77,75,60,57, 54,44,35 }; const int n2w1b3r1[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 618,608,597,594,578,573,572,568,567,567,564,550,545,542,540,539, 536,535,525,511,510,505,504,496,485,478,475,473,457,451,445,441, 436,436,430,429,416,411,406,401,385,380,350,347,341,337,321,311, 308,304,303,297,290,288,285,285,279,275,268,260,249,248,244,234, 230,222,215,195,185,185,182,179,179,175,166,164,153,146,137,129, 116,113,112,106,99,98,97,91,90,89,83,68,64,64,62,56,55,49,47, 45 }; const int n2w1b3r2[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 618,617,614,614,610,609,601,589,588,586,586,583,575,568,563,560, 552,548,547,535,527,520,519,514,511,511,509,509,505,502,491,481, 474,471,459,446,443,425,416,413,403,398,397,396,396,392,387,386, 382,367,359,352,332,331,322,321,311,306,289,281,264,256,255,244, 243,241,219,215,214,206,204,199,196,194,192,187,183,183,183,179, 177,176,175,173,173,169,160,154,126,94,87,86,81,72,65,63,54,47, 41,36 }; const int n2w1b3r3[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 618,611,604,602,594,588,583,583,582,582,573,554,538,536,534,521, 505,500,499,494,493,492,477,475,470,448,445,442,432,430,429,429, 420,412,408,408,404,401,393,389,388,374,369,363,362,359,354,340, 327,326,325,318,317,308,304,291,286,275,268,267,264,263,249,212, 207,200,200,200,197,192,182,182,178,177,177,172,168,164,159,153, 150,138,134,132,127,116,109,92,87,83,77,75,67,60,59,51,47,45, 37,36 }; const int n2w1b3r4[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 623,610,595,582,582,581,574,568,565,564,563,555,553,545,539,537, 534,534,523,516,513,509,506,504,502,489,474,471,468,468,465,463, 461,460,457,437,437,429,419,411,399,396,391,384,384,375,358,356, 344,342,322,308,306,305,303,294,294,288,284,266,264,252,251,237, 235,234,232,222,206,193,190,189,189,187,184,183,171,171,154,148, 138,135,134,134,124,123,122,120,116,93,87,65,54,52,52,51,48,41, 41,36 }; const int n2w1b3r5[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 621,620,617,607,602,591,589,586,585,581,579,569,561,558,555,554, 546,544,539,539,526,503,502,498,489,471,456,451,450,443,438,436, 434,425,424,424,420,420,418,408,405,404,377,371,361,359,346,340, 331,321,320,313,310,308,299,286,281,274,270,269,264,262,262,254, 250,215,214,208,205,200,193,183,177,171,163,162,158,156,154,146, 146,136,124,118,115,109,105,101,101,94,92,88,86,79,76,74,73,73, 67,66 }; const int n2w1b3r6[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 625,622,620,609,604,601,597,582,582,574,572,570,544,542,537,537, 535,530,523,507,485,483,480,456,447,447,444,439,429,426,425,414, 412,406,406,401,397,394,378,367,364,360,341,327,324,321,314,307, 297,291,289,272,270,267,263,236,231,230,227,227,226,225,219,215, 215,212,211,205,178,176,170,149,145,139,138,138,135,129,122,115, 114,108,108,105,87,86,85,83,81,69,68,67,58,56,55,51,45,41,40, 37 }; const int n2w1b3r7[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 626,617,608,606,606,602,586,579,573,567,551,548,514,514,510,492, 492,491,471,469,465,443,441,440,436,431,430,427,422,410,393,392, 392,379,377,376,360,343,341,339,330,323,322,321,314,313,307,304, 299,298,296,294,291,278,277,276,273,269,239,228,226,222,216,214, 211,192,191,181,176,166,166,164,161,155,148,135,133,131,130,125, 120,117,106,101,101,100,98,98,94,92,91,76,66,61,56,55,52,47,47, 35 }; const int n2w1b3r8[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 626,611,609,604,598,592,586,584,578,576,574,568,557,553,549,541, 541,533,533,529,527,525,524,517,514,511,507,504,499,496,492,488, 477,476,471,459,456,442,436,425,421,419,401,388,386,362,358,354, 352,345,322,322,317,298,293,280,262,261,258,249,247,241,238,233, 219,209,205,204,203,190,186,177,174,174,164,163,154,153,153,133, 133,126,122,121,120,119,119,113,110,101,97,90,70,68,66,59,52, 45,39,37 }; const int n2w1b3r9[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 624,606,606,598,598,577,563,557,536,520,514,495,494,487,487,487, 485,477,471,467,449,447,437,436,421,413,413,412,400,393,392,391, 382,377,366,356,350,345,343,340,331,331,330,328,320,320,296,294, 292,286,277,273,271,260,254,250,245,227,226,221,219,215,203,197, 196,166,165,157,156,153,151,147,144,144,133,127,127,126,125,125, 123,122,121,119,117,104,96,84,77,76,73,65,57,55,51,48,42,38,37, 35 }; const int n2w2b1r0[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 240,239,238,235,232,231,231,231,231,230,229,228,228,228,227,226, 222,219,218,217,217,217,217,217,216,216,214,214,213,212,212,211, 210,209,208,208,208,206,206,206,206,205,205,204,204,203,200,199, 199,199,198,198,197,197,196,195,193,193,193,193,191,191,188,188, 188,187,186,186,183,183,182,181,179,178,177,177,177,177,176,176, 176,175,175,175,172,172,171,170,170,169,168,168,167,167,166,166, 164,163,163,162 }; const int n2w2b1r1[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 239,237,237,235,234,234,234,233,232,232,231,229,229,227,226,226, 225,224,224,223,222,222,222,220,220,219,215,212,212,207,206,205, 205,205,204,204,203,203,202,201,201,201,201,200,200,199,198,198, 197,195,195,195,194,193,192,191,191,191,190,189,189,189,188,187, 187,186,186,185,185,183,183,182,182,182,181,180,180,180,180,179, 178,177,177,174,173,173,173,173,170,170,169,168,168,167,167,166, 163,163,162,162 }; const int n2w2b1r2[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 240,240,238,237,237,235,235,234,234,233,233,233,233,232,232,231, 230,230,229,229,228,228,228,227,225,225,222,222,222,222,220,219, 218,216,214,213,213,213,213,212,211,211,210,210,210,208,207,207, 207,205,204,204,203,202,202,200,200,199,199,197,197,197,196,195, 195,194,192,191,188,187,186,185,183,182,181,180,180,177,177,176, 174,174,174,174,173,172,171,168,166,166,165,163,163,162,162,162, 162,162,162,162 }; const int n2w2b1r3[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 239,238,237,237,236,236,236,235,235,234,234,232,232,231,230,230, 230,230,229,228,228,227,227,226,226,223,221,220,220,219,217,217, 216,213,212,212,211,211,208,207,207,207,204,204,204,203,203,203, 200,200,198,198,197,197,195,195,195,194,193,193,193,192,187,186, 186,185,185,185,183,183,183,183,183,182,182,182,182,180,180,180, 179,179,177,176,174,174,173,172,170,170,169,169,168,166,166,165, 165,164,163,162 }; const int n2w2b1r4[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 240,240,240,239,238,236,236,235,234,233,231,230,229,229,228,228, 227,227,224,224,224,223,222,221,219,219,219,219,217,217,216,216, 215,214,214,214,214,212,212,211,210,209,209,209,208,208,207,207, 207,206,206,206,205,205,205,205,204,202,202,198,197,197,195,195, 195,194,193,192,189,185,185,185,182,181,180,179,178,175,175,175, 175,172,171,170,169,168,168,168,167,167,167,167,167,166,166,165, 164,164,163,162 }; const int n2w2b1r5[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 239,238,237,237,236,236,235,235,234,234,234,234,233,233,233,232, 232,231,230,230,229,228,228,228,227,226,225,225,223,223,222,221, 221,221,218,216,216,216,215,213,213,212,212,211,211,209,207,207, 207,206,206,206,206,206,204,203,201,201,200,199,199,198,198,197, 197,195,195,192,192,192,191,190,189,188,185,185,184,184,183,183, 182,180,179,178,177,177,172,171,171,170,168,168,166,166,166,166, 163,163,162,162 }; const int n2w2b1r6[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 238,236,236,236,235,235,234,233,233,232,231,231,231,231,230,230, 230,229,229,228,228,227,227,227,225,224,224,224,224,223,221,221, 218,216,215,215,215,214,214,213,213,213,211,210,208,207,207,206, 205,204,203,200,200,199,198,197,195,195,195,193,192,191,191,190, 190,189,188,188,185,185,184,183,183,183,182,181,181,181,180,179, 179,177,176,174,172,172,172,171,170,170,169,168,168,168,166,163, 163,163,163,162 }; const int n2w2b1r7[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 240,240,239,237,235,235,235,235,235,232,231,230,230,229,228,228, 227,226,225,223,222,220,219,219,219,218,217,217,216,216,216,216, 216,215,215,215,214,214,214,213,212,211,211,210,210,209,208,208, 208,207,206,203,202,202,201,200,198,196,196,194,194,193,189,189, 188,188,187,186,185,184,184,182,182,182,180,178,178,177,176,176, 173,172,171,171,171,171,171,170,170,170,169,168,168,167,166,165, 165,165,163,162 }; const int n2w2b1r8[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 240,240,240,239,239,239,239,238,238,238,237,236,233,232,231,230, 230,230,228,223,222,219,219,218,218,218,217,217,216,214,214,213, 212,212,211,211,210,210,209,208,208,208,207,207,206,206,206,204, 203,203,203,203,203,202,201,201,200,200,200,200,199,199,199,198, 196,196,196,194,194,191,189,188,188,188,188,187,185,185,185,183, 182,182,181,179,179,178,177,176,176,175,175,172,172,168,167,166, 163,163,163,163 }; const int n2w2b1r9[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 236,234,233,232,232,231,230,230,230,229,228,226,226,225,225,222, 222,221,220,220,219,219,217,217,217,215,215,214,214,213,212,211, 211,209,208,208,208,208,207,207,206,206,206,205,205,204,204,201, 201,201,201,201,200,200,198,197,197,196,195,195,194,194,194,194, 194,193,192,192,189,188,188,188,187,187,183,182,181,180,179,177, 175,175,174,172,171,171,171,169,169,169,169,169,167,167,165,164, 163,163,163,162 }; const int n2w2b2r0[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 299,298,295,293,293,291,290,289,288,288,282,282,281,281,280,280, 279,279,278,275,274,271,271,270,267,267,263,260,258,256,256,256, 249,247,247,246,245,239,239,239,236,236,232,230,222,218,215,214, 213,213,213,210,206,204,202,202,201,191,190,189,189,187,187,181, 181,179,170,169,168,166,166,161,158,151,149,148,146,145,142,139, 137,135,132,130,128,127,123,123,121,120,118,109,107,107,105,105, 104,104,102,102 }; const int n2w2b2r1[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 296,295,295,294,291,290,288,288,287,286,283,282,280,279,279,278, 277,275,273,269,266,262,261,254,251,250,248,248,246,246,245,244, 244,239,238,234,233,233,232,231,229,229,216,214,211,211,210,198, 196,195,195,194,192,192,191,191,190,188,187,187,185,184,180,177, 172,172,172,171,167,167,166,165,160,160,158,155,148,146,145,143, 140,140,131,131,128,126,123,122,121,121,117,117,113,111,108,107, 106,106,103,103 }; const int n2w2b2r2[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 300,299,295,293,292,289,286,285,285,285,284,284,281,278,275,273, 271,270,269,265,263,263,262,261,260,257,257,255,251,247,238,237, 236,235,233,233,232,232,231,223,221,218,214,211,209,208,207,207, 205,204,203,201,198,195,193,192,190,187,182,175,175,175,175,174, 174,172,169,168,167,166,159,157,156,152,151,150,148,148,146,145, 144,143,142,141,139,136,136,133,132,126,125,122,121,119,118,116, 110,106,105,102 }; const int n2w2b2r3[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 300,300,298,295,292,290,289,287,287,286,286,286,284,283,278,273, 271,269,269,269,268,268,267,262,258,256,256,255,255,255,254,252, 251,249,248,246,245,244,242,238,237,237,236,227,227,226,224,224, 223,222,214,212,208,206,206,205,202,202,202,200,200,199,197,195, 195,192,192,189,185,179,178,178,171,171,167,165,162,161,158,152, 149,146,143,143,139,136,136,131,127,126,126,124,121,118,114,113, 106,105,102,102 }; const int n2w2b2r4[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 300,298,297,294,292,290,287,287,286,283,282,281,280,280,275,273, 270,269,269,268,267,266,265,265,265,264,262,262,262,261,255,254, 253,252,252,250,246,245,238,238,237,236,236,232,231,231,230,229, 228,228,228,227,224,223,220,217,216,216,215,214,213,211,203,203, 201,199,198,198,197,197,195,187,185,181,178,171,170,165,165,162, 160,158,150,147,139,135,131,131,129,128,127,126,118,117,115,107, 107,107,106,105 }; const int n2w2b2r5[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 297,296,293,292,290,290,286,281,279,278,276,274,273,271,267,265, 261,260,260,259,259,259,258,255,246,245,243,242,242,239,236,236, 234,234,226,224,221,221,219,219,219,211,210,209,208,208,204,203, 203,202,202,202,201,200,199,198,196,191,188,188,177,176,173,172, 172,172,171,171,162,162,160,157,153,150,148,148,145,141,139,137, 137,134,134,132,130,128,126,125,119,117,116,115,114,114,109,108, 106,105,104,102 }; const int n2w2b2r6[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 300,299,298,295,293,292,291,289,285,280,279,279,277,275,271,269, 265,263,260,259,259,256,251,248,248,247,246,245,243,242,240,239, 239,239,233,233,232,232,230,229,225,221,220,219,219,217,216,215, 214,213,212,206,206,195,195,193,189,189,189,188,187,186,181,177, 174,171,170,169,168,168,166,166,165,165,150,149,148,148,148,147, 146,144,142,141,140,139,139,137,134,131,130,128,126,126,120,117, 113,106,104,103 }; const int n2w2b2r7[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 300,297,296,290,289,288,286,285,282,281,278,275,275,272,267,265, 262,259,255,252,251,249,244,243,239,237,237,236,236,232,231,230, 230,229,224,223,222,222,220,219,218,215,214,213,206,204,204,201, 196,195,193,191,187,187,184,184,181,180,172,171,164,163,162,161, 161,160,155,155,149,149,145,142,142,141,141,140,139,137,136,135, 132,131,127,127,123,121,119,119,119,117,116,116,115,113,108,108, 106,105,103,103 }; const int n2w2b2r8[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 299,299,299,297,294,288,285,279,277,277,276,275,274,273,272,271, 271,269,266,262,260,260,257,255,254,254,253,252,252,245,244,243, 241,240,235,235,233,230,229,228,228,226,226,225,224,223,223,219, 219,218,214,211,206,199,198,197,196,191,186,183,183,183,180,179, 179,177,176,174,174,173,172,163,159,158,153,147,146,146,146,145, 145,141,139,131,131,128,125,123,123,123,122,120,119,117,114,114, 114,106,104,104 }; const int n2w2b2r9[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 298,296,291,289,287,287,281,279,279,277,276,275,274,273,272,271, 267,265,262,258,257,255,254,253,251,250,244,243,242,235,233,232, 232,230,229,224,221,220,220,218,216,214,211,207,206,202,201,200, 199,199,192,190,190,188,187,187,185,184,183,182,182,180,180,179, 174,173,171,168,167,166,163,161,161,160,158,157,148,148,147,147, 143,140,134,133,132,131,127,124,120,119,117,116,114,113,111,109, 108,106,106,103 }; const int n2w2b3r0[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 379,379,367,366,363,358,358,355,352,345,343,337,335,329,329,325, 324,320,317,317,311,303,296,294,292,288,280,277,268,268,267,264, 261,259,256,255,254,247,247,244,236,235,234,231,230,228,224,217, 216,212,208,207,207,204,191,190,189,186,182,180,173,173,164,159, 157,154,152,150,141,138,136,130,119,116,105,103,100,98,88,87, 86,86,85,65,63,63,60,57,57,57,53,52,50,29,25,24,24,23,22,22 }; const int n2w2b3r1[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 373,368,368,367,365,360,352,335,335,332,324,321,321,320,316,304, 304,303,299,298,294,292,288,286,284,273,273,273,266,266,263,262, 262,259,258,256,255,249,245,237,230,227,221,220,216,208,206,206, 202,189,188,185,184,180,179,178,176,173,167,158,154,148,148,147, 145,139,135,132,130,124,122,122,116,114,111,111,111,104,98,89, 84,79,72,70,63,61,60,59,55,54,50,44,44,41,39,32,31,30,26,25 }; const int n2w2b3r2[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 375,373,369,367,366,363,362,360,360,359,356,346,345,342,339,334, 334,333,332,331,328,328,327,326,322,320,311,305,291,291,289,288, 277,275,270,262,250,231,228,228,225,218,217,216,213,210,207,205, 204,201,201,200,193,187,173,171,170,166,165,162,161,160,155,155, 154,152,150,148,145,143,135,134,134,132,130,124,123,123,108,105, 104,99,97,93,91,86,85,79,75,61,57,56,51,49,41,40,40,30,30,22 }; const int n2w2b3r3[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 378,377,360,355,354,342,331,331,330,327,323,323,320,320,313,311, 301,296,295,293,292,286,283,277,276,271,265,264,253,252,233,233, 232,232,229,224,221,217,217,212,211,211,207,205,205,203,198,198, 197,194,192,191,190,186,178,165,164,163,156,155,152,148,148,147, 143,142,134,133,132,130,124,115,113,107,103,91,85,80,79,78,77, 68,62,60,60,59,56,55,52,43,42,39,34,33,32,32,32,31,27,26 }; const int n2w2b3r4[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 380,380,379,376,372,366,363,356,351,351,350,348,348,347,347,339, 338,337,332,331,331,329,328,322,322,312,307,305,295,290,287,279, 278,269,269,268,267,263,263,255,250,249,249,244,240,240,236,235, 229,223,223,217,189,183,182,169,157,154,153,148,146,144,142,129, 128,122,121,117,109,105,102,101,100,96,96,87,87,85,82,81,80,79, 78,77,73,72,70,66,65,65,63,54,52,39,38,35,34,32,31,23 }; const int n2w2b3r5[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 376,374,373,360,358,351,348,345,344,343,332,328,327,327,323,317, 317,315,313,308,307,305,297,297,291,289,285,284,277,276,263,262, 261,261,258,258,256,251,244,242,241,235,235,235,235,234,230,227, 226,225,222,218,218,208,203,202,184,178,177,176,169,165,161,159, 154,142,137,134,133,132,127,125,123,123,121,116,111,109,109,103, 102,93,81,79,75,71,71,57,57,50,46,45,38,37,28,27,27,22,22,22 }; const int n2w2b3r6[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 378,377,374,373,369,369,366,353,351,338,337,337,337,334,330,330, 323,322,320,319,317,313,306,305,298,297,295,287,283,276,276,268, 267,267,265,262,257,257,248,247,240,237,236,233,231,217,201,195, 193,187,184,171,170,166,163,161,159,158,158,157,141,139,138,137, 126,122,119,116,115,112,106,104,102,101,100,98,98,91,86,84,82, 82,78,73,62,61,60,60,58,58,55,52,48,48,41,40,38,36,31,26 }; const int n2w2b3r7[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 372,372,371,371,367,366,365,365,365,364,363,360,352,350,350,350, 348,345,333,331,317,315,310,310,308,306,305,304,304,299,295,292, 286,279,277,263,262,262,258,248,241,235,235,231,229,222,208,207, 204,203,202,200,196,195,195,195,192,191,186,184,170,168,165,163, 162,157,150,139,135,127,126,125,124,124,123,120,117,117,116,109, 106,95,82,81,79,76,68,59,58,56,54,53,51,51,40,37,32,25,23,22 }; const int n2w2b3r8[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 371,365,363,354,352,351,346,345,345,339,338,338,334,332,329,327, 322,321,319,314,305,302,299,296,294,288,285,284,282,281,277,276, 269,268,262,257,252,250,250,248,245,243,236,234,232,230,229,224, 220,214,211,209,206,198,195,192,188,177,171,163,158,157,157,147, 142,140,124,118,111,111,111,111,102,93,88,87,86,82,82,80,78,78, 76,75,72,69,65,63,54,51,50,49,43,41,39,36,29,29,27,25 }; const int n2w2b3r9[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 378,377,374,373,367,365,363,357,353,348,338,336,331,322,313,308, 307,306,304,299,299,298,291,291,283,283,281,279,277,272,270,270, 269,263,260,257,251,247,246,243,239,238,237,228,227,208,202,197, 191,186,186,180,177,176,174,171,170,170,164,151,149,146,146,146, 145,143,140,139,137,116,116,115,114,113,110,102,100,99,91,87, 85,82,81,81,80,73,72,69,55,53,49,47,46,44,43,39,36,34,28,23 }; const int n2w3b1r0[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 168,168,168,167,167,167,166,166,165,165,165,165,164,164,164,164, 164,163,163,163,162,161,160,159,159,159,157,157,155,154,154,154, 154,153,153,153,151,150,149,149,149,148,148,147,147,147,147,146, 145,145,145,144,143,143,142,142,142,141,139,138,137,136,135,135, 133,133,133,133,132,131,130,130,129,129,129,128,128,128,127,127, 126,125,125,124,124,122,122,121,121,121,120,120,119,119,119,118, 118,118,115,115 }; const int n2w3b1r1[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 168,168,167,166,165,165,165,165,164,164,163,163,163,163,163,163, 163,162,162,162,162,162,162,161,161,159,157,157,157,157,156,156, 155,155,153,153,153,152,151,151,150,150,149,149,149,147,147,147, 147,146,145,144,144,143,142,142,142,141,139,138,134,133,133,133, 132,132,131,130,129,128,128,128,128,127,127,127,127,127,125,125, 124,123,123,123,121,119,119,119,118,117,117,117,117,117,117,116, 116,115,115,114 }; const int n2w3b1r2[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 168,168,167,167,167,167,167,166,166,165,165,165,164,163,163,162, 160,160,160,159,159,159,158,158,158,158,158,158,157,157,156,156, 155,155,154,154,154,154,154,154,154,153,153,152,151,150,150,149, 148,148,148,147,145,144,144,143,142,142,141,140,139,138,138,138, 137,136,136,136,136,136,135,135,135,134,132,131,131,129,126,126, 126,126,125,124,124,123,122,122,121,120,120,119,119,118,117,117, 116,116,114,114 }; const int n2w3b1r3[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 166,166,166,166,165,164,164,164,163,163,162,162,162,161,160,159, 159,159,158,158,157,156,156,152,151,150,149,149,149,147,147,146, 145,145,144,144,144,142,142,141,141,141,141,140,140,140,139,138, 138,137,137,137,137,135,135,134,133,133,133,133,132,132,132,131, 131,131,130,130,130,130,130,130,129,129,129,128,128,126,126,125, 125,124,123,123,121,120,120,120,119,119,119,118,117,117,117,117, 115,115,115,114 }; const int n2w3b1r4[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 168,168,167,166,166,166,165,165,164,164,164,163,163,163,162,162, 161,160,160,159,158,158,158,157,156,156,156,155,155,152,152,152, 151,151,149,148,148,148,148,147,147,145,145,145,144,143,143,143, 143,143,143,140,140,139,138,138,137,137,136,136,136,135,134,133, 132,132,132,132,131,131,131,130,130,130,130,130,129,127,126,124, 124,124,122,122,122,122,121,121,121,121,120,120,119,118,117,117, 116,116,115,114 }; const int n2w3b1r5[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 167,167,166,166,165,165,165,165,165,164,164,164,162,161,160,160, 160,160,159,158,158,157,157,157,155,154,153,153,152,152,152,151, 151,151,150,150,150,149,148,147,145,145,144,144,143,143,143,143, 140,140,140,140,140,139,139,137,137,137,136,135,134,134,133,133, 132,132,131,129,129,128,127,127,127,126,125,125,123,123,123,123, 122,122,122,120,120,119,119,119,118,117,117,117,116,116,115,115, 115,115,115,115 }; const int n2w3b1r6[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 167,167,166,166,164,164,164,163,162,162,162,162,162,161,161,160, 159,159,158,158,158,158,157,157,154,154,154,153,153,153,153,152, 152,151,151,151,151,151,151,151,150,150,149,148,148,147,147,146, 145,144,143,143,143,143,143,143,142,141,141,139,139,137,136,136, 135,135,135,133,133,132,132,131,130,128,128,128,127,127,126,125, 125,124,124,123,123,122,121,121,121,120,120,120,120,119,119,118, 118,117,116,115 }; const int n2w3b1r7[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 168,168,167,167,167,166,166,165,165,164,164,164,163,163,163,163, 163,160,159,159,159,158,158,158,158,158,158,156,156,155,155,154, 154,153,152,150,149,148,147,145,145,144,144,144,143,143,142,138, 138,138,138,137,137,136,134,134,133,133,132,132,131,131,130,130, 130,129,129,128,128,125,125,124,123,123,123,123,122,122,122,122, 121,121,121,120,120,120,119,119,118,118,118,117,115,115,115,115, 114,114,114,114 }; const int n2w3b1r8[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 168,168,167,167,167,166,166,165,165,164,164,164,163,163,162,162, 161,161,160,159,158,158,157,156,156,155,155,155,154,154,154,154, 153,153,152,152,151,150,149,148,148,147,147,146,145,144,144,144, 143,143,143,138,136,135,135,134,133,132,132,131,129,129,129,129, 128,127,126,126,126,126,126,125,125,124,124,124,123,123,122,121, 121,120,120,120,119,119,119,118,117,117,117,116,116,115,115,115, 115,114,114,114 }; const int n2w3b1r9[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 168,168,166,165,165,165,165,165,165,165,165,164,163,163,162,162, 162,162,161,160,160,159,159,159,157,157,157,156,156,156,155,154, 154,153,153,153,150,150,150,150,148,147,146,146,146,145,145,144, 143,143,143,143,142,141,141,141,140,140,139,138,137,136,135,135, 135,135,135,133,133,132,131,131,130,130,130,130,129,128,128,128, 127,127,125,124,124,124,124,123,121,121,120,120,120,119,119,118, 117,117,115,114 }; const int n2w3b2r0[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 209,207,205,204,202,199,199,199,196,194,194,194,193,190,188,186, 184,183,182,182,179,178,178,178,176,176,176,173,173,172,169,167, 167,167,164,163,163,162,160,160,156,156,156,154,152,150,146,145, 145,145,142,141,139,139,136,136,135,134,133,133,129,127,127,127, 126,123,122,120,119,117,113,113,112,112,108,106,104,97,96,95, 95,95,94,94,90,90,90,87,87,85,84,83,82,80,79,77,77,75,74,73 }; const int n2w3b2r1[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 210,209,209,208,207,206,205,203,201,200,197,192,192,192,191,191, 190,189,187,185,184,183,182,182,181,177,175,170,168,166,166,165, 162,162,159,156,154,152,151,151,151,150,149,148,147,145,145,145, 144,143,142,137,137,136,136,133,133,131,128,127,125,124,115,114, 113,112,112,108,107,106,105,105,104,104,102,101,99,97,96,95,95, 95,89,89,89,88,87,86,85,84,84,83,81,80,77,77,77,76,72,72 }; const int n2w3b2r2[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 210,210,208,207,203,201,200,199,199,197,196,195,193,192,192,190, 189,188,188,187,187,186,185,185,182,182,181,180,180,179,177,171, 170,169,168,166,166,165,165,164,164,161,159,153,151,150,150,149, 147,147,145,144,142,142,141,139,138,136,136,133,133,130,129,129, 125,122,122,121,120,119,119,118,118,115,114,110,108,108,107,105, 105,105,102,102,92,92,87,85,83,80,79,78,77,77,76,76,74,72,72, 72 }; const int n2w3b2r3[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 210,208,206,200,199,198,198,197,195,195,194,193,190,186,186,186, 182,181,181,180,178,175,175,173,173,172,170,169,168,168,167,166, 165,164,164,163,159,159,156,152,149,149,148,145,143,143,143,142, 141,141,141,140,139,139,138,136,135,135,132,131,130,128,126,126, 125,125,123,123,123,122,120,120,115,115,114,111,108,108,108,103, 100,99,98,98,96,96,92,91,90,87,86,85,85,84,83,82,80,76,75,74 }; const int n2w3b2r4[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 207,202,199,199,198,197,194,192,191,188,186,185,185,184,184,182, 181,181,180,178,176,174,173,173,171,168,168,168,167,166,164,164, 163,163,162,159,158,157,155,154,154,153,153,153,151,150,150,148, 148,143,143,142,142,141,138,138,137,137,134,133,131,131,126,125, 125,123,121,120,119,118,118,113,111,110,109,108,107,107,106,103, 99,98,98,95,95,92,91,91,89,88,88,88,87,84,81,77,77,74,74,72 }; const int n2w3b2r5[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 209,208,206,206,204,202,200,200,200,195,194,193,193,192,191,189, 188,188,187,186,185,185,184,184,178,177,176,169,167,164,164,162, 160,152,152,151,151,149,148,148,147,142,139,137,136,135,135,134, 132,131,128,127,126,119,119,119,113,113,111,110,109,109,108,107, 107,107,106,106,105,105,104,104,104,103,102,102,101,101,98,97, 97,97,97,96,95,95,95,94,89,86,85,83,82,82,79,78,75,74,73,72 }; const int n2w3b2r6[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 210,206,205,204,203,202,202,202,200,199,198,192,189,186,185,183, 183,183,182,181,176,176,175,175,174,170,170,170,170,168,162,161, 159,156,152,149,149,148,146,146,146,145,144,144,144,141,141,141, 141,139,138,135,135,135,135,134,134,133,127,127,126,126,125,124, 119,119,119,116,115,115,108,107,103,98,97,96,94,94,93,91,90,89, 89,89,89,87,86,86,84,83,82,82,82,81,80,78,77,74,73,72 }; const int n2w3b2r7[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 210,209,209,206,206,204,203,202,202,199,199,197,196,195,195,194, 193,192,191,191,190,190,186,185,185,184,180,171,171,170,168,167, 166,166,165,163,163,162,161,161,160,160,159,158,158,157,156,156, 153,151,150,150,148,147,147,145,141,140,137,136,136,132,129,128, 128,127,127,122,121,118,111,110,109,106,106,102,102,98,98,95, 95,95,95,93,90,90,90,89,83,82,81,79,78,78,76,75,74,73,73,72 }; const int n2w3b2r8[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 210,209,207,202,199,196,196,195,194,193,190,188,187,187,185,185, 184,184,182,179,178,178,178,176,171,169,169,168,168,167,167,165, 164,159,158,158,154,152,151,150,148,147,142,142,142,140,140,139, 138,137,136,136,134,125,125,123,123,121,121,120,120,118,118,117, 117,116,114,114,112,111,111,108,108,107,106,104,102,102,102,97, 97,96,94,94,94,92,88,84,84,83,81,81,80,80,78,76,76,76,74,73 }; const int n2w3b2r9[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 207,205,204,203,203,200,199,198,196,196,196,195,195,195,192,190, 189,188,188,187,187,185,180,179,176,175,172,171,170,170,169,168, 168,165,164,164,163,163,161,160,158,155,154,153,152,150,150,149, 149,148,148,143,139,137,136,136,134,134,132,132,131,129,127,127, 127,125,120,120,117,117,116,116,113,112,109,107,105,103,99,99, 97,95,95,95,95,95,93,91,86,84,82,81,80,79,77,77,77,76,74,72 }; const int n2w3b3r0[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 265,263,256,254,253,251,250,249,247,247,246,243,239,238,238,233, 225,225,224,223,219,216,211,210,208,207,206,204,204,202,202,201, 192,191,188,171,166,166,160,157,156,155,154,153,153,149,146,146, 145,144,139,138,130,127,125,124,123,117,115,112,112,104,101,101, 100,99,99,97,89,87,85,85,81,80,78,75,74,70,70,70,69,67,67,60, 57,53,52,48,46,46,45,39,33,33,29,29,24,22,21,18 }; const int n2w3b3r1[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 260,256,255,253,249,248,245,243,238,234,233,232,229,229,218,213, 206,205,196,194,187,187,184,181,178,177,176,175,170,170,162,162, 160,159,156,151,149,141,136,135,135,134,134,133,129,124,123,119, 116,116,114,113,112,110,105,102,101,99,98,95,95,93,93,83,82,81, 78,77,73,73,72,70,70,69,68,67,65,64,62,58,54,53,53,50,48,47,43, 43,43,42,42,41,36,33,24,21,20,19,19,18 }; const int n2w3b3r2[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 261,259,256,256,250,249,244,237,235,233,230,228,225,224,223,222, 219,218,215,213,209,206,205,204,200,197,195,188,188,186,183,180, 180,176,176,172,165,164,161,161,154,148,146,143,139,138,137,135, 134,134,128,126,126,122,121,120,117,114,112,109,108,107,106,104, 99,99,97,97,92,91,90,88,87,86,84,83,83,82,78,74,71,66,64,61,57, 54,51,47,45,44,42,33,32,28,27,26,26,19,16,16 }; const int n2w3b3r3[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 265,264,263,261,254,248,247,246,245,241,233,229,228,227,224,223, 220,219,218,216,215,212,209,205,198,194,186,180,180,180,177,169, 166,165,161,160,159,158,157,156,155,154,152,152,151,148,139,137, 135,127,125,125,120,112,111,111,109,109,107,106,101,101,98,97, 95,95,95,92,91,90,89,86,84,83,82,80,78,77,77,75,75,74,69,68,68, 63,58,52,52,52,47,40,33,31,28,27,23,19,17,16 }; const int n2w3b3r4[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 266,265,263,262,257,256,250,249,248,244,243,240,240,239,239,238, 238,237,237,236,235,233,227,227,227,222,220,215,211,210,208,202, 200,199,193,188,188,186,185,172,171,169,166,163,161,158,148,147, 143,142,136,130,124,123,123,122,120,119,117,116,110,107,106,98, 98,96,91,90,85,84,81,79,78,77,77,74,71,69,69,68,67,66,65,64,64, 61,49,44,44,42,41,40,38,30,26,25,22,21,20,17 }; const int n2w3b3r5[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 265,262,262,262,260,255,253,252,248,245,242,239,237,236,225,225, 222,221,219,218,216,214,213,211,211,209,203,201,201,199,198,197, 191,187,187,187,182,181,174,173,172,172,170,157,152,150,150,149, 147,147,145,145,144,143,143,136,135,134,130,129,128,125,115,108, 107,104,100,98,96,84,82,82,77,75,74,73,73,64,63,61,60,55,51,51, 46,46,45,37,36,35,33,32,32,27,24,23,22,22,21,16 }; const int n2w3b3r6[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 265,259,258,256,253,253,250,250,247,246,241,240,232,229,228,227, 226,225,225,224,216,215,213,211,209,203,202,202,199,196,196,193, 185,184,181,181,181,180,177,171,169,167,164,161,155,153,151,150, 148,143,141,132,130,128,127,126,125,123,119,119,113,112,103,102, 101,99,97,96,95,91,90,90,86,86,85,79,79,78,77,71,71,64,60,60, 59,54,49,42,38,38,32,30,28,28,26,24,20,16,16,16 }; const int n2w3b3r7[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 260,252,248,243,243,238,237,236,236,227,223,217,216,207,207,207, 204,203,200,198,197,195,188,177,172,170,169,168,168,165,162,159, 157,153,150,150,149,148,145,144,143,142,138,137,126,126,126,124, 123,122,121,121,116,114,113,112,110,109,108,106,105,101,101,99, 80,78,78,73,72,71,69,69,66,65,64,63,63,58,58,57,57,52,48,48,48, 46,46,45,43,42,39,37,36,33,22,19,18,17,16,16 }; const int n2w3b3r8[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 264,264,263,261,260,259,258,258,257,256,250,249,245,243,242,239, 239,237,235,233,231,230,226,216,209,206,201,200,195,188,186,185, 185,183,179,176,171,169,167,166,165,164,158,154,148,148,143,141, 133,133,130,128,127,121,121,118,118,116,114,113,112,110,101,101, 96,94,92,91,87,87,86,85,83,83,81,81,72,63,63,61,57,54,51,50,50, 50,47,45,42,39,37,33,31,29,27,19,19,18,18,16 }; const int n2w3b3r9[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 263,261,258,258,252,252,249,248,248,247,244,242,239,233,229,226, 224,214,210,203,202,202,196,195,195,193,192,187,171,171,169,168, 168,162,158,156,156,155,155,155,154,149,149,146,144,140,135,135, 133,131,125,124,122,119,118,114,114,111,107,105,102,96,93,91, 90,90,87,85,85,84,82,80,79,78,77,76,76,68,66,66,62,60,58,54,54, 52,49,46,42,39,37,32,30,26,26,25,22,20,18,18 }; const int n2w4b1r0[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 132,132,132,132,132,130,130,130,130,130,129,129,128,128,128,128, 128,127,126,126,125,125,125,125,124,123,123,123,122,122,122,122, 121,121,121,121,120,120,119,118,118,117,116,115,115,115,114,114, 114,114,113,113,113,113,112,112,112,111,111,110,110,109,109,108, 108,107,107,107,107,106,105,103,103,103,102,102,101,101,99,98, 98,98,98,96,96,96,95,95,95,94,94,93,93,92,91,91,91,91,90,90 }; const int n2w4b1r1[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 132,132,132,132,131,131,131,130,130,130,129,129,128,126,126,126, 125,124,123,122,122,121,121,120,120,120,120,120,119,119,118,118, 117,117,117,117,116,116,115,115,115,114,114,113,113,112,112,112, 112,112,112,110,110,110,110,109,109,108,108,108,107,107,107,105, 105,105,105,105,104,103,102,101,101,101,100,100,100,99,99,98, 98,98,97,97,97,96,96,96,94,94,93,93,93,92,92,92,91,90,90,90 }; const int n2w4b1r2[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 132,131,130,130,130,130,129,129,129,129,128,127,127,127,127,127, 126,125,125,125,124,124,123,122,122,120,120,120,120,120,120,120, 120,119,119,119,118,118,118,118,118,117,117,116,116,115,115,115, 114,114,113,113,112,112,112,112,112,111,111,111,110,110,109,108, 108,108,108,108,106,106,106,106,105,104,104,104,104,104,103,103, 103,102,102,101,101,100,99,99,98,98,97,95,94,94,93,93,93,92,91, 90 }; const int n2w4b1r3[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 132,132,132,132,132,131,131,130,130,129,129,128,128,128,128,128, 128,127,127,127,126,126,126,126,125,125,124,123,122,122,122,122, 121,121,120,120,120,119,119,119,118,117,117,116,115,115,114,113, 113,112,112,111,111,111,110,109,109,108,107,107,107,105,105,105, 105,105,104,103,103,103,102,102,102,102,101,100,100,99,99,99, 98,98,98,98,97,97,97,96,96,95,95,95,93,92,92,92,91,91,91,90 }; const int n2w4b1r4[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 132,132,132,132,131,131,131,130,130,130,129,129,128,128,128,127, 127,127,127,126,125,125,124,124,124,123,123,121,121,121,120,120, 119,119,118,118,118,117,117,117,117,116,116,116,115,115,114,114, 114,114,114,113,113,113,113,112,112,112,111,107,106,105,105,105, 105,105,104,103,103,102,102,102,102,101,100,100,99,99,99,97,97, 96,96,96,96,95,95,94,94,93,93,92,92,92,92,92,91,91,90,90 }; const int n2w4b1r5[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 132,132,132,131,130,130,130,130,129,129,129,128,127,127,127,127, 126,126,126,125,125,124,124,124,123,123,123,123,122,121,121,121, 121,120,120,120,120,119,119,119,118,118,118,118,117,117,116,115, 115,114,113,113,113,111,110,110,109,109,109,109,108,108,107,106, 106,106,106,105,104,104,103,103,102,100,99,99,98,98,98,98,96, 96,96,96,95,95,94,94,93,93,93,91,91,90,90,90,90,90,90,90 }; const int n2w4b1r6[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 131,130,130,129,129,128,128,127,127,127,126,126,125,123,122,122, 122,121,121,121,120,120,120,120,119,119,118,117,117,116,116,116, 115,115,115,114,114,114,113,113,113,113,113,112,111,111,111,110, 110,109,109,109,108,108,108,108,108,108,107,107,106,105,104,104, 104,104,103,103,103,102,102,102,102,101,101,101,100,100,99,99, 99,99,98,98,98,97,97,97,96,94,94,93,93,93,92,92,92,91,91,90 }; const int n2w4b1r7[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 132,132,132,131,130,130,129,129,129,128,128,128,127,127,127,126, 125,125,124,124,123,123,123,122,122,122,122,121,121,121,120,120, 120,118,118,118,117,117,116,116,116,116,116,115,115,115,114,113, 112,112,110,110,110,109,108,108,108,107,107,107,106,106,106,105, 105,104,104,104,103,103,102,102,101,101,101,99,99,98,98,97,97, 97,97,96,95,95,94,94,93,93,93,92,92,92,92,91,90,90,90,90 }; const int n2w4b1r8[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 132,132,131,131,130,129,129,129,128,127,127,126,126,125,125,124, 124,124,123,122,122,121,120,120,119,119,119,118,118,118,117,117, 117,117,117,116,115,115,114,114,113,113,113,111,110,110,110,109, 108,108,108,107,107,107,107,107,106,105,105,104,103,103,103,102, 102,102,101,101,101,100,100,100,100,99,98,98,98,98,97,97,97,96, 96,96,96,95,95,95,94,93,93,93,93,93,92,92,92,91,90,90 }; const int n2w4b1r9[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 130,130,128,127,127,127,127,126,126,126,126,126,125,125,125,124, 124,124,123,122,122,122,122,121,121,120,120,119,119,118,118,117, 117,117,117,116,116,115,115,115,114,114,114,114,113,112,112,110, 110,109,108,108,108,106,106,106,105,105,105,105,105,104,104,103, 103,103,102,102,101,101,101,100,100,100,99,99,98,98,98,98,97, 95,95,95,95,94,93,93,93,92,92,91,91,91,91,91,91,90,90,90 }; const int n2w4b2r0[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 163,162,161,159,159,156,155,153,152,150,150,150,149,148,141,140, 139,138,137,137,137,136,134,134,134,133,132,130,130,128,127,126, 126,125,124,123,121,121,120,119,119,116,116,115,115,115,115,114, 111,108,107,106,105,104,102,102,100,100,99,98,97,96,96,90,90, 89,89,89,87,86,83,82,81,78,76,74,74,74,72,70,69,68,68,66,65,65, 64,64,63,62,62,62,62,61,60,60,59,58,58,58 }; const int n2w4b2r1[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 165,165,164,160,159,157,155,154,154,153,150,150,150,147,146,144, 143,140,139,138,138,137,135,134,131,131,131,130,129,128,127,125, 123,121,118,116,116,115,115,114,113,113,113,111,111,109,108,107, 103,103,102,102,101,100,97,96,95,95,94,94,94,93,92,91,90,89,86, 86,86,86,85,85,85,84,84,83,82,82,80,79,78,76,74,74,71,70,68,67, 67,67,66,65,65,62,61,61,61,61,60,59 }; const int n2w4b2r2[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 165,165,162,159,156,155,155,154,152,151,150,150,149,149,148,147, 146,145,145,144,143,143,142,141,141,138,134,134,133,132,131,128, 127,126,125,124,123,122,121,121,121,120,119,114,114,112,112,110, 109,108,107,107,107,106,102,102,99,99,98,97,97,95,95,95,94,94, 93,93,92,91,90,88,87,87,86,83,82,80,80,79,78,77,76,76,70,69,68, 68,68,66,65,62,61,60,60,59,58,58,58,57 }; const int n2w4b2r3[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 162,161,159,159,157,157,156,155,154,152,152,148,147,147,142,142, 140,138,137,132,131,130,129,126,124,124,123,123,123,122,121,120, 120,119,119,116,116,115,114,113,113,112,110,109,108,107,107,105, 104,104,102,100,99,98,96,94,94,94,93,93,93,92,91,90,90,88,87, 85,83,82,82,78,78,78,77,76,76,75,75,74,73,73,71,70,69,69,68,68, 67,66,65,64,64,63,61,61,60,59,58,57 }; const int n2w4b2r4[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 165,165,164,164,161,161,156,155,155,154,154,154,154,151,151,150, 149,149,148,146,144,142,142,141,139,139,138,136,136,135,134,133, 132,132,131,131,131,131,130,130,129,129,124,124,123,120,118,118, 118,117,116,116,116,116,114,114,107,106,105,105,104,102,101,101, 98,97,96,96,94,91,91,91,88,86,86,86,84,79,79,78,78,77,76,74,71, 71,70,69,67,65,65,64,60,60,59,59,59,59,59,59 }; const int n2w4b2r5[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 163,161,159,159,157,156,156,156,155,154,153,152,151,150,148,147, 147,146,146,145,145,144,141,139,139,138,138,138,136,136,135,135, 131,130,128,126,125,124,123,123,122,122,122,120,118,118,117,116, 112,111,110,109,107,106,106,106,106,106,104,104,103,102,102,102, 101,101,99,99,98,98,97,95,95,93,90,90,87,84,84,83,80,80,79,75, 75,74,74,74,72,69,69,66,66,65,63,62,61,61,59,59 }; const int n2w4b2r6[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 164,164,163,159,158,154,153,152,152,152,152,150,150,147,147,145, 145,145,144,143,143,142,141,140,140,140,139,139,138,137,136,135, 131,128,125,124,122,120,119,118,118,118,117,114,114,114,112,111, 111,110,110,109,109,107,107,107,107,107,106,102,101,101,100,99, 98,97,96,96,96,95,94,93,92,91,89,87,86,86,84,83,80,79,78,78,74, 73,73,73,68,68,68,67,66,66,65,65,64,61,60,59 }; const int n2w4b2r7[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 163,163,163,161,159,158,158,157,156,156,156,155,154,154,153,153, 153,153,153,152,149,144,139,135,135,135,131,127,126,125,124,123, 121,121,120,120,119,118,118,117,116,115,114,112,112,111,111,110, 109,108,107,107,106,106,105,105,105,103,102,100,98,97,96,95,95, 93,92,88,87,86,85,82,82,82,81,80,79,79,79,76,75,73,70,68,68,68, 65,64,64,63,62,62,61,61,60,59,58,58,58,57 }; const int n2w4b2r8[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 164,161,161,161,159,159,159,159,158,158,157,157,157,156,155,154, 151,150,150,149,149,148,148,148,148,147,147,146,146,145,143,139, 139,138,137,136,136,136,134,133,131,131,128,128,127,127,127,126, 121,120,120,119,118,118,118,114,112,112,112,111,110,110,107,106, 104,104,103,102,101,99,97,94,94,94,91,91,89,87,83,82,82,80,79, 79,77,76,72,72,72,70,69,69,68,67,67,64,62,61,58,57 }; const int n2w4b2r9[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 163,162,157,157,156,155,151,150,149,149,149,146,145,145,144,143, 142,141,140,140,139,139,138,137,130,130,128,128,128,127,127,127, 126,126,125,125,125,125,123,123,122,122,119,118,118,118,117,115, 115,114,114,111,106,106,105,104,104,103,102,102,102,100,99,99, 93,93,92,92,91,90,88,85,81,79,79,79,79,78,74,73,73,72,68,68,67, 67,66,65,65,65,64,64,63,63,62,61,60,60,59,58 }; const int n2w4b3r0[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 209,206,205,201,197,191,191,190,187,187,186,184,183,182,182,182, 178,176,174,172,171,171,171,169,166,164,162,161,161,156,155,155, 152,149,147,144,142,136,132,131,125,124,122,121,117,117,115,113, 113,110,104,103,101,101,100,96,96,95,95,92,87,83,77,77,76,72, 70,70,70,68,68,66,65,62,59,56,55,54,51,49,47,44,43,43,42,41,41, 40,39,37,34,34,31,31,30,26,26,20,14,13 }; const int n2w4b3r1[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 208,208,208,203,202,201,199,195,195,195,192,191,190,181,175,172, 172,171,166,163,162,159,158,158,156,155,154,148,147,145,143,139, 135,133,131,131,131,131,130,129,128,126,125,123,123,122,122,121, 120,118,117,117,116,110,106,103,103,99,97,94,92,88,86,86,83,81, 79,78,77,77,77,76,71,71,69,62,61,59,58,57,57,57,57,54,46,46,43, 42,38,37,35,33,31,23,21,17,14,14,14,13 }; const int n2w4b3r2[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 206,205,200,200,199,199,197,197,194,193,193,193,191,188,185,185, 184,182,178,175,172,170,167,165,161,161,161,159,159,159,158,155, 154,153,153,153,149,146,143,141,141,139,137,135,130,128,126,125, 122,120,120,119,118,115,113,109,109,109,108,107,104,104,103,103, 101,99,97,94,90,90,90,87,86,86,82,79,77,74,67,63,54,48,48,46, 45,44,37,35,35,34,34,27,25,23,23,23,19,17,16,14 }; const int n2w4b3r3[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 201,201,200,199,198,197,196,195,195,194,190,188,187,184,182,181, 181,180,179,177,172,171,169,165,165,163,158,154,154,153,153,148, 148,144,142,138,137,131,129,125,123,122,118,117,117,116,115,113, 109,105,105,104,103,101,100,96,89,87,86,84,84,82,78,78,77,76, 72,71,71,69,69,69,67,66,64,64,63,62,58,56,53,52,50,49,45,45,40, 39,37,37,33,28,25,24,22,22,16,15,15,13 }; const int n2w4b3r4[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 204,204,202,202,200,200,197,194,194,191,189,187,181,180,180,179, 179,177,176,175,174,173,169,169,168,167,161,158,151,145,143,139, 136,136,135,135,134,133,131,130,130,128,124,124,123,122,120,116, 113,112,111,110,109,109,106,105,104,103,102,101,99,99,97,96,81, 81,78,78,77,75,73,72,68,67,64,64,62,62,55,54,51,47,45,45,35,34, 34,32,32,31,30,28,26,25,23,22,20,17,15,13 }; const int n2w4b3r5[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 209,207,205,204,204,202,201,200,200,197,194,193,188,187,185,180, 176,168,166,161,159,159,156,154,154,148,145,145,143,138,135,132, 128,125,124,122,121,118,116,114,112,112,108,106,105,105,104,101, 97,95,94,93,87,85,85,72,72,71,70,69,68,64,63,63,62,61,61,58,55, 54,53,52,52,51,50,48,48,47,45,43,40,37,34,33,27,27,27,24,24,23, 22,22,20,20,18,17,16,15,14,13 }; const int n2w4b3r6[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 209,207,206,201,201,200,199,198,194,191,190,188,186,185,182,181, 179,178,178,174,172,170,170,170,160,159,155,154,144,143,142,136, 135,134,132,130,128,126,126,122,118,117,116,113,112,106,106,105, 103,103,101,96,95,90,90,89,82,81,81,80,78,77,76,74,72,71,71,70, 68,66,64,62,62,61,60,58,57,57,57,57,54,48,46,44,42,36,33,30,29, 25,24,23,23,22,22,21,17,14,13,13 }; const int n2w4b3r7[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 209,209,207,205,199,193,193,189,188,186,181,180,178,175,174,170, 169,169,168,166,164,161,157,156,155,155,153,153,152,152,148,147, 145,145,144,144,141,133,133,133,126,125,123,119,118,117,116,110, 109,108,106,103,100,99,98,96,95,94,92,90,87,86,84,79,77,74,72, 72,71,71,62,61,59,56,55,55,54,53,48,47,44,42,42,41,39,38,37,36, 32,29,29,27,27,25,24,24,22,21,14,14 }; const int n2w4b3r8[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 209,207,205,205,203,202,202,201,199,195,193,192,192,191,187,184, 183,182,178,177,175,171,164,162,155,154,153,152,150,148,146,144, 144,142,136,135,134,134,132,127,127,125,124,123,122,120,119,114, 107,104,96,96,94,94,93,89,87,86,86,84,83,82,81,81,78,77,77,76, 75,70,67,67,64,57,56,51,47,46,42,41,41,41,41,41,40,40,40,39,38, 35,32,31,27,25,23,23,23,17,17,14 }; const int n2w4b3r9[] = { 1000, // Capacity 100, // Number of items // Size of items (sorted) 206,206,206,206,205,205,204,200,198,196,193,192,189,188,188,187, 184,178,178,176,176,172,172,171,169,168,168,167,162,158,156,153, 152,151,151,151,145,141,139,139,137,136,129,127,124,122,118,115, 115,115,111,111,110,109,109,103,102,102,99,98,98,97,94,91,91, 90,86,85,83,81,79,78,78,74,74,73,73,71,67,64,59,58,57,51,50,50, 50,49,46,44,43,39,33,30,27,26,23,21,20,19 }; const int n3w1b1r0[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 395,395,395,395,395,394,394,394,393,393,393,393,393,393,392,390, 389,388,388,388,387,386,386,385,384,383,383,382,380,380,379,379, 378,378,377,375,375,374,374,373,372,372,372,371,370,368,368,367, 367,366,366,365,365,363,362,361,360,360,360,359,357,357,356,355, 355,350,350,349,348,348,348,347,347,347,347,347,346,346,346,346, 345,345,344,344,344,343,343,343,343,342,341,341,340,338,337,336, 336,335,335,335,334,333,333,332,331,330,329,329,328,328,327,327, 326,326,325,324,323,323,322,322,321,321,320,320,320,320,316,316, 316,315,315,315,313,312,312,311,309,309,308,306,305,305,305,305, 303,302,302,302,300,300,299,298,298,298,297,297,296,296,295,295, 293,293,291,291,290,290,290,290,287,286,286,286,286,282,281,281, 281,280,280,279,275,275,274,274,274,274,273,272,272,271,271,270, 270,269,269,269,268,267,266,266 }; const int n3w1b1r1[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 394,393,393,392,391,391,390,389,389,389,387,387,387,387,387,387, 385,384,383,382,382,382,381,380,380,380,379,378,378,378,378,377, 376,376,374,373,373,372,371,371,371,371,370,370,370,369,369,369, 368,368,367,367,365,365,364,364,364,363,363,362,362,360,360,360, 359,359,358,357,356,356,355,354,354,353,353,352,351,349,349,348, 347,346,346,343,343,342,342,342,341,341,340,340,339,339,338,338, 338,337,336,336,335,333,333,332,332,331,329,328,326,326,326,325, 325,325,323,323,323,322,322,321,320,319,319,318,318,315,315,314, 314,313,313,311,310,310,309,309,309,309,308,308,307,306,306,306, 305,305,302,301,299,299,299,299,298,297,296,296,296,296,295,294, 294,294,292,292,291,290,290,289,288,286,285,285,285,284,283,282, 282,282,280,280,280,279,278,277,277,277,277,275,275,275,274,273, 273,272,272,271,270,270,269,268 }; const int n3w1b1r2[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 396,395,395,395,394,394,392,392,391,391,390,389,389,388,387,387, 385,385,385,385,384,384,383,383,383,382,381,380,379,378,378,378, 377,374,374,374,373,373,372,371,370,370,370,364,364,363,363,363, 362,362,360,359,359,357,357,356,356,356,355,354,354,354,353,353, 353,353,352,352,351,348,347,346,346,346,346,345,344,344,343,343, 342,342,341,340,339,339,338,338,338,338,338,337,336,336,336,336, 335,334,334,334,333,333,332,331,329,328,328,328,327,327,327,327, 326,324,323,322,321,320,319,319,316,315,313,313,312,312,311,310, 310,309,308,308,308,307,305,305,304,304,304,304,303,302,301,300, 299,299,298,298,297,297,296,295,295,293,292,292,292,291,291,290, 289,288,288,288,287,284,284,284,283,282,282,281,280,279,279,279, 278,278,278,278,277,277,275,275,275,275,274,273,273,271,271,270, 269,269,269,269,268,267,266,266 }; const int n3w1b1r3[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 396,395,394,393,393,392,391,390,389,388,387,387,386,386,386,385, 385,382,381,380,379,379,378,378,378,378,377,377,377,377,376,376, 374,373,373,370,369,368,368,368,368,367,367,367,367,367,366,366, 366,366,365,364,363,362,361,361,361,361,359,359,358,357,357,356, 356,355,353,352,350,349,348,348,348,348,348,347,347,347,346,345, 345,345,344,344,343,343,342,342,342,341,340,339,336,336,336,336, 335,335,335,334,334,333,331,330,328,328,328,327,327,327,325,324, 324,323,322,322,322,321,321,320,320,320,320,320,318,317,317,315, 315,315,315,314,314,313,313,312,311,309,309,309,309,308,307,307, 306,305,305,304,304,303,302,302,301,301,301,301,300,299,299,298, 298,297,296,296,294,293,293,292,291,290,290,289,289,288,288,288, 286,286,284,284,284,283,283,282,281,280,279,275,275,274,273,272, 271,270,269,269,269,268,267,267 }; const int n3w1b1r4[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 396,396,396,396,395,394,394,393,393,393,392,392,392,391,391,391, 389,388,388,388,387,387,385,385,384,384,384,383,383,383,382,382, 382,382,381,380,380,379,378,378,377,375,375,375,374,371,370,370, 369,368,368,365,365,364,363,362,361,361,360,359,357,356,355,354, 353,353,353,352,352,352,351,351,351,350,350,349,348,347,347,346, 345,345,345,344,343,342,341,340,340,339,338,338,338,337,336,335, 335,335,334,334,332,331,331,331,330,330,329,327,327,326,326,325, 325,325,325,324,323,323,322,322,321,319,318,316,316,315,314,313, 313,312,311,311,310,310,310,310,309,309,306,304,304,303,303,302, 302,301,301,300,299,299,297,297,297,293,293,293,291,291,290,290, 290,288,287,286,286,285,284,284,283,283,283,283,282,282,282,280, 279,278,278,278,278,278,277,276,276,275,275,274,273,273,271,271, 271,269,269,268,268,267,266,266 }; const int n3w1b1r5[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 396,396,396,395,394,392,391,390,389,386,386,386,385,383,383,382, 381,380,379,379,378,377,377,375,375,375,375,374,374,373,373,373, 372,372,371,370,370,369,369,368,367,367,367,367,367,367,365,365, 364,362,362,362,361,361,360,359,357,357,357,357,356,356,354,354, 353,353,351,350,349,349,349,348,348,348,347,346,346,344,342,342, 342,340,338,338,338,337,337,337,336,336,336,335,335,335,335,335, 334,334,334,333,333,333,332,330,328,328,328,328,327,327,327,327, 326,325,325,324,323,323,322,322,321,321,318,318,318,317,317,317, 316,316,316,315,315,315,315,313,313,313,312,311,311,310,310,310, 309,307,307,306,306,306,306,305,304,302,302,301,299,299,297,297, 297,296,293,290,290,289,289,288,288,287,287,286,285,285,283,283, 283,283,282,281,280,279,277,276,275,274,274,274,274,273,272,270, 270,270,268,268,267,267,267,266 }; const int n3w1b1r6[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 396,395,394,394,394,394,394,394,393,393,393,392,392,392,391,389, 389,388,387,387,386,385,384,384,383,382,382,380,380,380,379,379, 379,377,377,377,377,376,376,376,374,374,371,370,370,369,369,368, 368,368,367,367,366,362,362,361,361,360,360,359,359,359,359,358, 357,357,356,356,356,355,355,355,355,353,352,352,351,351,351,350, 350,349,349,349,348,347,346,345,345,345,344,344,343,343,343,342, 342,342,341,338,337,337,336,336,336,335,334,333,333,332,331,330, 330,328,327,326,326,326,325,325,324,323,323,321,321,320,319,319, 318,318,317,316,314,314,313,313,312,311,311,310,310,308,307,307, 304,303,302,301,300,296,296,294,293,293,293,292,292,291,291,290, 289,289,289,288,288,287,286,285,285,284,283,283,283,282,282,280, 280,280,280,279,279,279,278,278,276,275,274,273,273,272,271,270, 270,269,268,267,267,267,266,266 }; const int n3w1b1r7[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 396,395,395,394,394,392,392,392,389,388,387,386,385,385,384,384, 383,383,383,382,382,381,379,378,378,378,375,375,375,375,370,370, 370,370,368,366,365,363,363,361,361,360,360,359,359,359,359,356, 356,354,354,353,353,352,352,351,350,349,348,348,348,345,345,344, 343,343,343,343,342,342,341,340,339,339,339,338,338,336,336,335, 334,333,331,330,330,330,329,327,327,326,325,325,325,324,323,322, 322,322,322,321,321,321,321,320,320,319,319,318,318,318,317,317, 317,317,317,316,316,314,313,313,313,311,310,310,308,308,307,306, 305,305,305,304,304,304,303,302,302,301,301,301,299,299,297,295, 295,295,294,294,293,292,290,290,289,289,289,289,288,287,287,284, 283,283,283,283,281,281,280,280,280,280,280,279,279,279,279,278, 278,278,278,276,276,276,275,275,275,275,274,273,273,271,271,271, 271,270,270,270,269,269,267,266 }; const int n3w1b1r8[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 396,395,394,392,391,391,390,390,390,389,388,388,388,387,387,387, 387,386,386,386,384,384,382,381,381,381,381,381,380,379,378,378, 377,376,376,375,375,374,373,371,370,369,369,367,367,367,366,366, 366,364,364,364,364,362,362,361,360,359,358,357,357,355,355,354, 354,354,353,352,351,350,349,349,348,348,347,347,347,346,346,346, 344,341,341,341,341,340,340,340,339,338,338,336,336,335,335,334, 334,334,334,333,332,332,329,329,327,326,326,325,324,324,324,324, 324,323,323,323,322,321,321,320,320,320,319,317,316,315,313,313, 313,312,312,311,311,311,310,310,308,308,308,307,306,306,306,305, 305,305,304,300,300,300,299,299,297,296,295,294,294,294,293,293, 292,292,291,290,290,290,289,288,286,285,285,284,284,283,283,282, 281,281,280,280,279,279,277,277,277,276,275,275,275,274,274,274, 274,271,271,270,269,269,268,267 }; const int n3w1b1r9[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 396,394,394,394,394,394,393,391,391,390,390,389,389,388,387,386, 386,386,385,384,384,384,384,383,383,382,380,379,378,378,377,376, 376,376,375,375,374,374,373,371,371,370,370,369,369,369,367,366, 365,363,363,363,362,361,360,359,359,357,357,356,354,354,351,351, 351,350,350,350,349,349,349,348,347,346,346,345,345,344,343,343, 342,342,340,340,339,337,337,337,337,336,336,335,334,334,333,333, 333,333,333,332,332,332,331,330,330,330,329,329,329,328,328,327, 325,324,324,323,322,322,322,322,320,319,319,318,315,314,314,313, 313,313,313,312,312,310,309,308,308,307,306,306,305,304,304,304, 301,299,299,299,298,298,298,297,297,297,296,294,294,294,294,294, 293,292,291,291,290,290,289,289,288,286,286,285,284,280,280,279, 278,277,277,276,275,275,275,274,273,272,272,271,271,270,270,270, 269,269,268,267,266,266,266,266 }; const int n3w1b2r0[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 495,494,493,490,489,488,487,486,485,485,483,481,479,477,475,474, 473,471,471,470,469,464,463,459,455,452,445,445,445,444,444,442, 439,438,436,435,435,435,435,433,429,429,428,428,422,422,421,418, 417,417,417,411,410,407,405,404,401,400,398,398,398,397,395,393, 391,389,389,385,384,378,377,376,375,375,375,373,373,369,368,362, 362,359,358,354,353,352,352,351,349,346,344,342,341,337,337,336, 335,335,334,334,334,333,330,330,330,330,328,326,325,324,324,320, 318,317,317,316,316,316,315,312,308,306,304,302,299,296,295,292, 292,290,284,282,278,276,276,271,270,270,270,269,268,263,261,259, 258,257,254,252,252,250,247,246,244,244,243,243,242,242,233,232, 231,230,228,224,223,223,220,220,213,213,212,209,209,206,204,201, 200,199,197,195,195,194,194,193,192,189,188,188,186,184,182,179, 179,175,173,173,172,171,169,168 }; const int n3w1b2r1[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 495,493,493,487,486,486,483,483,481,478,477,476,474,473,472,472, 472,471,470,469,467,464,464,462,461,458,456,454,451,450,449,448, 444,443,441,440,437,433,432,432,430,429,428,425,421,419,418,417, 417,411,411,409,409,408,405,405,403,401,400,399,397,393,390,388, 387,387,387,385,384,383,382,381,379,378,376,375,374,374,371,370, 367,364,358,355,355,353,353,350,349,346,346,345,342,341,339,338, 336,335,334,334,331,331,330,326,326,325,324,321,320,319,316,316, 315,313,313,311,311,311,311,309,308,307,307,306,303,302,302,302, 298,298,297,297,295,294,291,288,284,283,283,282,281,281,280,277, 277,276,273,272,270,265,264,264,264,263,259,253,253,251,250,247, 247,245,240,237,237,236,232,232,231,231,227,222,221,213,213,210, 203,203,202,201,201,196,195,193,193,191,189,188,188,185,182,181, 179,179,177,176,175,172,169,169 }; const int n3w1b2r2[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 491,488,487,479,479,474,473,470,469,469,468,468,465,463,462,462, 459,457,457,453,451,449,448,446,444,442,440,438,433,433,432,430, 427,426,426,423,421,417,415,413,413,411,410,410,410,409,408,408, 407,406,404,403,402,401,400,399,397,391,391,389,388,387,387,387, 386,384,382,377,377,375,373,373,373,372,372,369,366,365,364,363, 363,363,359,357,356,351,350,350,350,348,347,346,338,335,333,331, 330,330,328,328,326,325,323,322,322,320,317,316,311,307,306,306, 305,301,300,297,296,296,292,289,289,288,285,276,275,274,273,272, 268,266,265,264,262,257,257,256,255,255,255,255,252,249,248,245, 243,243,241,237,236,236,235,232,231,228,228,226,226,225,224,223, 223,223,221,218,216,208,206,206,205,204,203,202,202,202,196,194, 193,193,193,190,190,189,189,188,187,186,183,182,181,179,179,178, 172,171,171,171,169,169,168,167 }; const int n3w1b2r3[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 494,492,491,488,487,483,480,479,479,478,476,476,476,474,472,469, 466,466,460,459,459,456,453,452,446,446,446,442,442,442,437,434, 430,429,425,422,422,421,417,416,412,411,405,405,402,400,399,399, 394,387,387,387,387,386,385,379,378,376,376,373,372,372,371,371, 371,371,370,369,367,365,361,361,360,359,356,356,355,353,352,352, 351,348,348,347,346,346,346,346,345,343,343,342,341,341,340,338, 337,337,331,330,330,329,326,322,321,317,316,315,311,309,308,307, 305,304,303,299,299,298,295,294,294,292,288,284,280,279,279,279, 278,277,276,274,274,271,268,267,267,266,265,262,262,260,259,258, 252,248,247,246,245,242,240,238,232,231,231,229,229,228,226,225, 224,224,222,220,216,216,215,214,212,209,205,201,200,200,199,198, 197,196,194,194,191,190,190,186,186,185,184,183,181,181,179,179, 177,177,177,175,174,169,168,168 }; const int n3w1b2r4[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 492,489,488,484,484,483,482,481,480,478,477,476,474,474,473,472, 469,469,468,468,466,462,460,458,458,455,453,451,450,449,449,448, 446,445,442,442,440,439,437,435,435,435,435,432,432,430,428,425, 423,421,421,420,417,416,411,408,406,406,406,404,403,403,403,402, 402,399,399,398,397,394,393,392,391,391,390,389,385,384,382,376, 368,367,367,366,365,362,361,360,358,356,354,352,351,348,348,348, 345,343,340,336,334,334,334,333,328,328,327,326,325,321,320,317, 315,315,315,314,313,311,308,308,308,305,302,302,301,300,295,295, 293,293,293,292,292,291,286,284,284,281,281,273,273,272,271,267, 267,267,266,265,265,264,263,262,261,258,258,255,253,242,241,240, 240,239,238,236,235,234,233,231,228,224,224,223,221,219,217,214, 212,210,205,202,201,199,197,197,197,194,189,187,187,186,185,184, 183,179,178,175,173,172,171,168 }; const int n3w1b2r5[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 495,492,487,483,483,481,481,479,476,471,470,465,458,457,454,453, 452,452,452,450,450,448,444,440,439,439,437,437,435,434,432,430, 429,429,428,428,427,425,424,424,422,419,419,417,414,412,411,408, 406,406,405,403,403,397,396,395,392,390,390,389,389,386,384,383, 382,382,380,380,379,378,378,377,374,371,364,361,361,358,355,351, 350,350,350,349,348,348,346,343,340,339,333,333,331,331,329,328, 327,323,322,320,319,317,314,313,313,311,311,311,309,309,306,297, 295,295,293,292,292,287,283,282,282,281,280,280,280,277,276,275, 273,272,272,272,269,266,265,264,261,260,259,259,258,256,256,255, 254,251,247,247,245,240,239,239,239,238,236,235,232,230,228,227, 227,227,223,222,222,220,220,220,215,214,210,208,206,205,201,201, 200,199,198,193,192,192,191,189,189,187,185,184,182,181,181,179, 179,173,173,173,171,169,167,167 }; const int n3w1b2r6[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 495,494,491,490,490,490,489,488,486,485,480,479,479,472,469,467, 467,465,462,461,461,461,460,457,453,451,451,449,447,444,444,443, 442,442,437,436,435,435,435,432,432,431,430,430,429,429,429,425, 423,422,421,419,418,415,411,407,404,402,401,400,395,394,394,391, 385,384,383,379,377,376,374,373,372,370,369,368,364,363,361,361, 361,359,358,358,357,357,353,351,350,346,344,344,342,342,342,341, 339,339,336,333,332,331,330,330,326,325,323,317,313,308,306,305, 300,297,296,293,292,290,287,287,286,282,281,277,277,273,273,272, 272,271,267,265,261,259,258,254,254,254,253,253,249,248,248,247, 247,246,246,246,244,243,243,242,241,241,240,240,240,239,236,235, 234,234,233,233,230,229,228,226,221,221,220,217,215,215,210,208, 206,204,203,202,200,198,197,197,191,191,184,181,181,180,179,175, 174,173,173,172,171,171,169,168 }; const int n3w1b2r7[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 495,493,492,487,487,485,482,480,480,479,475,475,473,473,469,469, 465,464,460,459,457,456,455,454,453,451,450,449,445,443,441,439, 438,435,433,431,427,423,423,421,421,420,420,417,415,414,414,411, 411,408,406,404,401,399,395,395,394,392,391,390,390,386,384,384, 380,378,377,377,374,373,370,369,369,369,368,367,366,363,360,359, 354,353,350,349,348,347,346,346,344,342,341,337,336,334,332,332, 332,329,328,327,323,321,321,317,317,316,315,313,310,310,306,305, 305,303,303,301,301,300,297,296,293,292,291,291,290,289,286,286, 286,284,283,282,282,282,282,282,282,280,279,276,275,272,272,270, 270,270,260,256,256,255,254,253,245,244,240,236,235,234,234,234, 233,230,228,227,226,226,225,222,222,221,217,217,214,211,208,207, 207,206,204,203,203,202,202,202,200,199,198,197,192,189,187,186, 183,178,177,177,174,170,170,168 }; const int n3w1b2r8[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 495,490,489,487,487,486,486,485,483,482,481,477,477,477,475,469, 467,465,465,461,461,457,454,453,452,449,447,445,443,442,441,439, 435,433,433,433,432,432,432,429,428,428,425,424,421,419,418,418, 414,410,409,409,409,408,407,406,406,404,403,400,398,398,397,396, 394,394,392,392,390,388,388,383,382,381,369,369,368,365,364,362, 360,360,359,357,355,351,350,350,344,341,340,338,337,332,331,328, 327,327,325,324,316,315,313,311,310,309,308,308,307,301,299,298, 297,296,295,295,288,283,280,279,279,278,278,278,277,277,276,276, 274,274,273,270,269,268,267,266,264,264,264,263,263,261,260,258, 257,257,255,251,251,249,248,242,242,241,241,241,241,238,234,231, 230,229,229,227,227,227,224,222,219,218,218,215,213,212,207,207, 205,204,203,203,195,192,191,188,188,187,187,187,184,181,180,180, 180,180,179,176,175,172,171,171 }; const int n3w1b2r9[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 495,494,493,493,493,492,489,482,482,478,478,475,473,473,472,471, 469,463,461,461,459,455,454,452,448,444,444,442,440,439,439,436, 434,433,432,431,429,425,423,423,422,422,420,420,417,416,412,411, 411,410,410,409,408,403,401,401,400,399,397,394,394,393,392,392, 390,389,387,386,385,384,384,382,380,380,376,375,374,372,372,370, 370,368,366,357,353,353,353,350,349,346,345,345,345,345,342,342, 338,332,331,325,324,324,322,321,317,314,314,312,312,311,310,308, 307,307,307,306,301,299,299,296,295,294,293,290,288,287,287,286, 285,283,283,280,279,278,275,274,272,271,271,270,269,268,266,266, 265,264,263,257,256,248,247,242,240,236,233,233,233,229,227,222, 219,219,217,217,212,212,209,208,207,206,205,205,205,205,205,203, 203,201,199,198,198,197,192,192,192,191,189,188,184,184,183,182, 182,179,179,178,176,175,168,167 }; const int n3w1b3r0[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 626,624,624,624,622,620,615,613,608,607,601,596,595,595,595,591, 591,586,583,582,582,579,579,573,572,569,567,566,557,556,554,554, 553,550,550,546,545,545,543,540,539,535,535,532,527,526,520,515, 513,509,506,504,502,500,497,492,491,490,489,485,484,484,478,474, 456,452,450,448,441,441,440,436,428,427,424,422,422,420,419,414, 413,410,410,408,406,405,396,388,386,378,369,366,365,364,345,345, 341,337,335,330,324,323,320,316,312,303,302,296,293,291,288,286, 284,282,282,282,282,279,272,271,265,258,256,254,250,249,248,240, 234,232,231,226,225,225,221,217,216,212,208,206,204,201,200,200, 200,199,194,194,189,189,185,184,181,180,177,176,171,163,160,160, 157,155,149,141,137,132,130,127,126,125,125,122,121,120,118,114, 114,112,111,103,94,93,88,86,80,77,77,77,73,69,62,57,55,55,55, 51,49,47,44,39 }; const int n3w1b3r1[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 623,623,619,615,614,614,613,611,603,599,599,597,586,569,568,567, 564,563,562,561,559,553,544,544,542,539,537,537,532,528,527,517, 517,509,506,494,494,489,489,487,486,485,484,483,474,473,472,471, 471,463,462,460,458,456,451,450,447,447,446,435,431,430,422,417, 415,412,410,407,406,405,399,399,393,392,392,386,385,381,381,380, 379,378,376,367,362,362,361,360,356,354,348,346,342,341,340,339, 338,336,328,328,324,318,318,315,313,312,311,308,300,298,296,296, 295,290,285,282,282,282,279,278,278,269,260,259,258,255,254,254, 244,227,226,225,225,223,218,217,216,214,207,206,206,205,204,203, 203,202,200,195,193,190,188,186,183,183,181,181,180,179,179,172, 171,170,167,166,165,160,158,155,149,148,148,139,138,136,132,130, 130,129,128,127,125,120,119,118,118,115,109,107,104,101,95,91, 90,76,60,55,53,45,39,37 }; const int n3w1b3r2[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 624,624,619,617,617,616,614,613,609,607,590,584,580,580,578,577, 576,576,574,570,568,566,565,561,554,552,552,549,544,543,534,534, 531,530,516,515,511,507,507,501,501,501,499,497,496,496,490,488, 487,486,485,482,473,470,466,462,461,458,458,453,452,451,450,447, 443,443,442,435,435,431,430,425,415,412,410,408,406,404,402,401, 396,395,389,388,388,387,387,387,386,384,379,379,379,376,375,373, 370,367,367,363,359,359,357,341,335,333,332,326,312,312,310,306, 300,299,299,293,283,278,277,275,272,271,270,261,260,258,257,257, 256,256,253,249,236,231,215,211,209,209,206,206,196,194,189,188, 186,186,184,181,172,170,169,167,159,155,152,150,150,149,148,147, 146,140,140,138,134,130,129,128,121,119,119,116,113,107,103,102, 94,93,90,89,87,87,85,85,78,76,74,73,72,72,67,65,64,64,63,60,46, 46,39,35 }; const int n3w1b3r3[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 625,619,619,618,614,613,612,611,609,605,602,598,598,590,589,587, 586,585,579,578,576,566,566,564,563,563,561,558,549,542,542,541, 536,535,529,522,515,512,501,501,500,498,496,495,494,492,492,487, 485,481,479,466,466,466,465,464,462,454,453,450,448,442,441,440, 440,439,437,436,436,432,432,422,422,421,417,412,408,408,393,384, 377,377,376,375,373,373,372,371,371,369,365,359,358,353,353,342, 334,327,324,324,321,320,314,312,311,309,308,296,296,293,291,288, 285,278,270,269,265,262,262,261,260,259,256,254,251,248,244,237, 235,235,234,229,229,227,225,223,222,222,216,212,208,207,206,205, 192,191,181,181,180,179,175,175,164,162,162,159,158,157,156,151, 148,148,146,143,139,139,134,129,129,128,119,116,109,105,95,93, 87,83,83,83,80,78,78,77,76,74,72,65,64,63,62,56,55,55,53,39,38, 37,36,36 }; const int n3w1b3r4[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 627,626,618,615,614,613,609,604,603,603,600,599,595,594,591,585, 580,576,571,567,565,562,559,559,555,554,553,551,548,546,543,542, 539,537,536,533,533,533,530,527,525,521,520,519,519,519,519,518, 518,516,509,508,499,498,494,492,489,489,482,475,462,460,450,448, 443,441,440,439,438,438,436,435,433,429,427,426,424,421,420,410, 409,403,403,393,391,381,378,378,374,372,366,364,364,354,352,349, 349,347,346,341,339,339,336,332,331,331,325,321,320,320,318,318, 315,310,302,299,298,297,296,295,293,282,281,267,261,252,252,248, 246,244,233,232,228,221,217,216,214,213,210,209,208,207,202,200, 200,196,193,192,190,190,188,183,183,179,179,175,171,165,152,151, 142,135,134,133,132,127,126,124,121,120,116,116,109,108,107,104, 104,101,95,92,91,89,86,84,83,81,72,68,67,64,60,58,52,49,47,43, 38,38,37,37 }; const int n3w1b3r5[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 627,621,621,613,610,604,604,594,592,582,575,575,575,574,572,571, 571,570,564,564,563,560,557,556,556,548,547,540,532,523,523,519, 518,517,517,514,514,510,505,503,501,494,492,487,480,479,477,477, 473,473,472,467,464,464,459,455,454,452,451,449,449,447,445,440, 438,430,429,427,424,420,420,417,415,411,409,408,407,404,401,390, 385,378,369,361,361,359,356,352,347,343,343,341,338,337,335,334, 322,321,317,316,308,307,305,301,301,289,289,284,283,277,277,271, 270,269,269,267,267,267,259,256,253,249,247,245,242,242,237,233, 233,229,227,224,219,219,217,215,215,209,208,208,202,199,199,198, 194,193,179,176,172,165,160,159,158,148,145,139,139,139,138,137, 137,133,122,120,120,115,114,112,110,109,109,108,102,101,99,92, 86,86,85,80,80,77,76,74,73,70,70,67,64,63,60,58,54,54,46,41,37, 36,35,35 }; const int n3w1b3r6[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 626,622,621,619,614,612,609,608,608,605,600,595,575,572,571,571, 567,564,563,554,552,551,549,548,544,542,542,538,538,535,533,529, 527,524,524,515,510,510,509,504,502,501,496,490,488,481,480,478, 475,470,469,468,458,454,451,446,446,442,438,436,432,430,422,414, 413,412,411,408,397,389,386,386,385,383,382,373,372,372,371,369, 366,364,362,361,360,360,356,354,351,348,343,338,334,331,326,325, 323,322,320,320,320,320,317,317,316,308,308,305,301,300,299,298, 297,295,295,289,287,285,285,282,281,279,279,266,259,257,257,254, 250,250,249,248,244,243,237,236,225,223,222,219,216,215,210,209, 199,199,196,189,186,185,184,183,182,182,181,176,169,169,168,168, 167,158,156,155,141,141,136,135,132,131,131,131,125,121,118,116, 116,115,107,96,95,93,93,88,84,84,78,78,75,72,65,62,62,60,53,51, 43,43,36,35 }; const int n3w1b3r7[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 627,626,619,616,611,611,611,610,609,608,607,592,592,582,582,579, 575,571,571,566,565,561,558,549,543,542,542,537,530,527,520,514, 513,512,511,505,495,495,493,493,482,481,480,479,473,466,466,460, 460,459,458,458,455,453,445,441,433,431,425,424,418,415,409,409, 407,407,401,400,399,397,393,393,385,380,379,372,369,360,353,351, 347,338,337,330,316,315,309,309,301,300,299,298,297,296,292,287, 287,284,283,274,272,270,269,269,266,264,263,261,258,249,247,238, 235,235,234,234,234,233,218,217,211,210,206,204,202,196,193,188, 188,187,187,180,180,178,177,174,173,168,167,165,162,159,158,157, 157,151,150,148,146,143,143,143,139,137,136,132,125,123,121,120, 114,114,114,106,105,104,101,101,101,99,96,95,93,92,92,89,88,87, 87,87,85,84,83,82,79,78,69,65,64,62,62,58,55,53,43,42,39,38,37, 35 }; const int n3w1b3r8[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 619,616,616,613,613,612,607,607,604,601,590,585,579,578,569,566, 561,561,559,557,551,551,550,546,546,543,535,534,528,524,520,519, 507,505,505,504,503,502,502,501,500,494,492,486,484,481,476,473, 473,470,470,468,467,465,456,455,450,445,442,442,442,437,435,433, 432,432,431,426,421,420,417,407,407,403,398,396,393,390,385,380, 380,379,375,373,371,368,367,357,355,351,346,346,345,342,339,339, 338,334,332,332,331,326,325,317,316,310,307,302,300,300,298,296, 295,293,292,288,286,285,279,271,271,270,267,265,260,259,256,252, 245,241,240,231,230,223,222,222,220,216,215,213,210,205,202,197, 197,194,189,185,184,181,180,174,173,170,162,161,159,158,150,139, 135,134,133,131,127,126,126,123,121,121,119,117,112,108,101,98, 98,91,89,87,87,86,83,82,78,78,67,56,55,55,54,54,52,45,43,41,41, 40,39,35 }; const int n3w1b3r9[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 627,623,620,617,616,611,598,594,594,590,589,584,581,579,575,569, 568,566,563,562,562,554,554,554,553,552,548,548,544,535,534,532, 531,530,528,523,518,516,516,512,508,500,496,496,496,494,494,494, 492,491,485,483,481,479,477,476,475,467,461,459,455,454,448,448, 444,440,439,439,438,437,436,434,431,430,423,422,417,415,409,408, 408,404,400,398,398,398,396,396,394,387,385,384,379,378,378,374, 373,372,368,367,360,359,353,348,348,342,337,331,331,329,329,324, 319,316,315,315,314,312,310,308,308,308,306,297,294,288,284,284, 283,277,268,266,266,264,258,253,252,248,242,236,235,231,229,229, 227,226,224,220,216,214,210,202,201,198,193,192,185,185,184,177, 175,173,173,168,166,163,149,148,148,145,145,138,137,135,134,133, 130,118,116,108,103,102,102,101,96,95,90,83,82,80,80,71,68,64, 62,61,60,54,53,52 }; const int n3w2b1r0[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 240,240,240,240,239,238,238,238,237,236,236,235,234,234,234,234, 234,232,232,232,232,231,231,231,231,230,230,229,229,229,228,227, 226,226,226,225,225,224,224,224,224,223,223,222,222,222,221,221, 221,221,220,220,220,220,220,219,219,219,219,219,218,218,218,217, 216,216,215,215,215,215,215,215,215,214,214,214,213,213,212,212, 211,211,211,210,210,210,210,209,207,207,207,207,206,205,204,204, 204,203,202,202,201,200,200,200,199,199,199,198,198,198,197,197, 197,196,196,195,195,194,194,193,192,192,192,191,191,191,191,191, 190,190,190,189,188,188,188,188,188,186,186,185,184,184,184,183, 183,183,183,182,182,182,181,180,180,180,179,179,178,178,177,177, 176,176,176,176,175,175,174,173,173,172,172,171,171,171,170,170, 170,169,169,168,168,168,167,166,166,165,165,164,164,163,163,163, 163,163,163,163,162,162,162,162 }; const int n3w2b1r1[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 240,239,239,239,238,237,237,236,235,235,234,234,234,233,233,233, 233,232,232,232,232,231,230,229,229,228,228,228,227,227,227,225, 225,225,225,224,224,224,223,223,223,221,221,221,221,221,220,220, 220,220,220,219,219,219,218,218,218,218,217,217,217,217,216,216, 215,215,215,214,213,213,213,213,213,212,212,212,211,211,210,209, 209,209,208,208,208,208,208,207,207,206,206,206,206,204,204,204, 204,204,204,204,204,203,202,202,202,201,201,201,200,200,199,199, 199,199,199,198,197,197,197,197,197,197,196,196,196,196,195,194, 194,193,193,193,193,192,190,190,189,189,189,187,187,186,186,186, 186,185,184,184,184,183,182,182,182,181,181,181,179,178,177,177, 177,176,176,176,176,176,175,175,175,173,173,173,172,172,172,172, 172,172,171,171,171,171,170,170,170,169,169,169,167,167,167,165, 164,164,164,164,164,163,163,162 }; const int n3w2b1r2[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 240,240,240,239,238,238,238,238,237,237,236,236,236,235,235,234, 233,232,232,231,230,230,230,230,229,229,228,228,228,227,226,226, 225,225,224,224,224,224,224,223,223,223,222,222,221,221,221,221, 220,220,219,219,217,217,216,216,216,215,215,215,214,214,214,213, 213,213,212,211,211,210,209,209,209,209,208,208,208,208,207,207, 207,206,206,205,205,205,205,204,204,204,203,203,203,203,203,203, 203,202,202,202,202,201,201,201,200,200,199,199,198,197,197,196, 196,195,195,194,194,194,194,194,193,193,193,193,193,192,191,191, 191,189,189,188,188,188,188,187,187,187,187,186,186,186,186,185, 184,183,183,183,183,183,182,182,182,181,181,181,180,178,178,177, 177,177,176,176,175,175,175,175,173,173,172,172,172,172,172,172, 171,170,169,169,169,169,169,168,167,167,167,165,165,165,165,165, 165,165,164,163,163,163,162,162 }; const int n3w2b1r3[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 240,240,240,240,239,238,238,238,237,237,237,237,236,234,233,232, 232,232,231,231,230,229,228,228,228,228,228,228,227,226,226,225, 225,225,224,224,223,223,223,222,222,222,222,221,221,221,220,220, 219,219,218,218,218,218,217,217,217,217,216,216,215,215,215,212, 212,212,212,212,211,211,211,210,210,210,209,209,209,209,208,208, 208,208,207,207,207,206,206,206,206,205,205,204,204,203,203,203, 202,202,202,202,202,201,201,200,199,199,199,199,198,198,198,198, 197,197,197,196,196,196,194,193,193,193,193,192,192,192,192,191, 191,191,190,190,189,189,189,188,188,188,187,186,186,186,185,185, 185,185,184,184,183,183,182,182,182,182,182,181,181,180,179,179, 179,179,178,177,177,176,175,175,175,175,174,173,173,172,172,172, 170,170,170,169,168,168,168,168,167,167,166,166,166,165,164,164, 164,164,163,163,163,163,163,163 }; const int n3w2b1r4[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 239,238,237,237,237,237,237,237,236,235,235,235,234,233,233,232, 232,231,231,231,230,230,230,229,229,228,228,227,227,227,226,226, 226,226,225,225,224,224,224,223,223,223,222,221,221,221,221,219, 219,219,218,217,217,217,216,216,216,216,214,214,214,214,214,213, 212,211,211,210,210,210,209,209,208,208,206,206,206,205,204,203, 203,203,202,201,201,201,201,200,200,199,199,198,198,198,197,197, 197,197,196,196,196,196,195,195,194,194,193,193,192,191,191,191, 190,190,189,189,189,189,189,189,189,189,188,188,188,188,188,187, 187,187,186,186,185,185,184,183,183,183,183,183,182,181,181,181, 180,180,179,179,179,179,178,177,177,177,176,175,175,174,174,174, 173,173,173,173,172,172,172,172,171,171,171,171,170,170,169,169, 169,168,168,167,167,167,167,167,166,166,166,165,165,165,164,164, 163,163,163,162,162,162,162,162 }; const int n3w2b1r5[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 240,239,239,238,238,238,238,238,238,237,237,236,236,236,236,234, 234,234,233,233,233,233,233,232,230,230,230,229,229,229,229,228, 228,227,227,227,225,225,224,224,223,223,223,222,222,222,222,221, 221,221,220,220,219,219,219,217,217,217,217,217,217,217,216,215, 214,214,214,213,213,213,213,213,213,213,212,212,212,211,211,211, 211,210,208,208,207,207,207,206,206,205,205,202,202,202,202,202, 201,200,199,199,199,199,198,198,198,198,197,197,196,196,196,195, 195,194,194,194,194,194,193,193,193,192,192,191,191,191,190,189, 189,188,188,188,188,187,185,184,183,183,183,182,182,182,181,181, 181,180,180,179,179,179,177,177,177,177,176,175,175,175,175,175, 174,173,172,172,172,172,171,171,171,171,170,170,169,169,169,169, 169,169,169,168,168,168,168,167,167,167,166,166,165,165,164,164, 164,164,163,163,162,162,162,162 }; const int n3w2b1r6[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 240,240,240,240,239,239,238,238,238,237,237,237,237,234,234,234, 233,233,233,232,231,231,231,231,230,230,230,230,230,229,229,229, 229,229,228,228,228,228,228,228,228,227,227,227,226,226,225,225, 225,225,224,223,223,222,221,221,220,220,219,219,218,217,217,217, 216,216,216,216,215,215,215,214,214,213,213,212,212,212,211,211, 211,210,210,209,209,209,208,208,208,208,207,207,207,206,205,205, 205,205,204,203,203,202,202,202,201,200,200,199,199,198,198,198, 198,197,197,196,196,196,194,194,194,194,193,192,192,191,191,190, 190,189,189,189,189,188,187,186,185,184,184,184,183,182,182,182, 182,182,181,181,181,180,178,178,177,177,176,176,176,175,175,175, 175,175,175,175,174,174,174,173,173,173,172,172,171,171,171,171, 171,170,170,170,169,169,169,169,169,168,168,168,166,166,165,165, 165,164,164,164,163,163,163,162 }; const int n3w2b1r7[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 240,240,240,239,239,239,238,237,237,237,237,236,235,234,234,234, 233,233,233,233,233,232,231,231,230,230,230,229,229,226,226,226, 226,226,225,224,224,223,223,222,221,221,221,221,221,220,219,219, 218,218,218,218,218,217,217,217,217,217,217,217,217,216,216,215, 215,215,213,213,213,212,212,212,211,211,209,208,207,207,207,206, 206,206,206,205,205,205,205,205,205,203,203,203,203,202,202,202, 202,201,201,201,199,199,199,198,197,197,197,195,194,194,194,194, 193,193,193,193,192,192,192,191,190,190,190,190,190,190,189,189, 189,188,188,188,188,188,188,187,187,187,187,186,186,186,186,186, 186,185,185,185,183,183,183,182,182,182,181,180,180,180,179,179, 179,179,179,178,178,178,178,178,178,178,177,176,176,176,175,175, 172,172,172,171,171,171,170,170,170,170,169,169,167,167,167,165, 165,165,165,165,164,163,163,163 }; const int n3w2b1r8[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 240,240,240,239,239,239,238,238,238,238,238,237,236,236,236,236, 235,234,234,234,234,233,233,233,232,232,232,231,231,231,231,230, 230,230,229,229,229,227,226,226,226,225,225,225,223,223,223,223, 223,221,221,221,219,219,219,217,217,216,216,216,215,215,214,214, 214,213,213,213,211,210,210,209,209,209,208,208,208,208,208,207, 207,207,207,207,207,206,205,205,205,204,204,204,203,203,203,202, 201,201,201,200,200,200,199,199,198,198,198,197,197,197,196,196, 195,194,194,194,193,192,192,191,191,191,190,189,188,187,186,186, 185,185,185,185,185,185,184,183,183,183,182,182,182,181,180,180, 180,180,179,179,179,179,178,178,177,177,177,176,176,176,176,175, 175,174,174,174,173,173,173,172,171,171,171,171,171,170,170,169, 169,168,168,168,168,168,168,167,166,166,166,166,166,165,165,165, 165,164,164,164,163,163,162,162 }; const int n3w2b1r9[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 240,240,240,239,239,238,238,238,238,238,238,238,237,237,237,237, 236,236,235,235,234,234,232,232,232,232,232,230,230,230,230,230, 229,229,229,229,229,229,228,228,228,225,225,225,225,225,224,224, 224,224,223,223,222,221,221,220,220,220,220,219,219,219,219,218, 217,217,216,215,215,213,213,213,212,212,211,211,211,211,210,210, 210,210,209,209,209,208,207,207,207,205,203,203,202,202,202,201, 200,199,199,199,198,198,198,198,197,197,197,196,196,195,195,195, 194,193,192,192,192,191,190,190,190,190,189,189,189,189,188,188, 188,187,187,187,186,186,185,184,184,184,183,183,182,182,181,181, 181,181,181,180,179,179,178,178,177,177,177,177,176,176,176,176, 175,175,175,175,174,174,174,174,173,173,173,173,173,172,172,171, 171,171,171,170,170,169,169,169,168,168,168,167,167,167,167,167, 166,166,166,164,164,163,162,162 }; const int n3w2b2r0[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 300,300,299,299,298,297,295,295,294,294,293,289,288,287,285,284, 284,282,281,279,277,276,276,275,274,274,272,272,270,269,267,264, 263,263,261,260,260,260,258,255,255,255,255,254,253,250,247,247, 247,246,245,245,244,243,241,241,241,241,239,238,238,238,238,238, 238,237,235,234,233,232,231,231,229,229,229,228,228,226,225,225, 223,221,220,219,217,216,216,216,213,210,208,208,207,205,202,201, 201,201,201,199,199,198,196,195,195,194,194,193,191,189,189,188, 188,187,186,184,184,182,182,181,179,178,177,175,174,173,172,171, 171,171,169,169,168,168,167,167,166,165,164,163,162,158,158,157, 157,156,153,153,151,151,148,147,147,146,146,145,145,144,144,144, 143,141,139,138,137,136,134,134,129,126,125,125,123,122,122,121, 121,121,120,120,118,118,116,114,113,112,111,110,108,108,107,107, 106,106,103,103,103,103,102,102 }; const int n3w2b2r1[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 300,299,298,298,297,297,294,291,290,289,288,288,286,285,283,282, 280,279,277,276,275,274,274,272,272,271,271,269,269,268,268,267, 267,267,265,265,264,263,262,262,259,259,256,253,253,251,249,249, 248,246,246,245,244,242,241,238,237,237,236,235,233,233,232,229, 229,228,228,228,228,227,227,226,225,224,223,223,221,220,220,219, 218,218,218,217,214,212,209,207,205,204,203,202,202,201,200,199, 198,196,195,193,193,192,190,190,189,187,187,187,186,186,185,185, 185,184,183,182,182,182,181,181,181,181,180,178,177,177,175,175, 174,174,174,173,173,172,170,170,168,168,167,166,164,162,161,160, 160,159,156,155,151,150,150,149,149,148,148,148,145,143,140,138, 136,134,133,133,132,131,131,130,129,129,128,126,125,124,124,121, 120,120,118,116,115,115,114,114,113,112,111,111,110,110,110,109, 108,107,107,107,105,104,103,102 }; const int n3w2b2r2[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 299,299,298,298,296,295,295,292,291,289,289,289,288,287,287,285, 285,285,282,281,280,280,278,277,277,276,275,272,271,271,269,269, 268,265,264,261,260,260,260,260,259,258,257,255,254,251,251,250, 250,247,247,240,239,238,237,237,236,236,236,236,235,234,234,231, 231,230,227,227,227,226,225,225,225,223,223,218,217,217,216,216, 215,215,214,213,212,212,210,207,207,206,204,202,202,201,200,198, 195,194,193,191,191,188,188,186,185,185,183,183,181,179,179,177, 176,175,174,174,173,170,169,169,166,166,165,163,161,161,160,159, 158,158,156,156,156,153,153,153,150,149,147,146,146,145,145,141, 140,139,138,137,137,136,136,135,134,134,134,132,132,131,130,130, 130,129,128,128,128,127,126,125,124,124,122,121,121,121,119,119, 117,117,116,116,114,114,114,113,112,112,111,111,110,110,108,107, 106,105,105,104,104,104,103,102 }; const int n3w2b2r3[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 300,297,295,293,288,288,287,286,286,286,284,282,281,281,280,280, 278,276,273,272,271,270,269,269,267,265,265,264,263,261,260,255, 254,254,253,252,251,251,250,248,247,244,238,238,238,237,237,237, 235,235,235,231,231,230,230,230,230,230,229,228,228,227,225,225, 224,223,223,223,220,220,220,219,217,216,216,216,214,214,213,213, 213,207,207,206,205,204,204,203,202,201,201,200,200,199,199,199, 197,197,196,196,195,195,195,195,194,194,193,190,189,188,188,187, 186,185,182,182,180,173,172,171,170,169,168,168,167,166,163,162, 162,161,160,160,158,158,157,156,156,154,153,151,151,150,149,148, 147,145,143,143,143,142,141,139,139,138,138,137,136,136,136,132, 131,131,131,130,129,128,127,127,126,126,125,124,122,120,120,119, 118,116,116,115,115,115,114,113,113,112,112,112,111,111,111,110, 110,109,108,107,106,105,105,102 }; const int n3w2b2r4[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 300,297,294,293,293,293,292,292,290,289,289,288,287,287,286,286, 285,284,284,283,280,280,280,279,278,278,277,277,276,275,275,274, 274,273,272,268,268,267,265,265,265,264,264,262,262,261,261,261, 261,259,256,254,254,251,250,249,249,248,247,245,245,243,240,239, 239,238,237,235,235,231,230,229,229,228,221,220,217,215,215,214, 213,212,211,210,210,210,209,209,209,208,208,206,206,205,205,203, 202,202,201,201,200,200,199,198,196,193,192,192,192,190,188,188, 186,186,186,185,183,181,181,180,179,179,176,175,174,174,173,173, 171,170,168,167,167,166,164,163,163,161,161,160,155,154,152,150, 150,148,147,147,146,146,145,145,145,145,144,144,143,143,142,139, 139,139,139,138,137,135,134,132,127,126,126,126,126,125,125,125, 125,124,124,124,123,123,122,122,122,120,119,118,118,117,114,114, 113,112,111,111,110,107,106,104 }; const int n3w2b2r5[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 297,296,296,296,293,292,292,290,290,289,289,287,284,282,282,279, 278,277,277,275,273,273,268,267,267,266,265,264,264,264,261,260, 260,259,259,259,257,257,256,253,252,252,252,251,251,251,250,249, 245,243,243,243,243,242,242,236,236,236,231,231,231,229,229,229, 227,225,223,223,223,222,222,218,217,217,217,216,215,214,212,211, 210,210,210,210,208,208,207,207,206,204,203,202,199,198,196,196, 195,195,194,191,190,190,190,190,190,187,186,185,184,184,183,183, 183,182,181,181,179,179,179,175,175,175,175,174,174,173,173,173, 172,171,171,169,169,168,168,167,167,166,166,165,163,163,163,162, 160,159,159,159,155,154,153,153,153,151,151,150,149,143,142,141, 141,141,140,138,136,135,132,132,130,130,129,128,128,127,126,125, 125,125,125,122,122,121,121,119,119,118,113,112,112,112,112,111, 110,110,110,109,109,107,103,102 }; const int n3w2b2r6[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 300,298,298,298,298,295,295,293,293,292,290,289,288,288,288,287, 286,286,285,285,284,284,283,283,280,279,279,277,275,273,271,270, 269,268,266,266,265,261,260,260,258,254,253,252,252,252,250,250, 249,249,248,244,244,241,240,238,238,238,235,234,232,231,231,230, 230,227,226,226,225,225,225,224,224,223,223,222,222,222,222,221, 221,220,220,220,220,220,219,219,217,216,215,213,213,212,210,210, 210,206,205,205,204,203,203,203,203,196,193,192,191,188,188,187, 186,185,183,183,182,181,178,176,175,174,173,172,172,171,171,171, 170,167,166,164,164,163,163,161,161,159,157,155,154,153,152,152, 152,151,148,147,146,146,144,144,143,142,141,141,139,139,136,136, 136,135,135,133,132,132,132,127,127,126,123,123,122,121,120,120, 120,118,117,115,114,113,113,112,112,111,111,111,111,110,109,108, 108,107,107,105,104,104,104,102 }; const int n3w2b2r7[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 300,300,297,296,295,295,295,294,292,291,287,286,285,284,283,283, 282,282,282,280,280,278,276,275,275,268,268,267,264,263,262,261, 261,260,259,259,259,258,258,257,253,253,253,251,249,249,249,249, 248,246,246,245,245,245,242,241,241,240,238,237,234,233,233,229, 226,224,224,223,223,223,222,222,221,220,220,218,218,217,217,217, 216,216,216,216,215,214,214,213,213,212,211,210,209,207,207,205, 202,202,201,200,199,198,197,195,195,195,194,194,194,193,191,191, 191,187,186,185,184,178,175,175,175,175,175,174,173,172,171,168, 168,168,166,165,165,164,162,161,161,160,160,157,156,155,155,155, 152,151,150,149,147,144,144,143,142,142,141,141,141,140,139,139, 139,139,139,138,137,136,135,135,134,134,133,132,132,131,131,131, 131,131,130,129,129,126,125,124,122,122,122,120,120,118,117,115, 113,108,107,104,103,103,102,102 }; const int n3w2b2r8[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 300,298,298,297,295,294,293,292,292,290,290,289,289,289,288,288, 288,288,287,287,286,286,286,285,284,283,282,282,282,281,278,277, 276,275,275,274,273,272,272,272,272,271,270,269,268,267,267,266, 266,265,263,263,263,262,260,259,259,258,256,255,254,254,253,251, 249,249,248,247,246,245,245,241,241,238,234,233,233,231,230,228, 227,227,227,225,224,223,223,221,219,219,219,218,217,216,214,214, 214,214,210,209,208,207,204,204,204,203,202,200,199,198,197,194, 194,192,192,192,191,190,190,190,189,188,187,186,185,183,182,181, 181,181,179,178,173,173,171,171,171,169,168,167,167,165,165,165, 163,160,159,158,158,157,157,154,153,153,151,151,151,151,149,148, 146,145,144,142,141,141,141,139,139,139,136,135,134,134,134,131, 130,127,125,123,123,121,120,119,119,119,118,118,116,116,115,115, 112,111,110,107,107,106,105,105 }; const int n3w2b2r9[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 299,299,298,297,294,291,291,291,289,288,288,288,287,286,286,285, 284,284,282,281,281,280,280,279,279,278,277,276,275,275,273,273, 270,268,267,263,261,261,259,259,258,257,256,254,253,251,251,250, 250,249,248,243,240,239,239,238,238,238,237,237,236,235,234,233, 233,233,232,231,229,228,226,226,225,222,221,221,219,219,219,219, 217,216,216,215,214,214,214,214,214,212,211,211,208,204,204,202, 202,202,200,199,198,197,197,196,196,196,195,195,194,193,192,190, 184,184,180,179,178,177,176,176,175,174,173,171,170,169,168,167, 167,167,167,166,166,166,166,165,164,164,163,161,161,159,159,159, 155,154,151,151,149,149,149,147,147,144,143,139,137,137,135,134, 134,134,133,133,133,132,132,130,129,127,127,124,122,120,120,118, 117,115,114,114,114,113,113,113,112,111,111,111,108,108,108,106, 106,105,105,103,103,103,103,102 }; const int n3w2b3r0[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 378,374,373,372,371,371,371,370,362,362,361,358,358,357,356,354, 353,351,351,350,348,346,346,344,341,340,339,338,336,336,334,332, 330,330,328,324,324,321,320,319,318,317,317,316,316,309,309,309, 308,308,307,307,306,304,303,302,301,300,300,299,290,290,289,287, 282,279,272,270,269,267,266,263,262,261,258,257,255,254,253,253, 250,249,246,242,242,242,242,238,238,238,237,235,232,230,230,228, 225,221,221,219,217,213,210,210,209,206,205,203,203,200,199,198, 198,197,195,190,190,187,180,178,177,177,176,167,166,166,165,159, 159,157,155,154,154,153,151,151,151,150,147,141,139,139,138,136, 129,128,128,127,126,125,123,115,110,105,104,101,100,99,96,96, 93,92,92,91,89,89,88,87,86,79,77,76,73,70,68,65,57,54,54,53,49, 48,46,46,42,38,38,37,37,37,34,33,30,30,30,27,25,22,22,22 }; const int n3w2b3r1[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 377,375,373,369,368,362,362,361,360,360,358,357,357,356,355,354, 348,343,340,339,338,336,332,329,328,327,324,321,321,320,320,320, 318,314,311,310,309,305,303,302,302,301,299,297,297,295,292,291, 290,289,289,288,287,286,280,279,277,275,274,265,264,257,257,256, 255,247,247,246,246,243,242,240,240,237,236,232,230,230,229,227, 226,223,221,219,217,213,213,212,209,208,208,207,202,201,200,199, 198,197,193,191,189,188,188,187,184,182,182,181,181,180,180,180, 180,177,176,170,169,169,169,164,164,163,163,156,156,156,153,148, 147,145,141,139,134,134,134,132,128,125,124,123,123,122,121,120, 116,116,116,115,115,113,109,104,104,104,103,102,89,88,86,85,84, 84,84,82,80,77,76,75,74,74,74,73,68,67,66,65,62,62,59,51,49,49, 49,48,48,46,46,44,43,43,42,39,38,33,30,29,27,26,26,24 }; const int n3w2b3r2[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 378,378,377,377,375,374,371,367,367,365,365,361,356,353,349,345, 342,339,337,334,334,330,330,330,329,328,325,325,324,322,317,316, 316,315,313,312,310,307,305,303,300,293,290,284,283,283,281,281, 280,280,278,275,272,270,270,263,260,258,255,253,251,251,251,249, 248,248,246,245,243,242,242,239,239,237,235,234,234,233,232,230, 230,228,227,225,225,224,220,218,217,217,215,210,204,202,201,200, 197,196,195,194,191,180,173,173,172,172,172,170,168,166,163,163, 163,162,161,160,157,155,154,151,148,147,144,144,143,142,142,142, 141,141,141,137,133,132,132,131,131,127,124,122,120,120,117,116, 115,113,112,111,109,108,107,104,103,100,99,98,97,96,94,91,90, 89,89,88,88,87,82,82,80,77,76,75,75,71,67,65,65,63,61,60,58,55, 53,52,51,48,47,47,43,43,37,34,34,31,27,27,26,25,24,23 }; const int n3w2b3r3[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 378,375,370,368,364,364,364,361,360,360,350,349,349,347,345,340, 340,339,339,339,335,332,330,321,321,321,317,316,313,312,311,310, 307,304,303,298,295,294,292,292,279,277,277,274,271,267,267,267, 265,263,262,261,259,256,255,254,253,251,251,250,248,247,246,245, 245,243,242,242,241,239,238,238,236,236,235,234,232,231,230,229, 225,223,223,222,221,220,216,216,216,216,215,213,213,212,210,209, 203,200,198,197,197,192,191,190,187,187,186,185,185,178,178,175, 174,174,172,170,169,165,165,157,156,154,154,154,154,148,148,147, 145,144,142,142,139,136,136,135,134,133,129,129,128,128,127,127, 125,124,124,124,123,122,118,113,112,111,108,108,107,106,101,98, 96,96,94,94,91,89,88,86,82,79,76,72,71,70,67,65,65,63,63,62,61, 60,58,57,55,47,47,47,45,36,35,31,28,28,28,28,28,25,24,23 }; const int n3w2b3r4[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 380,379,378,377,377,373,373,370,369,368,367,365,364,364,361,355, 354,352,351,348,342,340,339,338,337,336,333,329,326,326,325,325, 325,322,321,320,319,319,318,317,317,316,316,311,305,304,301,301, 299,295,293,292,292,288,287,285,285,282,281,281,280,280,279,279, 279,278,272,272,270,267,264,263,255,254,254,251,249,249,245,243, 243,242,241,240,236,233,229,228,228,225,225,222,222,217,216,216, 215,210,210,206,206,205,204,202,202,199,199,198,198,197,196,188, 188,187,185,179,178,177,176,176,175,175,175,174,173,173,171,166, 165,162,161,161,160,159,158,158,158,158,155,154,153,152,149,149, 144,140,139,138,135,131,129,127,127,125,119,118,118,116,116,114, 106,102,98,92,91,91,89,89,86,85,84,83,82,79,77,75,75,71,70,67, 65,59,58,57,56,55,52,41,40,40,36,33,31,30,30,28,27,23,22,22 }; const int n3w2b3r5[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 380,378,378,373,370,370,370,369,368,368,367,366,360,357,354,353, 351,350,348,347,340,340,339,338,337,335,333,328,328,327,324,323, 321,320,316,315,311,311,308,307,300,300,297,297,297,295,294,292, 285,280,280,277,277,275,275,272,266,265,264,264,263,262,261,259, 257,255,255,249,249,245,244,244,243,243,242,241,241,240,238,238, 237,234,228,227,226,226,225,224,224,221,220,218,217,217,217,214, 211,209,206,203,203,202,202,201,201,200,197,196,189,188,188,187, 186,186,186,185,179,178,177,172,167,165,165,163,161,159,158,158, 157,156,155,155,152,149,146,144,140,139,138,130,128,127,125,122, 120,117,117,115,113,109,105,103,103,99,99,96,94,93,92,92,91,90, 88,82,81,80,76,74,73,67,66,66,66,59,58,57,56,56,55,53,52,51,50, 49,48,44,43,40,39,38,35,34,33,29,29,27,26,24,24,22 }; const int n3w2b3r6[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 379,378,372,372,372,370,370,368,368,365,364,364,363,358,357,356, 355,353,348,344,343,343,341,340,339,339,336,332,331,331,325,323, 323,323,321,320,319,318,316,315,313,312,306,304,302,301,301,298, 297,296,292,292,290,288,286,286,285,283,277,272,270,267,266,266, 261,261,258,256,254,253,252,252,252,251,250,249,248,242,242,236, 236,235,233,230,230,226,225,223,220,219,215,213,208,206,203,202, 201,200,199,196,193,192,191,187,184,183,183,181,175,174,173,173, 172,172,172,172,171,167,167,167,166,165,165,163,163,161,157,156, 156,154,151,143,136,134,131,129,125,125,124,120,120,118,117,116, 115,113,113,112,112,112,108,105,104,103,102,99,97,97,96,95,88, 87,86,85,83,76,73,71,69,69,68,68,68,66,63,61,61,55,54,53,52,52, 52,47,47,44,43,42,41,41,39,36,34,33,31,31,31,27,23,22 }; const int n3w2b3r7[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 380,378,377,377,376,375,372,370,366,364,364,362,357,357,357,356, 354,354,352,350,350,346,346,343,342,341,341,340,338,334,332,332, 332,330,329,328,326,326,322,321,320,319,318,318,317,314,313,305, 304,303,302,300,293,292,292,291,288,287,287,286,285,284,280,277, 276,275,275,262,261,259,259,258,257,253,249,249,248,242,237,236, 232,230,230,229,229,224,223,220,217,217,217,216,215,214,209,207, 206,205,203,203,202,200,200,200,196,196,194,192,189,188,186,186, 182,182,182,181,181,177,175,174,172,168,164,160,160,160,159,157, 156,156,154,152,151,148,146,145,138,136,135,134,134,132,131,129, 127,125,124,123,119,115,112,107,106,105,105,104,102,99,98,98, 96,93,93,89,87,86,84,82,79,79,78,77,77,70,70,69,69,67,65,60,59, 59,59,56,53,50,49,49,47,43,43,42,38,37,32,32,31,30,28,24 }; const int n3w2b3r8[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 378,378,375,374,373,366,363,362,359,358,353,352,350,348,348,347, 345,343,339,339,330,329,323,323,322,321,320,318,317,315,314,313, 311,308,306,301,298,297,292,292,292,291,283,283,282,281,281,269, 266,266,266,265,265,262,258,256,256,252,247,246,244,242,241,241, 241,239,239,237,235,235,231,231,229,228,224,223,223,221,220,218, 212,210,210,207,207,206,205,205,202,200,193,193,193,190,189,189, 188,188,187,187,186,184,182,180,178,178,177,175,173,172,172,171, 169,167,167,162,161,159,159,159,158,157,156,155,154,153,152,151, 149,149,149,146,146,145,144,144,142,137,137,135,134,133,132,132, 128,124,124,123,120,116,116,115,115,110,107,107,103,101,98,96, 91,91,86,84,83,83,82,79,75,74,74,72,72,65,62,61,59,59,54,52,50, 47,46,45,43,43,41,39,39,39,37,35,34,33,31,30,29,28,26,22 }; const int n3w2b3r9[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 378,376,373,372,372,372,372,370,367,367,362,358,355,355,354,350, 346,344,340,340,339,336,335,334,334,334,334,333,329,328,321,318, 317,317,316,316,311,308,306,303,302,300,299,299,298,297,294,293, 292,285,278,278,277,276,275,274,270,268,267,263,261,259,255,253, 252,251,251,251,246,244,242,241,240,239,238,238,237,235,234,233, 232,232,230,225,224,222,216,215,213,210,204,197,193,185,176,176, 174,173,172,172,171,168,165,160,160,158,156,156,154,153,152,151, 151,151,150,148,146,145,144,143,143,140,140,138,138,135,134,133, 128,127,126,122,122,120,119,119,115,115,113,111,110,110,107,106, 106,105,105,103,103,102,102,102,101,99,99,98,94,93,93,93,92,91, 90,89,89,88,87,85,82,81,81,79,78,78,75,75,72,72,71,69,66,62,59, 58,57,56,52,52,48,45,41,41,37,33,31,30,29,26,24,23 }; const int n3w3b1r0[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 168,168,167,167,166,166,166,166,165,164,163,163,163,163,163,163, 162,162,162,162,162,161,160,160,160,160,160,159,159,159,159,159, 159,159,159,159,158,158,157,157,157,157,157,157,156,156,156,156, 156,155,155,155,155,154,154,154,154,153,153,152,152,152,152,152, 152,151,150,150,148,148,148,148,148,148,147,147,147,147,146,146, 146,145,144,144,143,143,143,143,143,142,142,141,141,141,140,140, 140,139,139,139,139,139,139,139,138,138,137,137,137,136,136,136, 136,135,135,135,134,134,134,133,133,133,133,132,132,132,132,132, 131,131,131,130,130,130,130,130,130,130,129,129,129,129,128,128, 128,127,127,127,126,126,126,126,125,125,125,125,124,124,124,124, 124,124,123,123,123,122,122,122,122,122,121,120,120,119,119,119, 119,119,118,118,118,118,117,117,117,116,116,116,116,115,115,115, 115,115,115,115,115,114,114,114 }; const int n3w3b1r1[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 168,168,168,168,168,167,167,167,167,166,166,165,165,165,165,164, 164,164,163,163,163,163,162,162,161,161,161,161,160,160,160,160, 160,158,158,158,158,157,157,157,157,157,156,156,156,156,156,155, 155,154,154,153,153,152,152,152,152,151,151,150,150,150,150,149, 149,148,147,147,147,147,146,146,146,146,146,146,145,145,145,145, 144,143,143,143,143,143,142,142,141,141,140,140,140,140,139,139, 139,138,138,138,137,137,137,137,136,136,136,136,136,136,135,135, 135,134,134,134,134,134,133,133,133,133,132,132,132,132,132,132, 132,132,132,131,131,131,131,131,131,130,130,130,129,129,129,128, 128,128,128,128,127,127,127,126,126,126,126,125,124,123,123,123, 123,122,122,122,122,122,122,122,121,121,121,121,120,120,119,119, 119,119,119,118,118,117,117,117,117,117,117,116,116,116,116,116, 116,116,115,115,114,114,114,114 }; const int n3w3b1r2[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 168,168,168,168,168,167,167,167,167,166,166,165,165,165,165,165, 165,164,164,164,163,163,162,161,161,160,160,160,160,159,159,159, 159,159,158,158,158,158,158,158,158,157,157,157,157,157,157,156, 156,155,155,155,155,155,154,154,154,154,153,153,153,153,153,153, 152,152,151,151,151,151,150,150,150,150,150,149,149,149,149,148, 148,148,148,148,147,147,147,147,147,147,146,146,146,146,145,145, 145,144,144,143,143,143,143,143,142,142,142,142,141,140,140,139, 139,139,139,138,138,138,138,138,138,137,136,136,135,135,135,135, 135,134,134,133,133,133,132,131,130,130,129,129,129,128,128,127, 126,126,126,126,126,125,125,125,125,125,125,124,123,123,123,123, 123,122,122,122,122,122,122,121,121,121,121,120,120,120,120,120, 120,119,119,119,119,118,117,117,117,117,117,117,116,116,116,115, 115,115,115,115,114,114,114,114 }; const int n3w3b1r3[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 168,168,168,168,168,168,168,167,167,167,165,165,164,164,164,164, 164,163,163,163,163,162,162,162,162,161,161,161,161,160,160,159, 159,158,158,157,157,156,156,156,156,155,155,155,155,155,154,154, 154,153,153,152,152,151,151,151,151,151,151,151,151,150,150,150, 149,149,149,148,148,148,148,148,147,147,147,146,146,145,145,145, 144,144,144,144,143,143,143,143,142,142,142,142,142,142,141,141, 141,141,141,141,141,140,140,140,140,140,140,139,139,139,138,138, 138,137,137,137,137,137,136,136,136,136,135,135,135,135,135,134, 134,134,134,133,133,133,133,133,133,133,132,132,132,131,130,130, 130,130,130,130,130,130,129,128,128,127,127,126,126,125,125,125, 125,125,125,125,124,124,124,124,124,123,123,123,123,122,122,122, 121,121,120,120,120,118,118,117,117,117,117,116,115,115,115,115, 115,115,115,114,114,114,114,114 }; const int n3w3b1r4[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 168,167,167,167,166,166,165,165,165,164,163,163,163,163,162,162, 162,162,162,161,161,161,161,161,160,160,160,160,160,160,160,159, 158,158,158,158,157,157,157,157,157,156,156,155,155,155,155,155, 155,154,154,154,154,154,153,153,153,153,153,153,152,152,152,152, 152,151,151,151,151,150,150,150,150,150,149,149,148,147,147,147, 146,146,146,145,145,145,145,144,143,143,143,142,142,142,142,142, 142,142,142,142,141,141,141,140,139,139,139,139,139,139,138,137, 137,137,137,137,136,136,136,136,136,135,135,134,133,133,133,133, 132,132,132,132,131,131,131,130,130,130,130,130,130,129,129,128, 128,128,128,127,127,127,127,126,126,126,126,126,125,125,125,125, 125,124,124,124,124,124,123,123,123,123,123,123,122,122,122,121, 121,121,121,120,119,119,119,119,118,118,117,117,116,116,116,116, 116,115,115,115,114,114,114,114 }; const int n3w3b1r5[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 168,168,168,167,167,167,167,167,166,166,166,166,165,164,164,164, 164,162,162,161,161,161,160,160,159,159,159,159,159,159,159,158, 158,158,158,158,157,157,157,157,156,156,156,156,155,155,155,155, 155,155,155,155,154,154,154,154,154,154,153,153,152,152,152,151, 150,150,149,149,149,149,149,148,148,147,147,147,147,146,146,146, 145,145,145,144,144,144,144,143,143,143,143,143,142,142,141,141, 141,141,140,140,140,139,139,138,138,138,138,138,138,138,138,137, 137,137,136,136,136,135,135,135,135,135,135,134,134,133,133,133, 133,133,132,132,132,132,131,131,131,131,131,130,130,130,130,130, 129,129,129,128,128,128,128,128,128,127,127,127,127,127,126,126, 126,125,125,125,124,124,124,124,123,122,122,121,121,121,121,120, 120,119,119,119,117,117,117,117,117,116,116,116,116,116,116,116, 116,115,115,115,115,115,114,114 }; const int n3w3b1r6[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 168,168,168,168,168,167,167,167,166,166,166,166,166,165,165,165, 165,165,164,164,163,163,162,162,162,162,162,162,162,161,161,161, 160,160,160,160,160,160,160,160,160,160,159,159,159,159,159,159, 159,159,159,157,157,156,156,155,155,155,155,155,154,154,153,153, 152,152,152,151,151,151,149,149,148,148,148,148,148,147,147,147, 145,144,144,143,143,142,142,141,141,140,140,139,139,139,139,139, 139,138,138,138,138,138,137,137,137,137,137,137,136,136,136,135, 135,135,135,134,134,134,134,133,133,132,132,132,132,132,131,131, 130,130,130,130,130,129,129,128,128,128,128,127,127,126,126,126, 126,126,126,125,125,125,125,125,124,124,124,124,123,123,123,123, 123,122,122,122,122,122,122,121,121,121,121,121,121,121,119,119, 119,119,119,119,119,118,118,118,118,118,118,117,117,117,116,116, 116,116,116,115,115,115,114,114 }; const int n3w3b1r7[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 168,168,168,168,168,168,168,167,167,167,167,166,166,165,165,165, 164,164,163,163,163,162,162,162,162,161,161,161,161,161,161,161, 160,160,160,160,160,160,158,158,158,158,158,158,157,157,157,157, 157,156,156,156,154,154,154,154,153,153,153,152,152,151,151,151, 151,150,150,150,149,149,149,149,149,149,149,148,148,148,148,148, 147,147,147,147,147,147,147,146,146,146,146,146,145,145,145,145, 144,144,144,144,144,144,144,144,143,143,143,142,141,141,141,140, 140,140,140,139,139,138,138,138,138,138,138,138,138,137,137,137, 137,137,137,136,136,136,135,135,134,134,133,133,132,132,131,131, 131,131,131,130,130,129,129,129,128,128,127,127,127,127,126,126, 126,126,126,125,124,124,124,123,123,123,122,122,122,121,121,120, 120,120,120,120,119,119,119,119,118,118,117,117,117,116,116,116, 116,116,116,116,115,115,115,115 }; const int n3w3b1r8[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 168,168,167,167,166,166,165,165,165,165,165,165,165,164,163,163, 163,163,163,162,162,161,161,160,160,160,160,160,160,159,159,159, 158,158,157,157,156,156,156,156,155,155,155,155,155,155,154,154, 154,153,153,153,152,152,152,152,152,152,151,151,151,150,150,150, 149,149,149,149,148,148,148,148,148,148,147,147,147,147,147,147, 146,146,146,146,145,144,143,142,142,142,142,142,142,142,141,141, 141,140,140,140,140,140,139,139,139,139,139,138,138,138,138,138, 138,137,136,136,136,136,135,134,134,134,134,133,133,133,133,133, 132,132,132,132,132,131,131,131,131,130,130,130,130,130,130,130, 130,130,130,129,129,129,129,128,128,127,127,127,127,127,127,127, 126,126,126,126,125,125,125,124,124,124,123,123,123,122,122,122, 121,121,121,120,120,120,120,119,119,118,118,118,118,117,117,116, 116,116,116,115,115,115,114,114 }; const int n3w3b1r9[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 168,168,167,167,167,167,166,166,166,165,165,165,165,165,164,164, 164,164,163,163,163,162,162,162,162,162,161,161,160,160,160,160, 160,159,159,159,159,158,158,158,157,157,157,157,156,156,155,155, 155,155,155,155,155,155,155,155,154,154,153,153,153,153,152,152, 151,151,150,150,150,150,150,150,149,149,148,148,148,148,148,148, 148,148,148,147,147,147,146,146,146,146,146,145,145,145,145,144, 144,143,143,142,142,142,141,141,140,140,140,140,140,140,139,139, 138,138,138,138,137,137,136,136,136,136,136,136,136,135,135,135, 134,134,134,133,133,132,131,131,131,130,130,130,130,130,129,129, 129,129,128,128,128,128,128,128,127,127,127,127,127,126,126,126, 126,126,126,125,125,125,125,125,125,123,123,123,123,123,122,122, 122,122,122,122,121,121,121,119,118,118,117,117,117,117,117,117, 117,115,115,115,114,114,114,114 }; const int n3w3b2r0[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 210,209,208,207,207,207,207,206,205,205,204,203,202,201,200,199, 198,198,198,197,197,197,197,197,197,195,195,193,193,193,192,192, 190,189,189,188,187,187,186,185,185,185,183,181,179,179,178,177, 177,176,175,175,175,174,174,174,172,171,170,169,169,168,168,168, 167,166,166,166,166,166,164,164,163,162,162,162,161,160,159,159, 158,157,156,156,155,155,154,153,153,152,151,151,150,150,149,148, 147,147,147,146,145,145,145,144,144,142,142,142,142,141,140,139, 138,138,138,135,133,131,131,131,129,129,128,126,125,124,123,122, 121,121,120,118,118,117,117,115,115,115,114,114,113,111,111,111, 110,110,109,106,106,105,105,104,102,99,99,98,98,96,96,95,94,93, 93,93,93,91,89,89,88,88,88,87,86,86,85,85,84,84,83,83,83,83,82, 81,80,79,79,79,78,78,76,76,76,76,76,76,75,74,74,72 }; const int n3w3b2r1[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 210,210,210,209,207,206,205,205,204,204,203,202,202,202,201,200, 198,198,198,198,198,197,196,193,193,192,192,191,191,190,190,189, 188,188,187,186,186,184,184,184,183,183,183,183,182,182,181,181, 180,180,179,178,177,177,177,175,175,175,173,173,172,171,171,169, 168,167,167,167,166,166,165,165,163,162,161,160,159,157,157,157, 155,154,154,154,151,150,149,148,148,147,146,144,144,142,140,140, 139,138,138,137,137,137,136,136,135,135,135,133,132,131,131,130, 129,127,126,126,125,124,124,124,123,123,123,122,122,120,120,120, 120,120,120,118,117,117,116,116,114,113,113,113,112,111,108,107, 107,106,105,105,105,103,103,102,101,101,101,100,100,100,99,99, 98,98,98,95,94,94,94,93,91,89,88,87,87,87,85,85,85,85,85,84,82, 80,79,79,78,78,78,77,76,75,75,75,74,74,74,74,73,73,73,72 }; const int n3w3b2r2[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 210,210,210,210,208,208,207,207,206,205,205,205,203,202,202,201, 200,200,200,200,199,199,199,199,198,198,198,197,197,197,195,193, 193,192,192,191,190,188,187,185,184,183,182,179,179,178,177,176, 176,174,173,173,173,173,173,172,172,171,169,169,169,169,168,168, 167,166,166,165,164,164,164,163,163,162,162,162,162,162,161,160, 158,158,157,157,156,155,153,151,150,150,147,147,145,144,141,140, 138,137,137,136,135,135,134,128,127,126,125,125,125,125,124,124, 122,122,122,121,119,118,118,118,117,117,116,116,116,115,115,114, 113,111,110,110,110,110,109,109,109,109,109,108,108,108,108,107, 107,106,106,105,105,104,103,101,101,101,99,98,97,96,95,95,94, 94,94,94,94,94,93,93,92,92,91,91,91,87,86,86,85,83,83,83,82,82, 81,80,80,79,79,79,79,77,77,77,76,76,76,75,74,73,73,72 }; const int n3w3b2r3[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 210,209,208,208,208,207,207,207,206,205,205,204,204,204,204,203, 202,202,202,201,201,201,201,200,200,199,198,197,196,194,194,192, 191,191,188,188,188,188,188,187,187,186,186,182,181,181,181,180, 179,177,176,176,173,172,172,172,171,168,168,167,167,166,166,166, 165,165,164,163,163,163,159,159,158,158,158,158,157,156,156,154, 152,152,151,150,150,149,149,149,148,147,147,147,146,146,145,142, 142,141,140,140,140,140,139,139,138,138,137,136,135,135,134,134, 133,133,132,131,131,129,127,127,127,127,126,123,122,119,119,119, 119,119,119,118,118,117,116,115,115,115,115,115,114,114,114,113, 112,111,111,110,110,109,106,106,105,105,105,103,103,103,101,101, 101,100,95,94,94,92,91,90,90,89,89,89,89,88,87,87,86,85,85,85, 85,84,83,83,82,82,80,79,79,77,76,75,75,75,74,74,74,74,74,72 }; const int n3w3b2r4[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 210,210,210,208,207,207,207,206,206,206,205,205,205,205,204,204, 203,203,202,201,201,200,200,198,198,198,197,196,196,194,192,192, 192,190,190,189,189,188,187,187,187,186,186,186,185,185,184,184, 183,182,182,181,181,180,179,179,179,178,177,177,177,176,175,175, 174,173,173,172,170,169,169,168,167,167,167,166,166,165,164,164, 162,159,158,158,157,157,156,155,154,152,151,150,150,150,149,148, 148,147,147,146,146,146,146,146,146,145,145,143,143,142,140,140, 138,138,136,136,135,134,133,133,133,132,132,131,131,130,129,129, 129,127,127,127,124,124,122,122,121,121,119,119,118,117,116,115, 114,114,114,113,113,112,112,112,111,109,108,106,102,102,101,101, 100,100,99,99,97,97,96,95,95,94,93,93,93,92,92,91,91,90,89,89, 89,88,86,86,86,85,84,84,84,82,82,82,81,81,77,76,75,74,74,72 }; const int n3w3b2r5[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 207,206,206,206,206,204,202,202,201,201,200,199,199,197,195,195, 194,194,193,191,190,189,189,189,189,188,188,187,187,185,184,184, 182,181,181,180,179,178,178,176,176,175,175,174,173,173,173,172, 171,171,168,168,166,166,165,164,164,163,163,163,163,163,161,161, 161,160,159,158,158,158,157,157,157,157,156,154,154,153,152,152, 151,150,150,150,150,150,149,147,147,147,147,147,146,145,144,144, 144,144,143,143,141,141,140,140,140,139,139,138,138,138,138,138, 137,137,136,135,135,135,135,135,134,134,133,133,133,133,129,129, 129,127,126,126,125,124,123,123,123,121,120,120,119,119,118,118, 117,116,116,114,113,111,110,109,109,106,106,104,104,104,103,102, 102,101,100,100,99,99,99,99,98,98,97,97,97,95,94,94,93,92,92, 91,89,88,88,88,88,87,86,86,85,84,83,81,81,81,80,78,76,76,74,73 }; const int n3w3b2r6[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 210,210,209,209,207,207,206,205,205,204,204,204,204,204,202,200, 199,198,198,197,196,196,196,196,195,195,195,194,193,192,191,190, 189,189,188,188,187,185,185,184,184,184,183,182,182,181,181,180, 179,179,179,179,176,176,175,174,174,171,171,171,171,170,170,169, 168,167,167,165,163,163,162,160,160,159,158,158,155,154,153,153, 152,151,151,150,150,150,149,148,148,148,148,148,146,145,145,145, 145,145,144,143,142,141,141,141,141,140,140,140,139,138,138,136, 136,136,135,135,135,134,134,134,128,127,127,126,126,125,124,124, 124,124,123,121,121,120,120,119,118,118,117,116,116,114,114,114, 112,112,112,109,108,106,106,104,104,102,101,100,100,100,99,99, 99,98,96,96,93,93,93,93,93,93,92,92,91,91,89,89,87,87,87,87,86, 86,84,84,82,81,79,78,78,78,78,77,77,76,76,74,74,73,73,72 }; const int n3w3b2r7[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 209,208,208,208,207,207,207,206,206,204,204,204,204,203,203,203, 203,201,200,199,199,198,196,196,196,195,195,195,194,193,191,189, 188,188,186,186,185,184,184,183,183,183,181,181,180,180,177,177, 176,176,175,174,173,172,172,171,170,170,170,169,167,166,166,163, 163,162,161,160,159,159,159,159,158,157,157,157,157,157,156,155, 155,154,154,152,152,150,150,147,144,143,143,143,141,140,138,138, 138,136,135,134,133,133,130,130,129,129,129,128,127,126,126,125, 124,122,122,121,120,120,120,120,118,117,116,116,116,115,115,115, 113,112,112,112,111,111,110,110,110,109,109,108,108,106,106,105, 104,104,103,103,103,101,99,99,98,97,96,95,95,95,94,93,93,93,93, 92,92,92,91,90,90,89,88,88,87,87,87,86,86,84,84,84,84,84,83,82, 80,80,79,78,78,76,76,76,75,75,75,74,74,73,72,72 }; const int n3w3b2r8[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 209,209,209,207,206,206,205,205,204,204,202,202,202,202,202,201, 200,199,198,196,196,195,194,192,192,191,190,189,188,188,186,185, 184,184,183,183,182,182,181,180,179,178,177,177,177,177,177,176, 176,175,174,174,174,174,173,173,172,172,170,169,168,167,166,165, 164,162,162,161,161,160,160,160,160,159,158,157,157,157,156,156, 155,155,155,154,154,154,153,152,151,151,150,149,146,146,146,145, 144,143,143,142,142,140,140,138,133,132,131,131,130,130,126,125, 125,124,123,122,122,120,120,119,118,118,115,115,113,113,111,111, 111,111,111,111,111,109,109,109,108,108,107,107,105,105,105,105, 105,102,101,101,101,101,100,99,99,98,97,97,97,97,96,95,95,93, 92,91,91,91,90,90,89,89,89,88,84,84,83,83,83,82,82,82,82,80,80, 80,80,78,78,78,78,78,77,75,75,75,74,74,73,73,73,72 }; const int n3w3b2r9[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 209,208,207,207,207,207,206,204,203,202,201,201,201,199,199,199, 197,196,196,195,194,194,193,192,192,192,191,191,191,189,189,187, 187,186,186,185,184,183,182,182,182,182,181,179,178,177,177,177, 176,176,175,174,174,174,174,172,170,170,169,169,168,168,167,167, 167,166,166,165,165,164,164,164,163,163,163,162,162,162,161,161, 161,160,159,158,157,156,156,156,156,155,154,153,152,150,149,149, 148,146,146,146,146,145,144,144,143,143,142,142,142,141,141,139, 139,137,136,136,135,135,135,133,133,132,132,132,131,129,127,127, 125,125,124,124,123,122,122,122,121,120,118,118,118,115,114,114, 113,111,110,109,106,106,104,102,102,102,102,101,101,100,99,98, 97,96,96,95,95,95,95,94,94,93,92,92,90,90,88,88,88,87,85,83,83, 82,82,82,81,79,79,77,77,77,76,75,75,75,74,74,74,72,72,72 }; const int n3w3b3r0[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 263,260,260,259,258,256,254,253,252,251,249,248,246,243,243,241, 239,239,238,237,235,235,232,232,227,227,225,225,223,221,220,219, 217,216,216,215,214,211,211,211,208,208,208,208,207,206,206,205, 203,202,197,197,195,195,194,192,192,191,190,188,188,185,182,181, 181,181,180,180,179,177,176,174,172,170,169,165,165,164,163,161, 159,159,158,157,154,152,149,148,148,146,144,143,142,137,137,133, 132,130,130,124,123,123,121,121,119,119,112,111,110,109,108,108, 105,105,104,103,102,101,99,98,98,97,96,95,95,94,93,88,87,83,81, 80,79,78,78,77,77,76,75,75,74,73,72,72,71,67,66,65,64,63,58,58, 57,54,54,54,53,53,53,52,52,52,50,50,49,49,49,48,47,47,46,45,45, 45,43,42,39,37,37,37,36,36,36,35,34,34,31,30,29,28,28,24,24,20, 20,20,19,19,17,17 }; const int n3w3b3r1[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 265,264,262,261,260,259,259,258,258,255,254,250,250,249,248,245, 244,244,242,241,238,235,234,227,227,225,224,224,224,223,222,222, 219,218,217,216,215,212,212,210,206,206,205,203,201,201,199,198, 197,196,196,196,195,194,193,193,191,191,190,190,188,187,184,183, 181,179,178,176,173,172,172,172,169,169,167,163,162,160,157,156, 155,154,152,151,149,149,149,145,144,144,143,142,142,142,141,139, 135,134,133,133,131,130,130,127,126,120,119,119,115,113,113,112, 105,105,104,101,100,99,98,96,96,95,94,94,91,89,88,86,86,86,84, 83,76,75,74,73,72,72,72,69,68,66,65,65,63,63,62,62,58,57,56,56, 56,55,54,53,52,52,52,51,51,51,51,49,47,47,46,46,45,44,43,42,41, 40,39,38,38,38,38,38,37,37,36,35,34,34,30,29,27,27,24,23,23,23, 20,20,20,20,16,16 }; const int n3w3b3r2[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 266,264,263,262,261,258,258,254,253,252,251,250,250,250,247,246, 245,243,242,241,239,236,235,234,232,231,230,228,226,225,225,225, 223,221,220,217,216,215,214,214,211,210,209,208,207,206,205,202, 202,202,201,200,200,199,199,198,197,197,196,196,194,190,188,188, 187,184,183,183,182,182,181,180,179,179,179,176,176,176,175,174, 174,173,172,171,170,170,169,169,168,166,165,162,162,162,160,160, 159,158,156,155,154,154,153,152,152,151,151,149,149,148,147,147, 143,143,142,142,141,135,134,131,130,126,124,124,123,121,120,120, 117,115,114,111,109,109,107,106,105,104,103,103,103,97,94,94, 92,88,83,83,81,78,77,76,76,74,74,73,71,70,65,64,63,62,62,61,60, 59,56,54,54,51,51,51,50,48,45,43,42,42,42,40,40,39,37,32,31,30, 29,29,28,27,25,25,24,22,22,21,21,19,18,17 }; const int n3w3b3r3[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 265,265,262,262,262,260,259,259,256,251,251,251,249,248,246,245, 244,241,239,238,238,238,238,237,237,232,226,224,222,220,219,218, 217,217,216,214,212,211,209,208,208,208,207,206,205,204,204,203, 203,201,198,197,197,197,191,191,189,188,188,187,187,182,180,180, 180,179,179,177,175,175,175,173,173,173,173,173,168,167,166,166, 166,165,163,162,159,158,158,158,157,155,153,153,151,151,151,150, 150,149,149,148,144,143,142,138,135,135,135,134,134,133,132,130, 129,127,126,126,123,121,121,120,118,118,116,116,115,113,113,112, 111,110,109,108,108,107,106,105,104,100,99,99,98,98,97,97,92, 91,90,90,88,88,84,84,84,80,76,74,73,71,69,69,68,68,67,67,66,65, 64,63,63,62,59,59,58,58,57,57,56,55,53,52,52,49,47,46,44,44,40, 36,32,31,29,29,28,27,24,23,21,20,18,16 }; const int n3w3b3r4[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 264,263,262,261,260,260,259,255,255,255,253,252,250,248,243,242, 241,241,241,236,235,234,233,232,231,230,230,226,226,225,225,224, 224,221,220,218,216,210,208,206,205,203,203,203,200,196,196,196, 195,192,192,190,189,189,188,188,187,186,184,184,183,182,180,179, 179,175,175,173,173,172,171,170,169,169,166,165,163,162,162,162, 160,160,160,159,159,158,158,157,157,156,153,151,149,149,149,148, 148,147,147,146,146,146,144,143,142,141,141,139,139,139,138,138, 138,137,133,132,132,132,126,125,123,121,121,119,119,119,118,118, 118,116,115,113,109,108,106,105,104,102,100,99,99,97,97,97,97, 93,93,91,88,85,84,84,83,83,82,81,80,80,79,77,75,73,73,69,69,68, 66,66,64,63,62,61,57,55,54,53,52,50,49,47,46,45,43,42,37,36,35, 35,34,34,31,28,28,26,24,24,24,22,18,17 }; const int n3w3b3r5[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 266,265,265,261,258,258,256,256,252,250,250,250,249,248,247,246, 246,245,241,241,238,235,234,228,228,227,227,227,225,225,224,222, 221,221,217,216,215,214,214,213,209,206,204,204,204,201,201,196, 195,195,195,194,194,193,192,191,191,191,191,191,191,190,187,187, 185,183,183,180,178,177,176,175,172,171,170,170,168,167,167,166, 165,164,164,161,157,156,154,153,153,148,147,146,145,143,143,141, 141,139,139,138,138,135,134,131,128,128,128,127,127,127,126,125, 123,123,119,118,115,115,113,113,111,108,107,106,104,99,99,97, 94,92,91,88,88,87,87,86,86,85,84,84,81,81,79,79,78,78,77,75,74, 70,69,69,68,66,65,64,64,62,61,61,60,59,54,54,53,52,49,46,46,45, 44,44,43,41,39,37,35,35,34,34,33,33,33,32,31,29,29,29,28,28,28, 28,27,25,25,24,23,22,21,21 }; const int n3w3b3r6[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 266,264,264,264,264,263,262,262,258,258,256,255,254,252,252,250, 250,249,248,248,247,245,243,241,237,236,234,233,229,229,229,229, 229,227,227,227,226,226,225,223,223,220,220,219,219,219,216,212, 209,208,207,206,204,203,202,197,197,196,193,191,190,190,188,187, 185,183,182,182,178,177,174,173,171,170,170,169,169,166,165,162, 161,161,161,159,156,155,153,150,150,148,148,147,147,147,146,144, 143,143,142,139,138,138,137,137,137,133,133,132,132,128,128,126, 124,122,121,121,120,117,116,115,115,115,115,114,111,111,107,107, 106,105,103,100,100,100,98,98,96,96,93,91,91,90,89,87,83,79,79, 79,78,77,75,69,69,67,67,67,67,64,61,61,58,56,55,54,53,52,51,51, 51,50,49,48,46,46,46,46,45,44,43,42,41,37,36,36,36,36,35,34,33, 31,30,29,28,26,25,23,23,21,18,17 }; const int n3w3b3r7[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 266,263,263,261,259,259,258,258,255,255,254,252,248,248,247,246, 245,243,241,236,236,234,234,233,230,230,229,229,228,227,225,224, 223,221,220,220,218,217,216,216,215,215,214,213,213,212,211,210, 210,209,209,209,207,206,205,202,202,201,201,201,200,199,195,194, 191,190,189,188,186,179,178,178,178,178,177,176,174,173,171,168, 168,166,166,166,164,162,161,161,160,158,156,155,153,153,152,150, 150,149,149,149,146,144,141,140,138,138,138,137,135,134,132,130, 128,125,119,119,118,117,112,111,111,110,109,107,106,105,102,102, 99,99,98,97,96,95,93,92,91,90,89,88,85,84,84,84,83,83,83,82,79, 78,77,75,74,74,73,73,62,62,61,58,56,55,55,54,54,52,50,49,47,43, 42,42,42,41,40,39,38,34,34,33,32,29,29,28,27,26,26,25,24,24,23, 23,21,21,20,17,17,17,16,16 }; const int n3w3b3r8[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 266,264,260,260,259,258,257,255,251,251,246,244,244,244,243,242, 242,240,238,238,237,236,235,232,232,231,231,229,228,228,227,227, 227,227,223,222,220,218,217,214,212,212,211,210,210,209,207,207, 203,202,202,201,200,196,196,194,194,192,191,189,188,188,187,181, 179,179,178,178,177,176,175,174,173,173,172,171,170,169,168,168, 168,167,167,159,159,158,157,157,156,156,156,152,152,151,151,150, 148,148,147,146,146,144,143,142,142,141,141,139,139,137,135,134, 134,133,133,128,127,126,123,123,123,119,119,118,117,117,115,113, 113,112,111,110,110,108,108,107,106,106,103,102,100,99,98,97, 97,97,96,91,90,88,88,88,88,82,81,81,78,76,75,75,75,74,74,73,72, 70,69,68,68,65,64,62,62,60,57,55,54,53,52,52,51,45,43,41,41,38, 38,37,33,33,30,30,28,28,27,27,26,25,18,17 }; const int n3w3b3r9[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 264,263,262,261,259,257,256,256,255,255,253,253,253,251,250,249, 248,247,246,246,245,244,244,241,240,240,237,235,234,233,229,229, 229,227,226,225,222,222,222,221,221,218,217,217,216,216,215,215, 214,213,211,211,211,208,208,208,208,207,206,204,204,199,193,193, 192,191,191,190,189,189,188,187,185,184,183,181,180,176,175,175, 175,171,170,169,169,165,164,161,160,159,159,158,158,158,154,154, 152,151,149,148,146,145,143,142,141,140,137,136,135,131,130,130, 128,127,126,125,125,124,120,120,119,118,115,114,108,107,107,104, 103,101,101,97,97,97,96,95,94,94,93,92,92,91,90,89,89,88,85,84, 84,83,83,78,76,75,74,74,72,70,70,69,68,67,66,65,64,64,60,56,56, 56,56,52,51,51,50,48,44,41,41,40,37,36,36,35,35,31,31,30,28,28, 27,26,25,22,21,18,17,17,16,16 }; const int n3w4b1r0[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 132,132,132,131,131,131,130,130,129,129,129,129,129,129,128,128, 128,128,128,127,127,127,126,126,126,126,126,125,125,125,125,125, 125,125,124,124,123,123,123,123,123,123,123,123,122,122,122,121, 121,121,121,121,121,121,120,120,120,120,120,119,119,119,119,119, 119,119,119,119,119,118,118,118,117,117,117,117,117,117,116,116, 116,116,115,115,115,114,114,114,114,114,113,113,113,113,113,113, 112,112,112,112,112,111,111,111,111,111,111,110,110,110,110,110, 110,109,109,109,109,109,109,109,109,108,108,107,107,106,106,106, 105,105,105,105,104,104,104,104,104,104,104,104,103,103,102,102, 102,101,101,101,101,101,100,100,100,99,99,99,98,98,98,98,98,97, 97,97,97,96,96,96,96,96,96,96,95,95,95,95,95,95,94,94,94,94,93, 93,93,93,93,92,92,92,92,91,91,90,90,90,90,90,90,90 }; const int n3w4b1r1[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 132,132,132,132,132,132,132,132,132,131,131,131,131,131,130,130, 130,129,129,129,129,128,128,128,128,128,128,127,127,127,127,126, 126,126,126,126,125,125,125,124,124,124,123,123,123,123,122,122, 122,122,121,121,121,120,120,120,120,120,120,120,119,119,119,119, 119,119,118,117,117,117,117,117,117,116,116,116,116,116,116,116, 116,116,116,116,116,116,115,115,114,114,114,114,114,113,113,113, 113,113,112,112,111,111,111,111,111,111,110,110,110,110,110,110, 109,109,109,109,109,108,108,108,108,108,107,107,107,106,106,106, 106,105,105,105,105,104,104,104,104,104,103,103,102,102,102,102, 102,102,102,102,101,100,100,100,99,99,99,98,98,98,98,97,97,96, 96,96,96,96,96,96,95,95,95,95,95,94,94,94,94,94,94,94,93,93,92, 92,92,92,92,91,91,91,91,91,91,91,91,90,90,90,90,90 }; const int n3w4b1r2[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 132,132,132,132,132,132,131,131,131,131,131,130,130,130,130,130, 129,129,129,129,129,129,128,128,128,128,128,128,127,127,127,126, 126,126,125,125,124,124,124,124,124,124,123,123,123,123,122,122, 122,122,122,121,121,121,121,121,121,121,121,121,121,120,120,120, 120,120,120,120,119,119,119,118,118,118,118,118,118,118,118,118, 117,117,117,117,116,116,116,116,116,116,115,115,114,114,114,114, 114,114,114,114,113,113,113,113,113,112,112,112,112,112,112,112, 111,111,111,111,111,110,110,110,110,109,109,108,108,108,107,107, 107,106,106,106,106,106,106,105,105,105,105,105,105,105,104,104, 104,104,104,104,104,103,103,103,103,103,102,102,101,101,100,100, 100,100,100,99,98,98,97,97,97,96,96,96,96,96,96,95,95,95,95,95, 94,94,93,93,93,92,92,92,92,92,92,91,91,90,90,90,90,90,90,90 }; const int n3w4b1r3[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 131,131,131,130,130,130,130,130,130,130,130,129,129,129,128,128, 128,128,128,128,128,128,126,126,126,126,126,126,125,125,125,125, 125,124,124,124,124,124,124,124,123,123,123,123,123,122,122,122, 121,121,121,121,121,120,120,120,120,119,119,119,119,119,118,118, 118,118,117,117,117,117,117,116,116,116,116,116,116,116,116,115, 115,115,115,114,114,114,114,114,114,114,114,114,113,113,112,112, 112,112,112,112,111,111,111,110,110,110,110,110,110,110,110,109, 109,109,109,108,108,108,107,107,107,107,107,107,107,107,106,106, 106,106,106,106,106,106,105,105,105,104,104,104,104,104,103,103, 103,103,103,103,103,102,102,101,101,101,101,100,99,99,99,99,99, 99,99,99,98,98,98,98,98,98,97,97,97,97,97,97,97,96,96,96,96,96, 95,95,94,94,94,94,93,93,93,93,93,92,92,92,92,91,91,91 }; const int n3w4b1r4[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 132,132,132,132,132,131,131,131,131,131,130,130,130,130,129,129, 129,129,129,128,127,126,126,126,125,125,125,125,124,124,124,124, 124,124,123,123,123,123,123,123,123,123,122,122,122,122,122,121, 121,121,121,121,121,120,120,120,119,119,119,119,119,119,119,119, 118,118,118,118,118,118,118,118,117,117,116,116,116,115,115,115, 114,114,114,114,114,114,114,113,113,113,113,112,112,112,112,112, 112,111,111,111,111,111,111,110,110,110,109,109,109,109,109,109, 108,108,108,107,107,107,107,107,107,106,106,106,106,106,106,105, 105,105,105,105,105,104,104,104,104,104,103,103,103,103,103,103, 103,103,103,102,102,102,102,101,101,101,101,101,101,100,100,100, 100,100,100,99,98,98,97,97,97,96,96,96,96,96,95,95,95,95,95,95, 95,95,94,94,93,93,93,93,93,92,92,92,92,91,91,91,91,90,90,90 }; const int n3w4b1r5[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 132,132,132,132,132,132,132,131,131,130,130,130,130,130,130,129, 129,129,129,128,128,128,128,128,128,127,127,127,127,126,126,126, 126,126,126,125,124,124,124,124,124,123,123,123,122,122,121,121, 121,121,120,120,120,120,120,120,119,119,119,118,118,118,118,118, 118,117,117,117,116,116,116,116,116,115,115,115,115,115,115,115, 114,114,114,114,114,113,113,113,113,113,113,113,113,112,112,112, 111,111,111,111,111,110,110,109,109,109,109,109,108,108,108,108, 108,108,108,107,107,107,107,107,107,107,107,106,106,106,106,105, 104,104,104,104,104,104,104,103,103,103,103,102,102,102,102,102, 102,101,101,101,101,101,101,100,100,100,100,100,100,100,100,100, 99,99,99,99,99,98,98,98,98,97,97,97,96,96,95,95,95,94,94,94,94, 94,93,93,93,93,93,92,92,92,92,91,91,91,91,90,90,90,90,90 }; const int n3w4b1r6[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 132,132,132,132,132,132,131,131,131,131,131,131,131,130,130,130, 130,129,129,129,129,129,129,128,128,128,128,128,128,127,127,127, 127,126,126,126,126,126,125,125,125,125,125,125,125,124,124,123, 123,123,123,123,122,122,122,121,121,121,121,121,121,121,120,120, 120,120,119,119,118,118,118,117,117,117,117,117,116,116,116,116, 116,116,116,115,115,115,115,114,114,114,114,113,113,113,113,113, 113,112,112,112,112,112,111,111,111,111,111,111,111,111,111,111, 111,111,110,109,109,109,109,109,109,108,108,108,108,107,107,107, 107,107,107,107,107,106,106,106,106,106,106,105,105,105,105,105, 105,105,104,104,104,104,104,103,103,103,103,103,103,102,102,101, 100,100,99,99,99,99,99,98,98,98,98,97,97,97,97,97,96,96,96,96, 96,96,95,95,95,95,94,94,94,92,92,92,91,91,91,91,90,90,90,90 }; const int n3w4b1r7[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 132,132,132,132,132,131,131,131,131,131,131,131,131,130,130,130, 130,130,129,129,129,129,129,129,129,129,128,128,128,127,127,127, 127,127,126,126,126,126,125,125,125,124,123,123,123,123,123,123, 123,122,122,122,121,120,120,120,120,120,120,120,120,120,119,119, 119,119,118,118,118,118,118,117,117,117,117,117,116,116,116,116, 115,115,115,115,115,114,114,114,114,113,113,113,113,113,113,112, 112,112,111,111,111,110,110,110,109,109,109,109,109,108,108,107, 107,107,107,106,106,106,105,105,105,105,105,104,104,104,104,104, 104,104,104,104,103,103,103,103,102,102,102,102,102,101,101,101, 100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,98,98, 98,98,97,97,97,97,96,96,96,96,96,96,95,95,95,95,95,94,94,94,94, 93,93,93,93,93,93,92,92,92,92,92,91,91,90,90,90,90 }; const int n3w4b1r8[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 132,132,132,132,131,131,131,131,131,131,131,131,131,131,130,130, 130,130,130,130,129,129,129,129,129,129,129,129,128,128,128,127, 127,127,127,126,126,126,126,126,126,126,125,125,124,124,124,124, 124,123,123,123,123,123,123,123,123,122,122,122,122,122,122,121, 121,121,121,121,121,121,120,120,120,120,120,120,119,119,119,119, 119,118,118,118,118,117,117,117,117,116,116,116,115,115,115,115, 114,114,114,113,113,113,113,112,112,112,111,111,111,111,110,110, 110,110,110,110,109,109,109,109,109,109,108,108,108,108,107,107, 107,107,107,106,106,106,106,105,105,105,105,105,105,104,104,104, 104,103,102,102,102,102,102,102,101,101,101,101,100,100,99,99, 99,98,98,98,98,98,97,97,97,97,96,96,96,95,95,94,94,94,94,94,94, 94,94,93,93,92,92,92,91,91,91,91,91,91,90,90,90,90,90,90 }; const int n3w4b1r9[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 132,132,132,132,132,132,132,131,131,131,130,130,130,130,130,130, 129,129,129,129,128,128,127,127,127,127,127,127,127,126,126,126, 125,125,125,124,124,124,124,124,124,123,123,123,123,122,122,122, 120,120,120,119,119,119,118,118,118,118,117,117,117,117,117,116, 116,116,116,116,116,115,115,115,115,115,115,114,114,114,114,114, 114,113,113,113,113,113,113,113,112,112,112,112,112,112,112,111, 111,111,111,110,110,110,110,110,110,110,109,109,109,109,108,108, 108,108,107,107,107,107,107,106,106,106,106,106,106,106,106,105, 105,105,105,105,105,105,105,105,105,105,104,104,104,103,103,103, 103,103,102,102,102,102,102,102,101,101,101,101,101,101,100,100, 100,99,99,99,98,98,98,98,97,97,97,97,96,96,96,96,95,95,95,95, 95,94,94,94,94,93,93,93,93,93,92,92,92,92,91,90,90,90,90,90 }; const int n3w4b2r0[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 165,165,165,165,164,164,164,163,163,163,162,162,161,160,160,159, 159,157,157,157,156,156,156,156,155,155,154,154,154,154,152,152, 152,151,151,150,150,149,148,147,147,147,147,146,146,146,146,146, 144,144,144,143,143,142,142,142,141,140,139,138,136,135,135,135, 134,134,134,134,133,133,133,133,133,132,132,131,129,128,127,126, 125,123,122,120,119,119,119,119,117,116,116,116,116,116,116,114, 114,113,113,113,112,110,110,109,108,108,108,107,105,105,104,102, 100,100,100,100,100,100,99,99,99,98,97,97,96,96,96,96,95,94,93, 92,90,90,89,89,88,88,88,88,88,88,87,87,86,86,85,85,85,85,84,83, 83,83,83,82,81,80,80,80,79,79,79,78,78,77,77,76,76,74,74,72,72, 71,71,70,70,70,70,69,68,68,68,68,67,67,67,67,64,63,62,62,61,61, 61,61,61,60,58,58 }; const int n3w4b2r1[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 165,164,164,163,163,161,161,160,160,159,159,159,158,158,156,156, 155,154,153,153,152,152,152,152,152,151,151,150,150,150,149,149, 149,148,148,147,147,146,146,145,145,143,143,143,142,142,141,140, 140,139,139,138,138,138,137,137,137,136,135,134,134,133,133,132, 131,130,129,128,127,127,127,127,127,126,126,126,125,123,122,122, 120,120,120,120,120,120,119,119,116,116,116,116,115,114,113,112, 112,112,110,110,109,108,108,107,106,106,105,104,104,103,103,103, 102,101,101,101,101,100,100,100,99,99,98,98,98,97,94,90,89,89, 89,88,88,87,87,85,84,84,83,83,83,82,82,82,82,82,81,81,80,79,79, 79,77,76,76,76,74,74,73,73,73,72,72,72,71,70,70,68,68,67,67,67, 66,66,66,65,65,65,63,63,63,62,62,62,61,61,61,61,60,60,60,58,58, 58,58,58,57,57,57,57 }; const int n3w4b2r2[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 165,165,163,163,163,162,161,160,160,160,158,157,157,156,156,156, 155,155,154,153,151,151,150,148,148,147,146,146,146,145,144,144, 144,143,143,142,141,140,140,139,139,139,138,138,138,137,136,136, 136,135,135,135,134,134,133,133,133,133,132,129,129,128,125,124, 123,122,122,122,122,121,121,120,119,119,118,118,118,116,116,115, 115,115,114,114,114,114,113,113,112,112,112,111,111,111,110,110, 110,110,109,108,108,105,104,104,104,103,103,103,102,102,102,101, 100,100,98,98,97,96,95,94,94,94,91,90,89,89,89,88,88,87,85,85, 85,84,83,83,82,82,82,82,82,82,81,81,81,81,80,79,79,79,78,78,78, 77,76,75,74,74,74,74,73,73,73,72,72,72,72,71,70,70,70,70,69,69, 67,66,65,65,64,64,64,63,62,62,62,61,61,61,61,61,59,59,59,59,58, 58,57,57,57,57 }; const int n3w4b2r3[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 165,164,163,162,162,161,160,160,160,159,159,159,158,157,157,157, 157,156,155,155,154,154,153,153,153,152,151,150,148,147,145,145, 144,142,142,141,141,141,139,139,139,138,138,137,136,135,134,133, 132,132,131,131,131,130,130,129,129,127,127,125,125,124,124,124, 124,123,123,122,122,122,121,121,121,120,119,119,119,119,118,118, 117,117,116,116,116,115,115,114,114,113,113,113,112,111,111,111, 109,109,107,107,107,106,106,105,105,104,104,104,104,102,102,100, 100,99,99,99,98,98,98,97,97,97,96,96,95,94,93,93,92,92,92,92, 91,91,91,91,91,89,89,89,88,88,88,86,86,86,86,86,85,84,84,84,83, 82,82,80,80,80,79,79,79,79,78,77,76,76,76,75,74,74,74,73,72,70, 70,70,69,68,68,67,67,67,66,64,64,63,63,62,61,61,60,59,58,58,58, 57,57,57,57,57 }; const int n3w4b2r4[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 165,165,165,164,164,163,162,162,161,161,160,160,159,158,156,156, 155,155,154,154,154,153,152,151,151,151,150,149,149,147,147,147, 146,145,144,144,142,142,141,141,141,141,138,138,138,138,138,138, 136,136,135,135,135,135,134,134,134,134,133,133,133,132,132,132, 131,130,130,129,128,128,126,126,126,126,125,124,123,123,122,121, 121,121,120,119,118,117,116,116,114,114,112,112,111,111,111,111, 110,109,108,108,108,106,106,106,105,105,103,103,103,103,102,102, 102,102,101,101,101,101,101,101,99,99,99,98,97,97,95,95,95,94, 93,92,92,91,91,90,90,88,88,88,86,86,86,85,84,84,84,83,83,83,82, 81,81,80,80,80,79,78,77,76,76,75,74,73,73,73,72,71,71,70,69,69, 69,69,69,67,67,67,67,66,66,65,63,62,62,62,60,60,60,60,60,60,59, 58,58,58,58,58,57,57 }; const int n3w4b2r5[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 165,164,164,164,164,164,163,162,161,161,160,159,158,158,158,158, 157,157,156,156,156,156,155,155,153,153,152,152,152,151,151,151, 150,149,148,148,148,147,147,147,146,145,145,144,144,143,142,142, 142,142,142,140,139,139,139,138,137,136,135,135,133,133,133,132, 132,132,132,132,131,131,130,128,128,127,127,127,127,126,125,125, 123,123,123,122,122,122,121,121,121,121,119,119,118,117,117,117, 117,116,116,115,115,114,114,113,113,111,111,111,111,110,110,109, 109,109,108,108,108,108,106,106,105,104,103,103,102,102,101,98, 98,98,98,98,97,97,97,96,95,95,94,93,92,92,91,91,90,90,89,87,87, 87,86,85,85,85,84,84,83,83,82,82,81,81,80,79,78,78,78,78,77,77, 77,77,76,76,76,76,75,75,73,72,71,71,70,69,67,67,66,66,66,64,64, 63,62,61,61,61,59,59,58,57 }; const int n3w4b2r6[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 165,165,164,162,162,162,162,161,161,161,160,159,155,154,153,153, 152,152,151,150,150,149,149,149,148,148,146,146,145,144,143,143, 143,142,142,142,142,141,141,141,141,141,139,138,138,138,138,138, 138,137,137,136,135,135,135,134,132,132,131,129,129,129,128,128, 128,128,127,127,127,125,125,125,125,125,124,123,122,121,120,120, 119,119,117,115,115,115,114,114,113,113,112,111,111,111,110,110, 109,109,109,109,108,108,108,107,107,106,106,106,106,105,105,105, 105,104,104,102,101,101,101,100,97,96,96,96,95,95,95,95,94,94, 94,93,93,92,92,91,91,90,90,88,88,87,87,86,86,85,85,85,85,85,84, 84,82,81,81,80,79,79,78,78,78,77,77,77,75,74,73,73,72,71,71,71, 70,70,69,69,68,68,68,68,68,67,67,65,65,64,64,64,63,63,63,62,62, 59,59,59,59,58,57,57 }; const int n3w4b2r7[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 165,163,163,162,162,161,159,159,159,158,157,157,157,157,155,154, 154,154,154,153,153,152,152,152,151,151,151,151,151,151,150,148, 147,147,146,146,144,143,143,143,140,140,139,139,138,138,138,137, 136,136,135,135,135,134,133,132,132,131,130,130,130,129,129,128, 128,127,127,127,124,124,124,123,123,119,118,118,116,116,116,115, 115,114,114,112,110,110,110,110,109,109,109,107,107,106,106,106, 105,105,105,104,103,103,103,102,101,101,101,101,101,100,100,99, 99,99,98,98,98,98,97,97,97,96,95,95,93,93,93,92,92,92,91,90,90, 90,90,89,89,88,88,87,86,86,86,86,85,85,84,83,83,82,81,81,81,81, 80,79,79,79,78,77,77,76,76,75,75,75,75,74,73,73,73,72,72,72,72, 70,70,69,68,68,67,67,67,66,66,65,65,65,64,62,61,61,60,59,59,58, 58,58,57,57 }; const int n3w4b2r8[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 164,163,162,162,160,159,159,159,158,157,157,157,156,156,156,155, 154,154,153,153,152,152,152,152,151,151,151,150,150,150,150,148, 148,147,147,147,147,146,145,145,145,145,144,144,143,142,142,142, 142,139,139,139,139,138,137,137,137,136,136,135,133,132,132,130, 130,130,129,129,127,127,126,126,125,125,125,123,123,122,122,122, 121,121,120,120,120,119,119,118,118,118,116,116,116,115,115,115, 114,113,111,111,111,111,111,110,109,108,107,107,107,107,106,105, 105,105,104,103,101,101,100,100,99,98,97,95,95,94,93,93,92,92, 92,92,90,90,89,89,89,88,88,87,87,87,86,86,86,85,84,84,84,84,83, 82,81,80,80,79,79,78,78,77,77,77,77,76,75,75,74,74,73,73,73,73, 71,71,71,71,70,70,70,69,67,66,66,66,66,66,65,64,64,63,63,62,61, 60,59,59,58,58,57,57 }; const int n3w4b2r9[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 163,162,161,161,159,157,157,154,154,153,153,152,152,151,149,149, 149,149,148,148,147,146,145,144,144,144,143,143,142,142,141,141, 141,140,139,139,139,138,137,137,137,136,136,136,135,133,132,132, 131,131,131,130,130,130,129,129,128,128,128,128,128,125,125,124, 124,124,123,122,122,121,121,121,120,120,120,120,118,118,118,117, 117,116,116,115,115,113,113,112,111,111,110,110,109,108,107,106, 106,106,104,104,104,103,103,103,103,103,103,102,102,99,98,97, 97,97,96,96,95,94,94,93,92,92,91,91,91,91,90,90,90,88,87,87,87, 86,86,86,86,86,85,85,84,84,84,84,83,83,82,81,81,81,80,80,79,79, 79,78,78,78,77,76,76,76,75,75,74,74,74,72,72,71,71,71,71,70,70, 70,69,68,68,68,67,67,67,66,65,63,63,62,61,60,60,60,60,59,59,58, 58,58,57,57 }; const int n3w4b3r0[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 209,208,207,205,205,204,203,201,200,200,199,199,198,198,198,196, 196,196,196,195,194,193,192,192,192,189,188,187,186,185,185,183, 182,182,181,181,181,180,179,178,178,177,175,174,174,173,171,170, 170,170,169,168,166,165,165,164,163,163,162,161,161,161,161,157, 156,156,154,154,154,151,150,149,148,147,146,146,146,145,144,143, 141,141,138,138,137,136,136,135,132,130,130,129,128,128,128,127, 126,126,126,126,122,121,118,118,116,116,114,112,112,111,111,111, 110,110,110,109,108,108,107,106,105,104,102,101,101,99,94,94, 94,93,92,92,90,90,90,90,89,88,87,87,86,84,84,82,82,82,81,80,79, 77,74,74,72,71,70,69,69,68,68,67,66,61,60,57,57,56,56,56,55,49, 48,48,47,47,46,44,44,39,38,38,38,35,34,33,31,31,30,29,28,26,24, 24,21,20,20,17,16,16,15,13 }; const int n3w4b3r1[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 208,208,207,206,204,202,198,197,197,197,197,196,196,196,195,194, 192,191,190,189,189,189,186,185,183,181,181,180,179,178,177,177, 175,172,169,169,165,165,164,163,163,161,161,160,160,159,157,155, 155,154,153,152,151,151,150,147,147,146,146,145,145,144,144,143, 142,142,141,141,140,139,136,135,135,132,132,131,130,130,129,128, 128,128,128,126,123,123,122,121,121,121,119,118,117,117,114,114, 111,110,110,109,108,108,107,106,106,103,103,98,98,97,97,94,94, 93,92,90,90,89,89,88,88,88,86,86,84,83,83,83,81,79,77,76,76,76, 76,73,72,71,71,69,69,68,67,66,66,66,66,66,64,63,63,62,62,61,59, 57,53,52,52,48,48,46,46,46,45,43,43,42,41,41,38,35,34,33,33,32, 31,30,29,29,28,28,25,24,23,20,19,19,18,18,18,18,17,16,16,14,14, 14,13,13 }; const int n3w4b3r2[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 206,206,206,206,203,200,200,198,197,196,196,196,194,193,193,192, 192,192,192,192,191,191,191,190,189,188,188,187,187,186,184,180, 180,177,177,176,175,175,172,172,171,171,170,170,169,168,168,164, 162,160,159,159,158,156,154,153,152,149,149,149,148,145,145,145, 144,144,141,141,140,140,138,138,137,137,136,135,135,135,134,133, 131,131,130,129,129,129,128,128,127,124,124,124,122,121,120,119, 115,115,114,113,113,113,113,111,111,111,108,107,107,106,104,104, 104,103,103,103,102,101,101,100,95,93,92,92,91,91,89,89,88,88, 87,84,84,84,79,78,78,77,74,72,71,70,69,69,67,66,66,64,63,63,62, 62,59,57,55,54,54,54,54,52,52,51,50,49,49,49,47,45,45,45,43,43, 42,41,40,38,38,38,38,37,37,33,31,31,31,29,26,26,25,25,23,22,22, 21,21,18,18,17,17,13 }; const int n3w4b3r3[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 208,206,205,205,204,203,203,202,201,201,201,200,200,199,199,198, 198,197,196,196,196,195,195,194,193,191,191,189,189,189,188,187, 187,186,185,183,183,183,183,182,182,181,179,179,179,179,179,177, 177,176,176,174,173,172,171,170,170,167,166,164,163,163,162,162, 161,158,155,155,153,151,149,149,148,146,146,144,142,142,142,141, 141,141,137,136,136,134,134,134,134,134,131,129,129,128,127,125, 125,124,123,123,123,123,122,120,119,119,118,118,115,115,114,113, 113,111,106,106,105,104,103,102,101,101,101,100,97,96,96,96,95, 94,92,92,91,91,91,89,89,89,88,86,86,85,81,79,79,73,72,71,70,70, 69,68,67,66,65,63,62,60,60,60,59,58,58,58,56,55,53,53,53,49,46, 43,43,41,40,40,39,39,39,35,34,30,30,30,30,29,28,28,25,24,24,21, 20,19,18,18,16,15,14,13 }; const int n3w4b3r4[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 208,206,205,205,205,204,202,201,201,199,199,198,198,195,194,194, 193,192,192,191,191,191,187,187,186,186,184,183,182,182,182,182, 180,180,180,177,175,173,173,172,172,171,171,170,170,169,169,165, 164,164,163,163,161,157,156,156,155,155,153,152,151,151,151,150, 148,145,145,145,144,144,144,144,143,142,142,138,136,136,136,134, 133,132,130,130,129,129,129,127,127,126,123,122,120,119,118,117, 116,115,112,112,111,111,108,108,108,107,107,107,107,106,106,103, 102,101,101,101,99,97,94,93,92,92,91,89,87,85,84,83,82,82,82, 81,81,81,78,78,78,78,76,76,74,71,69,68,68,66,66,63,62,61,59,59, 58,58,55,55,54,54,53,52,50,48,48,48,47,46,44,44,44,43,43,41,40, 38,35,35,35,33,32,31,30,29,29,28,27,26,24,24,23,23,22,22,18,18, 18,17,17,15,14,14 }; const int n3w4b3r5[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 209,208,208,207,207,206,206,205,204,203,202,201,200,200,200,199, 197,197,197,196,195,195,193,192,190,190,188,188,186,186,186,185, 184,184,184,184,183,181,177,177,173,172,172,170,169,167,166,164, 163,159,156,156,156,155,154,154,153,153,152,152,152,152,151,146, 145,145,145,143,143,142,141,138,138,138,137,137,136,135,134,133, 132,132,131,130,130,129,127,127,126,126,124,124,124,122,120,120, 119,117,116,110,108,107,106,103,102,98,97,97,95,94,93,93,93,92, 92,89,88,88,85,85,85,84,80,79,78,77,76,76,75,74,74,74,74,73,72, 71,71,69,68,67,66,65,65,65,65,65,64,63,63,60,59,55,53,52,52,52, 51,49,47,47,47,46,45,44,44,44,43,42,42,40,40,40,38,37,36,35,35, 35,34,33,31,28,27,27,26,24,24,24,24,21,19,18,17,16,15,14,13,13, 13,13 }; const int n3w4b3r6[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 209,208,207,205,205,205,203,199,198,198,197,197,194,192,191,189, 189,187,186,184,183,183,183,181,180,179,179,177,176,174,174,174, 173,173,172,168,168,168,166,166,165,165,165,165,164,161,160,160, 159,159,158,158,157,157,154,153,153,152,151,150,150,148,146,146, 145,145,144,143,143,141,139,138,138,138,138,137,136,136,135,133, 133,131,130,129,127,124,124,123,121,119,118,117,116,115,115,115, 115,114,113,112,111,111,111,110,110,107,106,105,105,105,104,103, 102,102,102,101,100,100,99,99,99,98,97,96,96,95,92,91,87,86,86, 85,85,84,84,84,82,81,80,78,78,76,74,74,72,71,71,70,70,67,67,64, 64,63,62,60,59,58,58,56,55,55,54,53,53,52,52,51,50,49,49,46,46, 44,44,44,43,43,41,36,35,34,34,34,32,32,29,29,28,28,27,27,21,19, 17,14,13,13,13,13 }; const int n3w4b3r7[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 207,203,202,199,197,196,196,195,195,194,193,192,190,189,189,189, 188,186,185,184,182,181,179,179,178,178,177,176,176,174,173,172, 171,171,170,169,168,167,166,164,163,161,161,161,161,154,154,154, 154,152,150,150,149,149,149,144,143,142,141,141,139,139,139,138, 137,137,137,136,136,135,135,134,134,133,133,132,130,128,128,127, 126,125,124,122,121,120,119,117,116,115,115,114,113,112,112,112, 109,109,109,109,107,106,105,104,102,102,102,101,98,98,98,96,95, 95,94,94,91,86,86,85,83,82,82,80,75,73,71,70,70,69,69,68,67,67, 66,65,65,63,62,59,59,58,57,57,54,53,52,51,51,50,50,50,48,46,45, 44,43,43,43,42,42,41,41,40,39,38,35,35,35,34,33,33,32,32,31,28, 27,26,24,24,24,24,22,22,20,19,19,18,17,17,17,17,17,16,16,15,15, 13,13,13 }; const int n3w4b3r8[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 209,208,208,207,205,205,205,204,204,202,202,201,201,195,194,194, 193,193,193,192,192,191,190,190,190,189,187,185,184,183,182,181, 179,178,176,175,174,174,174,173,172,170,170,167,167,166,166,164, 161,159,159,158,158,157,155,153,153,152,152,151,151,148,148,147, 147,143,142,142,141,140,140,139,139,138,137,136,136,134,133,133, 132,132,131,131,130,129,129,127,125,125,124,123,122,122,122,120, 119,118,117,115,114,114,111,109,109,108,108,107,107,106,105,105, 104,102,101,98,96,92,92,91,91,91,88,87,87,87,86,82,81,81,80,80, 75,75,75,75,73,72,72,70,70,69,69,69,68,66,66,66,65,64,62,61,61, 61,59,58,56,55,54,52,51,50,49,49,49,47,47,46,44,44,43,42,42,42, 40,40,40,36,36,34,33,32,32,31,31,28,28,27,26,21,21,20,19,19,17, 17,16,15,15,14 }; const int n3w4b3r9[] = { 1000, // Capacity 200, // Number of items // Size of items (sorted) 209,208,207,206,205,204,204,204,204,202,201,198,198,198,197,197, 196,195,189,189,189,189,187,187,186,186,186,186,185,183,182,181, 181,177,176,176,176,175,173,172,171,168,167,166,164,164,163,162, 161,159,159,159,159,157,157,156,155,155,153,153,152,152,152,150, 149,148,147,147,146,142,141,140,137,134,132,131,131,129,128,128, 127,125,125,124,124,122,119,119,118,118,117,113,111,111,111,111, 111,109,109,109,108,108,107,106,106,105,105,105,104,103,102,102, 100,99,99,98,96,96,94,91,90,90,89,87,87,86,83,81,80,79,79,78, 78,74,72,72,72,71,71,70,70,70,69,67,63,62,60,58,57,57,57,55,55, 54,53,53,53,51,51,51,49,48,45,45,45,45,44,43,43,40,37,37,36,36, 36,35,34,34,33,30,30,30,29,29,27,26,26,24,24,23,22,22,22,22,21, 20,18,18,16,14 }; const int n4w1b1r0[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 396,396,396,396,395,395,394,394,394,393,393,393,392,392,392,391, 391,391,391,391,391,391,391,390,390,390,390,390,390,390,389,389, 388,388,388,388,388,388,388,387,387,387,386,386,385,384,384,384, 383,382,382,382,382,381,381,381,381,381,380,380,380,379,379,379, 379,378,378,378,378,378,378,378,377,377,377,376,376,376,376,376, 376,375,374,374,374,374,374,373,373,372,371,371,370,370,370,370, 369,369,369,368,368,368,368,368,367,367,367,367,367,367,366,366, 366,365,364,364,364,364,364,363,363,363,363,362,362,362,362,361, 360,360,359,359,359,358,358,358,357,357,357,357,357,356,356,356, 356,356,355,355,355,354,354,354,354,354,354,354,353,353,353,353, 353,353,353,352,352,352,352,352,352,352,351,351,351,349,349,348, 348,348,347,347,347,347,347,347,346,346,346,345,345,345,345,345, 344,344,343,343,343,343,343,343,343,342,342,342,342,341,341,341, 341,340,340,339,339,338,338,338,338,338,337,337,337,337,336,336, 336,335,335,334,334,334,333,333,333,333,332,332,331,330,330,330, 329,328,328,328,328,327,327,327,327,326,326,326,326,326,325,325, 325,325,324,324,324,323,323,323,322,322,322,322,322,321,321,320, 320,319,319,319,318,318,318,318,318,318,318,318,317,317,317,317, 317,317,317,317,317,317,316,315,314,314,314,314,314,313,313,313, 312,312,312,312,311,311,311,310,310,310,310,310,309,309,309,308, 308,308,308,306,306,306,306,305,305,305,305,305,304,304,304,303, 303,302,302,301,301,301,301,300,300,300,299,299,298,298,298,298, 298,298,298,297,297,297,297,296,296,296,296,296,295,295,295,295, 294,294,294,294,294,293,293,293,293,293,292,292,292,292,292,291, 291,291,290,290,290,290,289,289,288,288,288,288,288,288,287,287, 287,287,286,286,286,285,284,284,284,284,284,283,283,283,283,283, 282,282,282,282,282,282,281,281,281,281,280,280,280,280,279,279, 279,278,278,278,278,278,277,277,277,277,276,276,276,276,276,276, 276,276,275,275,275,275,275,275,275,274,274,274,273,273,273,272, 272,272,272,272,271,271,271,271,271,271,271,270,270,270,270,269, 269,269,269,269,268,268,268,267,267,267,267,267,266,266,266,266, 266,266,266,266 }; const int n4w1b1r1[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 396,396,396,396,396,396,395,395,394,393,393,393,393,392,392,391, 391,391,390,389,389,389,389,389,388,387,387,387,387,387,386,386, 385,385,385,385,385,384,384,384,384,384,383,383,383,383,383,382, 382,382,381,381,380,380,380,380,380,380,379,379,378,378,377,377, 376,376,376,375,375,375,374,374,373,373,373,373,373,373,373,373, 372,372,372,372,371,371,371,371,371,370,370,370,370,369,368,368, 368,368,368,367,367,367,367,367,367,366,366,366,365,364,363,363, 363,361,360,360,360,359,359,359,359,358,358,358,358,358,357,357, 357,356,356,356,356,355,355,355,355,355,354,354,354,354,353,353, 353,352,352,352,351,351,351,350,350,349,349,349,349,349,349,349, 349,348,348,348,347,347,347,347,347,347,347,346,346,346,346,345, 345,345,345,344,344,344,344,343,343,343,343,343,343,343,342,342, 342,340,340,340,340,340,339,339,339,339,339,338,338,338,337,337, 337,336,336,336,336,335,335,335,334,334,334,333,333,333,333,333, 332,332,332,332,332,332,332,332,332,332,331,330,330,329,329,328, 328,328,328,328,328,328,328,327,327,327,327,327,326,326,326,326, 325,325,325,325,324,324,324,324,324,323,323,323,323,322,322,321, 321,321,321,321,321,320,320,320,320,320,319,319,319,318,318,317, 317,317,317,316,316,315,315,315,315,315,315,315,314,314,314,314, 314,313,313,313,313,313,313,312,312,312,311,311,311,311,310,310, 310,309,309,308,308,308,308,307,307,307,306,306,306,305,305,305, 305,304,304,304,303,303,303,303,303,303,303,302,302,302,301,301, 301,300,300,300,300,300,299,299,299,299,299,298,298,298,298,298, 298,297,297,296,296,296,295,295,295,295,295,294,293,293,293,293, 293,293,292,292,292,292,291,291,290,290,290,289,289,288,288,288, 288,288,288,287,287,287,287,287,287,286,286,286,285,285,285,285, 285,284,284,284,284,284,284,284,284,283,282,282,282,282,282,281, 281,281,281,281,281,281,281,281,280,280,279,279,279,279,279,278, 278,277,277,277,276,276,276,275,275,274,274,274,274,274,274,273, 272,272,272,272,272,272,272,271,271,271,271,270,270,270,270,270, 270,269,269,269,269,269,269,269,268,268,268,267,267,267,267,267, 266,266,266,266 }; const int n4w1b1r2[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 396,396,395,394,394,394,394,394,394,394,394,394,394,393,393,393, 393,393,392,392,392,392,391,391,391,391,391,389,389,389,388,388, 387,387,387,387,386,386,386,386,386,385,385,385,385,384,384,383, 383,383,383,383,383,382,382,381,381,381,381,380,380,380,380,379, 379,378,378,377,377,377,377,376,376,376,376,376,375,375,375,375, 375,374,374,374,373,373,373,372,372,372,372,372,371,370,370,370, 370,369,369,369,368,368,368,368,368,368,368,367,367,367,367,366, 366,366,366,366,366,365,365,365,365,365,365,365,364,364,364,364, 364,364,364,364,364,363,363,363,363,363,362,362,362,362,361,361, 360,360,360,360,360,360,360,359,359,359,358,358,357,357,357,356, 356,355,355,355,355,354,354,354,354,354,353,353,353,352,352,352, 352,351,351,351,351,351,350,349,349,348,347,347,347,347,347,345, 345,344,344,343,343,343,343,343,343,343,342,342,342,342,342,342, 342,342,342,342,341,341,340,340,340,340,340,339,339,339,339,338, 337,337,337,337,336,336,336,336,335,335,335,335,334,334,334,334, 334,333,333,333,333,332,331,331,331,330,330,329,329,329,329,329, 329,329,328,328,328,328,327,327,327,327,327,327,326,326,326,325, 325,325,324,323,323,323,322,322,321,321,321,321,321,321,320,319, 319,318,318,318,317,317,316,316,316,316,316,315,315,314,314,314, 314,314,314,313,313,313,313,311,311,311,311,311,311,310,310,309, 309,308,308,308,307,307,307,307,306,306,306,306,306,306,305,305, 305,304,304,304,304,304,304,304,303,303,302,302,301,301,300,300, 300,299,299,299,298,298,298,297,297,297,296,296,296,296,296,296, 296,296,295,295,295,295,295,294,294,293,293,293,293,293,292,291, 291,291,291,291,290,290,289,289,289,289,289,289,288,288,288,288, 288,288,287,287,287,287,287,286,286,286,286,286,285,285,285,285, 285,285,285,284,284,284,283,283,283,283,282,282,282,282,282,281, 281,281,280,280,280,280,280,279,279,279,279,278,278,278,278,277, 277,277,276,275,275,275,275,275,275,275,275,274,274,273,273,273, 273,273,272,272,272,272,272,271,271,271,271,271,271,270,270,270, 270,270,270,269,269,269,268,268,268,267,267,267,267,267,267,267, 266,266,266,266 }; const int n4w1b1r3[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 396,396,396,396,395,395,395,394,394,393,393,393,392,392,392,392, 392,391,391,390,390,390,390,389,389,389,388,388,388,387,387,387, 387,387,386,386,386,386,386,385,385,385,385,384,384,383,383,383, 383,383,382,382,382,382,381,381,381,381,381,380,380,379,379,379, 379,379,378,378,378,378,378,378,377,377,377,377,377,377,376,376, 376,375,375,375,375,375,375,375,375,375,375,375,374,374,374,374, 373,373,373,373,373,373,373,372,371,371,371,371,371,370,370,370, 370,370,369,369,368,368,368,368,367,367,367,367,367,366,366,365, 365,365,364,364,363,363,363,363,363,363,363,363,362,362,362,362, 362,361,361,361,361,360,360,360,359,359,359,359,359,358,358,358, 358,358,357,357,357,356,356,355,355,355,354,354,354,354,354,354, 353,353,353,353,353,352,351,351,351,351,351,350,350,350,350,350, 349,348,348,347,347,347,347,346,345,345,345,344,344,344,343,343, 341,341,341,340,340,340,340,340,340,340,339,339,339,339,338,338, 338,337,337,337,337,337,337,336,336,336,335,335,335,335,334,334, 334,334,334,333,333,333,333,333,333,333,332,332,332,331,330,330, 330,330,329,328,328,327,327,327,327,326,326,326,326,325,325,325, 324,324,324,324,324,324,323,323,323,323,323,323,323,321,321,321, 321,320,320,320,320,320,320,319,318,318,317,317,317,317,317,316, 316,316,316,315,315,315,315,315,315,314,314,314,314,314,313,313, 312,312,311,311,311,311,311,311,310,310,310,310,310,310,309,309, 309,309,308,308,308,308,308,307,307,306,306,305,305,304,304,303, 302,302,302,302,301,301,301,301,301,300,300,300,300,299,299,298, 298,297,297,297,297,297,296,295,295,295,294,294,294,294,293,293, 293,293,293,293,293,292,292,292,292,291,291,290,290,290,290,290, 289,289,289,289,289,289,288,288,288,288,288,287,286,286,286,285, 285,285,285,285,284,284,284,283,283,283,283,283,283,282,282,282, 282,281,281,281,281,281,281,280,280,280,280,280,279,279,278,278, 278,278,278,278,277,277,277,276,276,276,276,275,275,275,275,275, 275,275,274,274,274,274,274,273,273,273,273,272,272,272,272,272, 271,271,271,270,269,269,268,268,268,268,268,267,267,267,267,267, 267,267,267,266 }; const int n4w1b1r4[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 396,396,395,395,394,394,393,393,392,392,392,392,392,392,392,392, 391,391,391,391,390,390,390,390,390,389,389,389,389,388,387,387, 387,386,386,386,386,386,385,385,384,383,382,382,382,382,382,382, 381,381,381,381,381,380,380,380,379,379,378,378,377,377,377,377, 376,376,376,376,376,376,375,375,375,375,375,374,374,373,373,373, 373,373,373,373,372,372,372,371,371,371,371,371,371,371,370,369, 369,369,369,369,368,368,368,368,367,367,367,367,367,367,366,366, 366,366,365,365,365,365,365,365,365,365,363,363,362,361,361,360, 360,360,360,359,359,359,358,358,358,357,357,357,357,356,355,355, 355,355,354,354,354,354,354,353,353,353,352,352,351,351,351,350, 350,350,349,349,349,349,349,349,349,348,348,348,348,348,348,348, 348,348,348,347,347,347,346,346,346,346,345,345,344,344,344,344, 344,344,343,343,343,343,343,343,343,342,341,341,341,341,341,341, 340,340,339,339,339,339,339,339,339,338,338,338,338,338,338,338, 338,337,337,337,336,336,336,336,336,335,335,335,335,335,334,334, 334,334,334,333,333,333,333,333,332,332,332,332,332,331,331,331, 331,331,330,330,330,329,329,329,328,327,327,327,327,327,326,326, 326,325,325,325,325,325,325,325,324,324,324,323,322,322,322,322, 321,321,321,321,320,320,320,320,320,320,320,319,319,319,319,318, 318,317,317,317,317,316,316,316,316,316,315,314,314,313,313,313, 312,312,312,312,312,312,312,311,311,311,311,311,310,310,310,310, 310,309,309,309,309,308,308,308,308,308,308,307,307,306,306,305, 305,305,305,304,304,304,303,303,302,302,302,301,301,301,301,301, 301,300,300,299,299,298,297,297,297,296,296,296,296,296,296,295, 295,295,295,295,295,295,294,294,294,294,294,294,294,293,293,293, 293,292,292,292,292,292,292,292,291,291,291,290,290,290,290,290, 289,289,289,289,288,288,288,288,288,287,287,287,287,286,286,286, 285,285,285,285,284,284,284,284,283,283,283,283,282,282,281,281, 280,280,280,280,280,279,279,279,279,279,279,279,278,278,277,277, 277,276,276,275,275,275,274,274,274,274,273,273,273,273,272,272, 272,269,269,268,268,268,268,268,268,268,267,267,267,267,267,267, 267,266,266,266 }; const int n4w1b1r5[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 396,396,396,396,395,395,394,394,394,394,393,393,393,392,392,392, 391,391,391,390,389,389,389,389,389,389,389,388,388,388,387,387, 387,386,386,386,386,386,386,386,385,385,385,384,384,384,383,382, 382,381,380,380,379,379,379,379,379,379,378,378,377,377,377,377, 377,377,377,376,376,376,376,375,375,374,374,374,374,374,374,373, 373,373,372,372,372,372,372,372,371,371,371,371,370,370,370,369, 369,369,368,368,368,367,367,367,367,366,366,365,365,365,364,364, 364,364,364,364,363,363,363,362,362,362,362,361,361,361,360,360, 360,359,359,359,359,359,359,358,357,357,357,357,357,355,354,354, 354,353,353,353,353,353,353,353,352,351,351,351,351,351,350,350, 350,350,350,349,349,349,348,348,348,348,348,348,348,347,347,347, 347,346,346,346,345,345,344,344,344,344,344,344,343,343,343,343, 343,342,342,342,341,341,341,341,341,340,339,339,339,339,339,338, 338,338,338,337,337,337,337,336,336,335,335,335,335,335,335,335, 334,334,334,334,333,333,333,332,332,332,331,331,331,331,330,330, 328,328,328,328,328,328,327,327,327,327,327,327,326,326,326,326, 325,325,325,325,325,324,324,323,323,323,323,323,323,323,323,323, 322,322,322,321,321,321,321,320,320,320,319,319,319,319,318,318, 318,318,318,317,317,317,317,317,317,316,316,316,316,315,315,315, 314,314,314,314,314,314,313,313,313,313,313,312,312,312,312,311, 311,311,310,310,309,309,308,308,308,307,306,306,306,306,306,306, 305,305,305,305,304,304,304,303,303,303,302,302,302,301,301,300, 300,300,300,300,300,299,299,299,298,297,297,297,297,297,296,296, 296,296,296,296,295,295,294,294,294,293,293,292,292,291,291,291, 291,291,291,290,290,290,290,289,289,288,288,288,288,288,288,288, 287,287,287,287,287,287,287,286,286,286,286,286,285,285,285,284, 284,284,284,284,283,283,283,283,282,282,281,281,281,281,280,280, 280,280,280,279,279,279,279,278,278,278,278,278,278,278,278,277, 277,277,276,276,276,276,276,275,275,275,275,274,274,274,274,274, 274,273,273,273,273,273,273,273,272,272,272,271,271,271,270,270, 270,270,269,269,269,269,269,269,269,268,268,268,268,268,267,267, 267,266,266,266 }; const int n4w1b1r6[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 396,396,396,396,396,395,395,395,394,394,394,394,394,394,393,393, 393,393,393,392,392,392,392,392,392,392,391,391,391,391,391,391, 391,390,390,390,390,389,388,388,388,387,387,387,387,387,387,387, 387,386,385,385,385,385,385,385,384,384,384,384,384,384,383,383, 383,383,382,382,382,382,382,382,382,382,381,381,381,381,381,380, 379,379,379,378,378,378,377,377,377,377,377,377,376,376,376,375, 375,374,374,374,373,373,373,372,372,372,372,371,371,371,371,370, 370,370,370,370,370,369,369,369,368,368,368,368,367,367,367,367, 367,367,366,366,366,366,365,365,365,365,364,364,364,363,363,363, 362,362,362,362,362,362,362,361,361,360,360,360,360,359,358,358, 357,357,357,357,356,356,356,356,356,356,356,355,355,355,355,354, 354,354,354,354,353,353,353,353,352,352,352,352,351,351,351,350, 349,349,349,349,349,348,348,348,347,347,347,347,347,346,346,346, 345,345,344,344,344,343,343,343,343,343,342,342,342,342,342,342, 341,341,341,340,340,340,340,340,339,339,338,338,338,338,337,336, 336,336,336,336,336,335,335,335,335,334,334,334,333,333,333,333, 332,332,332,332,331,331,331,330,330,330,330,330,330,328,328,328, 328,327,327,327,326,326,326,326,325,325,325,324,324,324,324,324, 323,323,323,323,323,323,322,322,321,321,321,321,321,320,320,319, 319,319,319,319,319,318,318,317,317,317,317,316,316,316,316,316, 316,315,315,315,315,314,314,314,314,313,313,313,313,313,312,312, 312,312,311,310,309,309,309,309,309,308,308,308,308,307,307,307, 307,306,306,306,305,305,305,305,304,304,304,304,303,303,303,302, 302,302,302,302,301,301,301,301,299,299,299,298,296,296,296,296, 295,295,295,294,294,294,294,294,294,294,293,293,293,293,293,292, 292,292,291,291,291,291,291,291,290,289,289,288,288,287,287,287, 287,286,286,286,285,285,284,284,284,284,284,283,283,283,282,282, 282,281,281,280,280,280,279,279,278,278,278,278,278,277,277,277, 276,276,276,276,276,276,276,276,276,276,275,275,275,275,275,275, 275,275,274,274,274,273,273,272,272,272,272,272,272,272,271,271, 271,271,271,271,271,270,270,270,270,269,269,269,268,268,267,267, 267,266,266,266 }; const int n4w1b1r7[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 396,396,395,395,394,394,394,393,392,392,392,392,392,391,391,391, 391,390,390,390,390,390,390,389,389,388,388,388,387,387,387,387, 386,386,385,385,385,385,384,384,384,384,384,384,383,383,383,383, 383,382,382,382,381,381,381,381,381,380,379,379,379,379,379,379, 379,378,378,378,378,378,377,377,377,377,376,376,375,375,374,374, 374,374,374,373,373,372,372,372,371,371,371,370,370,370,370,369, 369,369,369,369,368,368,368,367,367,367,366,366,365,365,365,364, 364,364,364,363,363,362,362,361,361,360,360,360,360,360,360,360, 360,360,359,359,358,358,358,358,357,357,357,357,356,356,356,355, 355,355,354,353,353,353,352,352,352,352,352,352,352,352,352,351, 351,351,350,350,350,349,349,349,349,349,348,348,348,347,347,347, 347,346,346,346,345,345,345,344,344,344,344,344,343,343,343,342, 342,342,342,342,342,342,342,341,341,341,341,340,340,340,340,339, 339,338,338,338,337,337,337,337,337,337,336,336,336,336,336,336, 336,336,335,335,335,335,334,334,333,333,333,332,332,332,332,332, 332,332,331,331,331,331,331,330,330,330,330,330,330,330,330,330, 330,329,329,329,329,329,328,328,328,327,327,326,326,326,326,325, 324,324,324,323,323,322,322,322,321,321,321,321,320,320,320,320, 319,319,318,318,318,318,318,318,317,317,317,317,316,316,316,316, 316,315,315,315,314,314,314,314,313,313,313,313,313,313,311,311, 311,310,310,310,310,310,309,307,307,306,306,306,306,306,306,306, 305,305,305,305,304,304,304,304,303,303,303,303,303,303,303,303, 302,302,302,301,301,301,301,301,301,301,301,301,300,300,299,299, 299,299,298,298,297,297,297,296,296,296,295,295,295,294,294,293, 293,293,293,293,292,292,292,292,292,292,291,291,291,291,291,291, 291,291,291,291,290,289,289,288,288,288,287,287,287,286,286,286, 285,285,284,284,284,284,284,284,283,283,283,283,283,283,282,282, 282,282,282,281,281,281,281,281,281,280,280,280,280,280,280,280, 280,280,279,279,279,279,279,278,277,277,276,276,275,275,275,275, 275,275,275,274,274,274,273,273,273,271,271,271,271,271,271,271, 270,270,270,270,270,269,269,269,269,268,268,268,267,267,267,267, 267,267,267,267 }; const int n4w1b1r8[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 396,396,396,395,395,394,394,393,393,393,393,393,392,392,392,392, 392,391,391,390,390,390,390,389,389,389,389,389,389,389,388,388, 388,387,387,387,387,387,386,386,385,385,385,384,384,384,383,383, 383,383,383,383,382,382,382,382,382,381,381,381,380,380,379,379, 379,379,379,378,378,378,378,377,377,377,377,376,376,376,375,375, 375,375,375,375,374,374,374,373,373,373,372,372,372,371,371,371, 370,370,370,370,369,368,368,368,367,367,367,367,366,366,366,365, 365,365,365,365,365,365,364,364,364,363,363,363,363,362,362,362, 362,361,361,361,361,361,361,361,360,360,360,360,359,359,359,359, 358,358,358,357,357,357,357,357,356,355,355,355,355,355,355,354, 354,354,354,354,353,353,353,353,352,352,352,351,351,351,351,350, 350,349,347,347,347,347,346,346,345,344,344,343,343,343,343,343, 343,343,342,342,342,342,342,341,341,341,340,340,340,340,339,339, 339,338,337,337,337,337,337,337,337,336,336,336,335,335,335,335, 335,334,334,334,333,333,333,332,332,332,331,330,330,329,329,329, 328,328,328,328,327,327,327,327,326,326,326,325,325,325,324,324, 324,324,323,323,323,323,323,323,321,321,321,321,321,321,320,320, 319,319,319,318,318,318,318,317,317,316,316,316,316,315,315,315, 315,315,314,314,314,314,313,313,313,313,313,313,312,312,312,311, 311,311,311,311,310,310,310,309,309,309,309,308,308,308,308,307, 307,307,307,306,306,306,306,306,306,305,304,304,304,304,304,303, 303,303,303,303,303,302,302,301,301,300,300,300,300,300,299,299, 299,299,299,299,298,298,298,298,298,297,297,297,296,296,296,296, 296,296,296,295,295,295,295,294,294,294,294,294,293,293,293,293, 293,292,292,291,291,291,291,291,291,290,290,290,290,290,290,290, 289,289,289,289,289,288,288,288,287,287,287,286,286,286,285,285, 284,284,284,284,283,283,283,283,283,283,283,282,282,282,282,281, 281,281,281,280,280,280,280,279,279,279,279,278,278,278,278,278, 278,277,277,277,277,277,277,277,277,277,276,276,276,276,275,275, 275,275,275,274,274,274,274,273,272,272,272,272,272,272,271,271, 270,270,270,270,270,270,270,270,270,268,268,268,267,267,267,267, 266,266,266,266 }; const int n4w1b1r9[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 396,396,396,396,395,395,395,395,395,395,395,394,394,394,393,393, 393,392,392,392,392,392,392,390,390,389,389,389,389,389,388,388, 388,388,388,387,387,387,387,387,387,386,386,385,385,385,385,384, 384,384,384,384,384,384,384,383,383,383,383,383,382,382,382,382, 382,381,381,381,381,380,380,380,380,380,380,379,379,379,379,378, 378,378,377,377,377,377,376,376,376,376,376,376,376,375,375,375, 374,374,374,374,374,373,373,373,372,372,372,372,371,371,371,371, 371,371,371,371,371,371,370,370,369,369,369,369,368,368,368,367, 367,367,367,367,367,366,365,365,365,365,364,364,364,364,363,363, 363,363,362,362,361,361,360,360,360,360,360,360,359,359,359,359, 358,358,358,358,358,358,357,357,357,357,356,356,356,355,355,355, 355,354,353,353,353,353,353,353,353,353,352,352,352,352,352,351, 350,350,350,350,350,350,350,349,349,349,349,349,348,348,347,347, 346,346,346,346,346,345,345,344,344,344,343,343,343,342,342,342, 342,342,342,342,341,341,341,341,341,340,340,340,340,340,340,339, 339,339,339,339,339,338,338,338,338,337,337,337,337,337,336,336, 335,334,334,334,333,333,333,333,333,332,332,331,331,331,331,331, 331,330,329,329,328,328,327,327,327,327,326,326,326,325,325,325, 325,325,325,325,324,324,324,323,323,323,323,322,322,322,322,322, 321,320,320,320,320,319,318,318,318,318,318,317,317,316,316,316, 316,316,315,315,315,315,315,315,315,315,315,315,314,314,314,314, 313,313,313,313,312,312,312,312,312,311,311,310,310,310,309,309, 308,308,307,307,307,307,307,307,306,306,306,306,304,304,304,303, 303,303,302,302,302,302,301,300,300,300,300,300,300,299,299,298, 297,297,297,297,295,295,295,295,295,295,295,295,294,294,294,294, 293,293,293,292,292,292,291,291,291,291,291,291,291,290,290,290, 290,290,289,289,289,289,288,287,287,287,287,286,285,285,284,284, 284,284,284,283,283,283,282,282,282,281,281,281,281,280,280,279, 279,279,279,278,277,277,276,276,276,276,276,276,275,275,275,274, 274,274,274,273,273,273,272,272,272,272,272,272,272,272,271,271, 270,270,270,269,269,269,269,268,268,268,268,267,267,267,267,266, 266,266,266,266 }; const int n4w1b2r0[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 495,492,491,489,489,489,488,488,486,485,485,484,483,482,481,481, 479,479,478,478,477,476,475,475,475,475,473,473,472,472,469,468, 468,468,468,467,467,466,466,466,466,465,465,464,463,462,461,459, 459,459,457,457,456,456,456,456,456,454,453,452,452,452,451,449, 448,448,447,446,446,446,446,445,444,444,444,444,443,443,443,443, 442,442,442,439,438,437,436,435,435,434,434,433,433,431,431,431, 430,430,430,430,429,427,427,426,426,425,425,425,424,424,424,423, 422,422,422,422,421,421,418,417,417,416,416,416,416,415,414,413, 412,412,411,411,411,410,408,407,406,405,403,403,403,402,400,399, 399,399,398,398,397,397,397,395,395,395,393,392,392,391,390,390, 387,385,384,383,383,382,381,381,381,380,380,379,379,378,378,377, 376,376,375,375,374,373,372,371,371,371,370,370,370,369,368,367, 366,366,366,365,365,365,364,364,364,362,362,362,360,356,355,354, 354,353,353,351,351,350,349,348,346,346,344,344,343,341,341,340, 339,338,336,333,333,333,332,332,329,329,327,327,327,326,325,325, 325,325,323,323,323,322,322,321,321,321,321,321,321,320,320,320, 319,318,318,317,317,316,316,316,315,314,312,312,312,312,311,311, 311,311,309,308,306,306,305,305,305,305,304,304,304,304,303,303, 303,303,303,299,299,299,298,298,297,297,296,296,295,294,293,292, 292,290,290,289,288,288,288,287,285,285,285,284,283,282,279,277, 277,277,277,276,275,275,274,273,272,272,270,268,267,266,266,266, 266,265,264,264,264,264,264,264,263,263,263,263,262,261,261,261, 259,258,257,257,256,255,255,255,254,253,253,253,251,251,251,250, 250,250,249,247,246,245,244,244,242,241,240,238,237,237,236,235, 233,233,233,232,232,231,231,230,230,229,228,227,227,226,226,225, 225,225,225,224,223,222,221,221,220,219,216,216,216,215,214,214, 214,213,213,212,212,211,211,209,208,207,207,207,206,206,205,205, 205,204,204,203,203,202,201,201,201,201,201,200,199,198,198,197, 197,195,193,193,192,191,190,190,190,188,188,187,187,187,187,186, 186,185,185,184,184,183,182,182,182,182,182,180,180,180,180,180, 180,179,177,177,177,176,175,175,175,175,174,172,171,171,170,169, 168,168,168,167 }; const int n4w1b2r1[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 494,494,493,492,490,489,487,487,486,485,485,485,485,483,483,482, 482,481,481,480,478,477,476,476,475,475,475,474,474,474,474,473, 473,472,471,471,471,471,470,470,470,467,467,467,467,466,466,466, 466,464,464,464,463,463,460,460,459,459,459,458,458,458,456,455, 455,455,454,452,452,452,451,450,449,447,446,446,446,446,445,445, 444,444,443,442,442,441,441,441,440,438,438,437,437,436,436,435, 435,434,433,432,432,432,431,431,430,427,427,427,426,426,425,425, 423,423,423,422,422,422,421,421,420,420,419,418,417,417,417,416, 416,416,413,413,413,412,412,411,410,410,409,409,407,407,407,407, 405,404,404,402,402,400,399,398,396,396,395,394,394,394,393,393, 393,391,390,389,389,389,388,388,388,387,386,385,385,384,384,383, 383,382,382,382,380,380,380,380,379,379,378,378,378,378,377,377, 375,375,374,373,373,373,372,371,370,370,369,369,368,368,367,366, 366,366,365,364,364,364,364,364,361,361,361,360,359,359,359,358, 357,357,355,355,354,354,354,353,352,352,351,351,350,349,349,349, 349,348,347,347,346,345,345,345,345,344,343,343,343,343,342,342, 341,341,341,341,340,338,338,337,336,336,336,335,335,335,334,334, 332,331,330,330,330,329,329,329,329,328,328,328,327,327,325,325, 325,325,323,323,322,322,321,320,319,318,318,317,316,315,315,315, 314,313,313,313,312,311,310,309,307,307,306,306,306,306,304,304, 303,303,302,302,300,300,300,299,298,298,297,297,296,295,295,294, 293,293,292,291,291,291,290,288,286,285,285,284,284,283,282,282, 282,279,278,277,276,276,276,275,274,273,273,272,272,271,270,270, 270,269,269,266,266,265,262,262,261,261,260,260,256,255,253,253, 251,251,250,249,249,246,246,242,241,241,241,240,240,239,239,237, 236,235,235,235,234,233,233,233,232,232,232,230,229,228,227,226, 225,224,223,223,222,222,220,220,220,219,219,217,217,216,215,215, 215,214,213,212,212,211,210,210,209,208,208,208,208,207,207,206, 206,205,205,205,204,203,203,201,200,199,199,198,198,198,198,197, 196,196,195,195,194,194,190,190,190,190,189,186,186,184,183,183, 181,180,179,179,177,177,176,175,174,174,174,174,173,172,171,171, 170,168,167,167 }; const int n4w1b2r2[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 495,494,494,493,492,491,491,490,490,489,489,488,488,487,487,487, 485,485,485,484,484,483,483,482,481,479,479,479,478,478,478,476, 476,475,474,474,474,474,472,470,469,468,468,467,466,466,466,466, 465,465,465,464,464,463,462,462,461,461,460,459,459,456,455,452, 452,452,451,450,449,449,449,449,449,448,448,446,442,442,441,441, 441,440,440,440,439,439,438,437,437,437,435,435,434,433,432,431, 431,431,431,431,430,429,429,427,427,427,426,426,425,423,422,420, 420,419,418,415,414,414,414,413,413,413,413,410,409,409,408,408, 407,406,406,406,405,404,404,404,403,402,402,401,400,400,399,398, 393,393,392,391,391,389,389,387,387,385,385,384,383,382,382,381, 381,381,379,379,378,375,373,372,371,370,370,370,368,367,367,366, 365,364,363,363,362,361,361,360,360,360,359,358,357,357,357,356, 356,355,354,353,350,350,348,347,347,347,346,346,345,345,344,343, 343,343,342,342,341,341,341,341,341,341,341,340,340,337,337,335, 335,335,335,333,332,332,332,331,330,329,329,328,327,327,326,325, 325,325,324,324,322,322,322,321,321,319,317,316,316,316,316,316, 315,315,313,313,313,313,312,311,310,309,308,307,307,307,305,304, 304,304,302,302,301,301,301,301,300,300,299,299,299,298,297,296, 296,296,296,296,294,294,292,292,290,290,289,288,288,287,287,287, 287,286,286,285,285,284,283,282,282,281,281,281,280,280,280,278, 278,278,278,276,276,275,274,273,273,272,271,271,271,269,269,266, 265,265,264,264,263,263,262,262,262,261,261,258,258,257,256,256, 255,254,254,254,254,253,253,253,251,251,250,250,250,250,250,249, 249,248,248,248,248,248,247,247,247,246,246,246,246,243,241,240, 240,238,238,238,238,237,237,237,237,236,236,235,235,234,232,230, 229,229,229,228,228,228,228,228,227,227,226,226,225,224,224,224, 223,222,222,222,221,220,220,220,219,219,216,213,213,213,212,212, 212,212,210,210,209,209,208,208,208,207,207,207,207,206,206,206, 206,204,204,203,203,202,202,202,202,201,201,199,199,198,197,196, 196,195,195,195,194,193,193,192,190,190,189,188,187,186,186,186, 185,185,184,184,184,184,183,182,180,178,175,173,171,170,170,169, 168,167,167,167 }; const int n4w1b2r3[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 495,493,493,490,490,489,489,489,488,488,487,486,486,486,485,485, 485,485,485,484,484,483,482,481,480,480,478,477,475,475,475,474, 474,474,473,472,471,470,470,470,470,469,468,467,467,467,466,465, 465,464,464,464,464,463,462,459,458,458,458,457,457,456,456,455, 454,454,454,454,452,451,451,449,449,449,448,446,444,444,443,442, 439,438,438,438,438,438,437,436,436,435,434,433,432,432,432,431, 431,430,429,428,427,426,426,425,425,425,424,424,423,423,422,421, 419,419,419,418,418,417,416,416,414,413,413,413,411,411,411,410, 409,409,409,407,404,404,403,402,401,401,400,400,398,398,397,397, 396,396,396,396,395,395,394,393,393,392,389,388,388,386,386,385, 385,385,384,384,384,383,383,383,381,381,380,380,379,378,378,377, 376,375,374,374,374,372,372,372,370,370,369,369,368,368,368,367, 367,366,366,366,365,364,362,362,362,361,361,359,359,359,357,356, 356,355,354,354,354,353,353,351,350,350,350,350,348,348,348,347, 347,346,345,345,344,344,344,343,343,342,342,341,340,340,340,340, 340,339,338,337,336,335,333,333,332,332,330,330,326,323,323,323, 323,322,321,321,320,319,319,317,316,316,315,315,314,314,312,312, 311,311,311,311,311,311,311,311,309,308,307,307,307,306,305,304, 304,304,303,302,300,300,299,298,297,297,296,295,295,295,294,293, 293,293,293,292,291,290,290,289,288,288,287,286,286,286,285,283, 282,282,282,281,280,280,280,280,279,278,278,278,278,277,276,275, 275,275,274,274,273,273,272,272,271,271,271,271,270,269,268,267, 267,266,265,265,265,263,262,261,261,260,259,259,258,258,257,257, 256,256,256,254,254,253,253,253,252,251,250,247,247,246,244,244, 244,243,243,242,242,241,240,240,239,239,239,238,237,237,237,237, 237,236,235,234,234,234,233,232,232,232,231,231,230,230,229,229, 227,227,225,225,225,224,223,222,221,220,220,220,218,218,217,216, 216,216,214,213,213,213,212,211,211,210,209,208,208,207,207,206, 206,206,206,205,205,203,202,201,201,200,200,200,200,198,197,197, 196,196,195,195,194,193,191,191,189,188,187,186,185,184,183,182, 181,181,181,179,178,178,177,177,176,176,176,175,175,174,173,171, 170,169,168,167 }; const int n4w1b2r4[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 495,492,492,491,491,490,490,490,489,488,487,486,486,486,485,484, 481,480,480,480,479,479,478,476,475,475,473,473,471,471,471,470, 470,468,468,468,467,467,465,464,463,463,462,461,460,459,459,458, 458,458,456,452,452,451,450,450,448,447,447,447,447,446,446,446, 445,445,443,443,442,442,441,441,441,440,439,438,438,438,438,437, 436,436,435,435,434,434,432,432,432,432,430,430,429,429,429,428, 428,427,426,425,424,423,423,423,422,421,419,419,418,418,417,417, 416,414,413,413,413,413,412,411,410,409,409,408,406,406,405,404, 404,404,403,402,400,398,398,398,397,397,397,395,394,393,393,392, 392,392,390,389,389,389,389,385,385,385,385,385,384,383,383,383, 381,381,379,379,377,377,376,375,375,375,375,374,373,372,371,371, 370,369,369,369,369,369,366,366,366,365,364,364,364,363,363,362, 362,361,361,361,360,359,357,356,356,356,356,356,355,353,353,353, 352,352,351,351,349,349,348,348,347,347,347,346,346,346,345,344, 343,343,342,340,340,340,339,338,337,337,336,335,333,333,333,332, 332,330,330,330,329,329,329,327,326,326,324,324,322,322,321,321, 321,320,320,319,319,319,318,318,318,318,318,317,317,316,314,313, 312,312,310,310,310,309,308,308,308,306,306,306,306,305,305,304, 302,301,301,300,299,298,298,296,295,295,293,293,293,293,293,292, 292,292,291,291,290,290,289,288,288,288,286,285,285,285,285,284, 284,284,283,281,281,280,280,280,278,278,277,277,276,276,276,275, 274,274,273,271,271,270,270,270,269,268,268,268,267,266,266,265, 264,263,262,262,262,262,261,261,260,260,260,260,259,258,258,256, 256,255,254,253,252,251,251,249,248,247,246,246,246,246,246,245, 245,245,245,244,244,244,244,243,243,243,242,242,240,240,239,239, 239,238,238,236,235,235,235,234,234,234,233,233,233,232,231,229, 228,228,228,227,226,226,225,222,222,219,219,218,218,217,216,216, 215,215,215,213,212,212,212,211,211,210,210,209,209,208,208,207, 207,206,206,205,204,203,202,201,200,200,200,200,198,197,197,196, 195,193,192,191,191,190,189,189,189,189,189,188,188,187,186,185, 185,181,181,180,180,177,176,176,174,174,172,172,171,170,169,169, 169,168,167,167 }; const int n4w1b2r5[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 495,493,491,491,491,490,490,490,488,488,486,486,486,484,484,484, 484,483,482,482,482,478,477,476,476,473,473,470,470,469,468,468, 467,467,467,467,466,466,466,465,465,464,463,460,459,459,459,457, 457,456,455,455,455,453,453,452,451,450,449,449,449,448,448,448, 448,448,447,446,446,444,444,443,442,440,440,439,439,436,434,433, 432,431,431,430,427,427,426,426,426,426,425,424,424,424,423,423, 419,419,418,417,416,415,415,415,414,413,411,411,410,409,409,407, 407,407,406,406,405,404,404,403,403,402,401,400,399,399,399,398, 397,397,397,396,396,395,394,394,394,394,393,393,392,392,391,390, 390,389,388,387,387,386,385,384,383,381,381,381,381,380,379,378, 378,377,376,374,373,373,373,373,372,371,370,370,370,369,369,369, 369,369,368,368,366,365,364,364,364,364,362,362,362,361,360,360, 360,359,358,358,357,356,356,356,355,355,355,353,353,352,352,351, 351,350,350,350,349,348,348,348,346,346,346,346,346,343,343,343, 341,340,340,339,337,337,336,336,336,334,331,331,331,331,330,328, 327,325,324,323,323,321,318,318,318,315,315,315,313,313,313,312, 311,309,309,309,309,308,308,307,307,306,306,305,304,304,302,302, 301,300,299,298,297,297,297,296,296,296,296,295,294,294,293,293, 291,290,289,289,289,288,287,285,283,283,282,280,280,280,279,279, 279,278,278,277,277,277,277,276,275,275,275,275,274,274,273,272, 272,272,271,270,270,270,269,269,269,268,268,267,266,266,264,264, 264,264,264,264,263,261,260,260,260,259,259,258,258,257,256,256, 254,254,253,252,252,251,250,249,249,249,249,248,248,246,245,245, 244,243,243,243,243,240,240,240,239,238,238,238,238,237,237,236, 235,235,234,232,231,231,231,230,229,228,228,227,226,226,223,223, 222,222,221,221,220,220,219,218,217,216,216,214,214,214,214,212, 212,212,212,211,210,210,210,209,207,206,205,203,202,202,201,201, 200,199,199,198,198,197,196,195,195,194,193,193,192,192,192,191, 191,190,190,190,189,189,188,188,187,186,186,186,185,185,185,184, 183,182,182,181,180,180,180,179,179,179,179,178,178,178,177,177, 176,176,176,175,174,174,173,173,171,171,171,170,170,170,168,168, 167,167,167,167 }; const int n4w1b2r6[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 495,494,493,493,492,492,491,490,490,490,490,489,487,487,487,486, 486,486,485,485,484,484,484,483,479,478,478,476,475,474,473,473, 472,471,471,469,467,466,464,462,462,462,462,462,461,461,461,460, 459,459,458,457,457,456,456,455,454,454,453,453,453,453,453,452, 451,451,450,449,449,449,449,449,448,447,446,446,445,445,444,443, 441,441,441,440,438,438,438,437,437,436,435,435,435,434,434,434, 434,433,433,432,432,431,431,431,430,430,429,428,428,428,428,428, 428,428,427,427,426,425,425,424,424,423,423,423,423,421,420,420, 419,418,418,417,417,417,417,417,417,417,416,415,415,414,414,414, 411,411,410,410,409,408,408,408,407,406,405,405,404,402,402,402, 402,401,401,401,401,401,400,400,398,397,396,396,395,395,394,393, 393,393,392,391,390,389,388,388,387,387,387,385,385,384,384,383, 382,382,381,380,380,379,379,378,378,377,377,377,375,374,374,373, 373,373,373,371,371,371,370,370,370,370,369,369,366,364,363,360, 360,359,359,358,357,357,357,355,355,355,355,353,352,352,351,349, 349,349,348,347,347,345,344,344,344,342,341,341,341,340,339,338, 337,337,335,335,334,334,334,334,333,333,333,332,332,332,331,331, 329,329,328,327,327,325,324,324,323,323,322,322,322,320,319,319, 319,319,318,317,315,315,314,314,313,313,313,312,311,310,310,309, 308,307,306,305,305,304,303,300,296,296,295,294,293,292,291,290, 290,289,288,285,285,284,283,283,282,282,279,279,278,278,276,275, 275,275,275,273,271,271,270,270,270,270,269,269,268,268,267,267, 266,265,265,263,263,263,262,262,262,261,259,259,258,258,258,256, 256,256,255,254,254,253,253,253,251,251,250,249,247,245,244,243, 241,238,238,238,237,236,236,235,235,234,232,231,231,231,229,229, 229,228,227,227,227,226,225,224,224,224,224,222,222,222,221,219, 218,218,218,218,217,215,214,214,213,212,211,211,210,210,210,208, 208,207,206,206,205,205,205,204,204,203,203,203,201,201,200,200, 200,198,196,196,196,196,196,195,195,194,194,192,191,190,189,189, 188,188,186,186,185,184,184,184,184,183,183,182,181,180,180,179, 179,176,175,175,174,173,173,172,172,172,172,171,170,170,169,169, 168,168,168,168 }; const int n4w1b2r7[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 495,495,495,495,495,494,494,493,493,492,492,491,490,490,490,489, 489,489,488,488,486,486,485,485,484,483,482,482,480,479,479,478, 477,476,474,472,472,471,471,471,471,471,470,469,468,468,467,466, 466,464,463,462,462,462,462,461,460,460,460,460,459,459,459,457, 457,456,455,455,454,454,454,453,453,452,452,451,451,451,450,449, 448,448,447,447,446,446,446,445,444,444,443,442,440,440,440,440, 440,440,438,438,436,436,434,433,431,431,430,430,428,427,426,425, 418,417,416,416,415,415,414,414,414,413,412,412,411,411,411,411, 411,410,409,408,408,407,406,406,405,405,405,405,404,404,404,404, 403,403,403,402,402,401,401,401,400,399,398,397,397,397,396,396, 395,395,395,395,394,393,391,391,386,385,385,385,384,383,382,381, 380,380,380,379,378,378,377,376,375,375,374,374,373,373,373,372, 372,371,371,370,370,369,368,367,367,367,365,364,364,364,364,362, 360,360,359,359,359,358,358,358,357,357,356,355,354,354,354,354, 354,352,352,351,351,351,350,350,350,349,347,347,346,345,345,342, 342,341,341,341,341,339,339,339,338,337,337,337,337,337,336,335, 335,334,333,333,332,332,328,326,326,326,326,324,323,323,321,321, 320,319,318,317,316,316,316,315,315,315,314,313,313,313,311,311, 311,311,311,311,310,310,310,309,309,309,309,308,308,308,307,307, 306,306,304,303,303,302,301,300,299,299,298,298,298,297,297,297, 297,295,294,294,293,293,292,292,292,291,291,290,290,290,289,287, 287,286,283,283,282,281,281,280,279,279,278,278,276,276,275,274, 274,274,271,269,269,268,268,268,266,265,263,261,261,257,257,257, 256,255,255,253,253,252,251,251,250,249,249,248,247,246,245,245, 244,244,242,242,241,239,238,237,236,235,235,234,234,233,233,232, 231,230,230,230,229,228,227,226,225,225,224,223,222,221,221,220, 218,218,217,215,214,214,214,214,214,214,213,213,211,210,209,208, 208,207,207,207,207,206,206,203,203,203,202,202,200,198,198,197, 197,196,196,196,195,195,195,194,193,193,192,192,192,191,191,190, 189,187,187,187,187,186,186,186,186,185,185,184,184,184,183,183, 182,182,182,180,180,179,178,178,177,175,175,174,171,171,168,168, 168,168,168,167 }; const int n4w1b2r8[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 495,495,495,495,493,492,491,491,490,490,490,489,489,488,488,488, 487,487,487,487,487,485,485,484,482,482,481,481,480,480,480,479, 479,478,478,478,478,478,477,477,477,476,475,475,474,474,474,473, 472,471,470,470,468,467,466,466,465,465,465,465,464,464,464,463, 462,462,462,461,461,457,457,457,456,456,455,455,454,453,448,448, 448,448,447,447,447,446,443,442,441,437,436,436,436,436,435,435, 434,434,433,432,432,432,432,431,431,431,430,429,429,429,428,427, 426,426,425,425,425,425,425,424,424,422,421,420,420,418,418,416, 415,415,415,414,414,413,413,413,410,409,409,409,408,407,406,405, 404,404,404,403,403,401,401,400,399,398,397,396,396,396,395,395, 394,393,393,392,392,392,391,391,390,388,388,387,387,387,386,386, 385,385,384,383,383,382,380,380,380,380,380,378,376,376,375,374, 374,374,373,373,371,369,369,367,367,366,366,366,366,365,364,364, 363,363,363,363,362,362,359,359,358,357,356,356,355,355,355,354, 354,353,353,352,351,350,350,348,348,347,347,346,346,345,344,343, 342,342,341,341,339,338,338,338,337,337,337,336,336,334,333,332, 332,331,329,329,328,328,326,323,323,322,322,322,321,321,320,318, 317,316,315,315,314,314,313,312,312,310,310,309,308,308,307,306, 306,305,305,304,304,303,302,301,301,300,299,298,298,296,295,295, 292,292,291,291,291,290,290,288,288,288,285,285,285,284,284,282, 282,281,281,281,281,278,278,276,275,275,274,274,273,273,272,272, 271,270,270,268,267,267,267,264,263,263,263,263,261,261,260,259, 258,258,258,256,255,255,255,255,254,252,252,250,249,248,248,248, 248,247,246,246,246,245,245,245,245,244,244,244,244,244,244,242, 242,240,240,240,239,239,238,237,237,236,236,234,234,232,232,232, 231,230,229,228,228,227,227,226,225,225,225,223,223,222,222,222, 220,220,220,218,218,215,215,214,214,213,213,213,212,211,211,210, 209,208,208,207,207,207,206,204,204,204,204,202,202,200,200,199, 197,197,196,196,196,195,194,194,193,193,191,189,188,187,185,185, 185,184,183,183,183,183,183,182,182,182,179,179,179,179,178,178, 178,178,177,177,176,176,176,176,175,175,174,174,172,171,170,169, 169,167,167,167 }; const int n4w1b2r9[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 494,494,494,494,493,492,492,491,491,490,490,490,490,489,489,487, 486,486,486,485,485,484,484,483,482,481,480,479,477,477,476,476, 474,474,474,473,473,473,473,473,472,470,470,468,468,468,467,467, 467,466,465,462,462,462,461,460,460,460,460,459,459,458,457,457, 457,456,456,455,452,452,452,452,451,450,449,449,448,448,446,446, 446,445,443,443,443,443,441,441,441,440,440,440,439,438,436,436, 435,434,434,433,433,432,431,431,430,429,428,427,427,426,426,424, 424,422,422,422,421,421,421,419,418,418,418,417,417,416,415,415, 414,414,413,413,413,412,412,412,411,411,410,408,408,407,407,406, 406,405,405,404,403,403,403,401,401,400,400,400,400,398,396,396, 396,395,395,393,393,393,393,392,391,391,390,390,390,390,390,389, 388,387,385,384,384,384,384,383,383,382,382,380,380,379,378,378, 377,376,376,376,376,375,373,373,371,371,371,371,370,369,369,369, 369,368,367,367,365,365,364,364,364,364,363,363,363,363,363,362, 362,362,361,361,359,359,359,358,358,357,357,355,354,353,353,353, 353,351,351,351,351,351,350,349,348,348,347,346,345,345,344,344, 343,342,342,341,341,340,339,338,337,336,336,336,336,336,335,334, 333,333,333,333,332,332,331,330,329,328,328,327,326,326,325,323, 321,321,320,319,318,318,317,317,317,317,316,315,315,313,313,312, 312,311,310,310,309,309,309,308,308,308,307,307,305,304,303,302, 301,301,299,298,297,297,294,293,290,289,289,289,288,287,287,286, 286,285,284,284,283,282,281,279,278,278,278,278,277,277,276,276, 271,271,270,269,269,266,265,265,265,264,264,263,263,263,263,262, 258,257,257,257,254,253,253,252,251,250,250,249,247,247,246,243, 243,242,242,241,239,238,238,236,236,235,235,234,234,233,232,229, 228,228,228,224,223,223,221,220,219,218,217,216,216,215,215,214, 214,212,212,212,210,210,209,208,208,208,206,206,205,204,204,203, 203,202,202,202,201,201,201,200,200,199,199,197,197,197,196,196, 196,195,195,194,194,194,193,193,193,192,192,190,190,190,190,189, 188,188,187,187,186,185,185,183,182,182,181,181,181,180,180,180, 179,178,178,177,177,176,175,175,175,174,174,174,173,171,170,170, 169,169,169,167 }; const int n4w1b3r0[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 626,622,621,619,619,619,617,617,617,615,613,611,610,610,608,607, 607,607,607,606,605,602,602,600,599,599,599,597,595,593,590,590, 589,589,589,588,588,586,585,584,583,583,583,582,581,581,580,578, 578,578,576,576,576,574,573,573,572,571,570,569,569,567,563,562, 562,560,559,558,556,555,553,551,548,546,545,542,541,537,536,534, 533,531,530,529,528,528,526,525,524,523,523,523,522,521,521,517, 512,509,509,505,501,498,497,496,496,494,493,493,492,490,490,489, 485,482,482,481,481,479,478,477,477,475,473,472,467,465,465,465, 464,463,462,462,461,460,459,459,458,456,456,456,455,453,453,449, 449,448,448,448,446,446,445,444,443,442,442,441,439,438,438,436, 436,435,435,435,434,433,431,431,428,428,427,426,424,421,420,419, 419,418,418,417,416,413,413,412,409,406,404,403,403,402,402,402, 401,398,396,395,393,389,387,386,384,384,384,382,381,380,379,376, 376,375,373,370,369,367,366,365,364,364,363,363,362,360,359,357, 356,355,354,354,351,350,349,348,347,347,347,346,342,341,339,338, 338,337,336,334,333,330,330,330,329,329,329,328,327,327,327,325, 322,322,319,318,318,317,313,308,307,307,306,305,303,302,302,301, 301,301,298,297,297,296,295,294,293,289,286,286,285,285,284,284, 284,281,280,278,274,273,273,272,271,270,270,269,269,268,267,267, 266,264,264,261,259,257,257,255,254,253,253,252,250,249,249,249, 248,248,247,243,243,243,242,242,242,242,241,239,237,236,236,233, 231,229,229,228,227,227,227,226,225,224,223,222,222,219,218,218, 215,215,215,213,213,211,210,208,207,206,204,202,201,199,197,197, 196,194,193,193,192,190,189,189,184,184,183,182,181,181,181,181, 175,173,172,171,169,169,163,161,158,158,157,157,155,155,154,153, 153,151,150,149,148,147,147,144,144,144,143,143,141,141,139,137, 137,137,136,136,134,131,130,130,130,130,126,126,121,120,117,117, 116,115,114,110,108,107,106,105,105,102,101,99,96,95,91,91,91, 89,87,85,84,82,82,81,80,80,77,77,74,72,72,71,71,70,70,69,68,68, 68,67,66,66,63,61,59,58,55,54,54,54,53,52,52,52,51,50,49,48,47, 46,42,41,39,38,37,36,35,35 }; const int n4w1b3r1[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 627,626,625,625,624,623,619,619,618,617,616,616,614,614,613,612, 611,608,608,607,607,607,603,602,602,602,602,599,599,599,596,593, 593,593,592,591,591,590,589,589,588,586,586,585,584,584,583,582, 581,581,580,577,575,572,571,569,567,566,565,564,563,562,562,562, 561,561,561,561,559,558,557,557,556,553,550,550,549,549,547,546, 545,544,542,540,539,539,538,536,535,535,535,531,531,529,529,527, 526,526,523,520,520,519,517,516,513,512,512,512,512,511,511,510, 508,507,506,506,505,505,504,503,503,499,499,499,497,496,494,493, 490,489,489,487,487,487,482,480,480,480,478,476,475,472,469,468, 467,466,466,466,464,464,462,460,460,459,458,457,457,454,453,453, 452,451,451,449,448,446,445,443,443,442,442,440,440,439,439,438, 437,436,434,432,431,431,429,428,425,425,423,423,423,422,422,420, 419,419,418,417,416,415,415,413,413,411,410,408,408,406,397,397, 393,392,388,385,384,381,381,380,380,379,379,377,377,376,375,375, 374,373,373,373,370,369,368,367,366,365,364,363,363,363,362,360, 359,355,353,351,348,347,346,346,344,342,341,340,340,338,337,336, 336,335,334,333,332,331,330,330,329,329,328,328,328,326,325,324, 322,322,321,319,319,318,318,318,316,314,313,312,311,308,307,304, 303,301,300,298,294,292,292,292,291,289,286,285,285,283,279,278, 275,270,270,270,269,269,268,267,265,264,263,262,259,255,254,252, 251,247,245,243,243,241,241,239,239,235,232,232,231,229,229,228, 228,225,224,218,217,217,215,213,212,211,211,210,210,208,207,203, 202,201,201,201,200,200,198,198,198,196,195,194,194,193,192,191, 191,191,191,191,191,189,189,188,187,185,185,182,181,180,180,179, 178,176,176,175,175,174,170,169,167,167,166,164,164,164,163,163, 161,159,159,157,157,156,156,156,148,148,148,146,145,145,144,143, 142,139,137,136,133,131,130,129,128,127,126,124,124,122,121,120, 117,116,116,115,115,113,112,110,109,107,104,103,101,101,100,99, 99,98,98,97,97,97,97,96,94,94,94,92,91,91,91,91,90,88,87,85,85, 84,83,82,82,81,80,79,77,76,74,73,71,67,67,63,61,60,60,56,54,51, 50,48,46,45,43,42,40,40,39,36 }; const int n4w1b3r2[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 627,621,618,617,616,615,615,614,611,611,610,609,609,609,609,608, 608,608,605,605,604,603,602,601,598,598,598,597,596,596,596,596, 596,595,594,593,592,591,588,587,586,585,584,584,583,582,580,579, 579,578,578,576,574,574,573,571,571,570,570,570,570,569,567,566, 565,565,564,564,563,561,561,561,559,559,559,556,556,555,551,550, 548,547,546,546,543,543,540,538,538,536,532,532,531,531,529,529, 528,528,527,525,524,523,523,522,521,520,519,517,516,512,512,510, 510,510,509,509,506,506,505,503,503,502,501,501,500,500,500,499, 499,497,497,496,495,495,495,494,491,490,489,488,487,486,486,486, 483,482,481,481,479,478,477,477,477,476,475,474,473,471,471,469, 467,467,463,461,456,453,452,451,451,451,449,448,447,447,444,443, 441,440,440,438,438,432,431,430,429,428,427,426,425,425,423,422, 422,421,421,420,420,418,418,414,413,413,412,412,411,409,409,408, 405,404,401,398,398,395,394,390,390,389,389,388,388,387,387,386, 385,384,383,381,380,380,378,377,376,376,374,373,370,369,369,365, 362,361,361,360,358,356,353,353,352,351,350,348,346,346,345,343, 342,341,341,338,337,337,335,334,333,331,331,329,326,324,323,322, 321,321,318,317,314,314,314,312,312,312,311,308,306,304,303,301, 301,299,299,299,298,297,295,294,293,293,290,287,286,280,280,278, 278,276,274,274,274,274,272,269,269,269,268,262,260,259,258,257, 257,256,255,255,254,252,251,245,241,240,240,239,237,237,236,235, 233,231,231,230,227,226,226,223,222,222,222,220,219,218,216,208, 208,207,206,206,206,206,206,206,204,203,202,202,200,200,197,196, 193,192,191,189,188,186,186,185,185,183,181,181,180,179,178,177, 176,176,174,174,174,174,172,171,168,167,167,166,166,163,161,159, 159,159,157,157,156,156,152,151,149,148,146,146,145,143,142,140, 139,136,136,135,134,134,130,128,128,127,126,126,125,124,123,121, 120,118,114,113,113,112,111,111,110,109,109,108,108,108,107,106, 105,105,103,103,103,101,101,98,97,96,93,90,90,89,85,84,81,80, 76,75,75,75,75,74,74,70,68,66,64,63,62,62,61,60,57,55,55,55,52, 51,51,47,42,41,40,40,39,38,38,37,37,36 }; const int n4w1b3r3[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 625,625,624,623,622,622,621,619,619,618,614,613,612,611,611,609, 607,606,605,604,600,599,596,596,595,594,592,591,588,586,583,581, 579,577,577,576,573,573,573,573,572,571,570,569,567,566,566,566, 566,565,563,562,560,559,559,559,559,558,558,556,553,552,552,548, 548,547,546,545,545,542,542,542,542,541,540,539,539,535,532,530, 529,529,528,527,527,525,524,524,524,520,517,517,514,514,511,510, 509,509,509,509,508,507,507,505,504,504,504,502,499,499,496,494, 493,491,490,489,489,489,488,485,485,483,483,481,480,479,479,476, 475,475,474,473,467,466,466,466,465,464,461,461,461,461,461,460, 460,459,459,457,456,454,454,454,452,450,449,448,448,447,443,442, 442,441,439,439,439,439,438,437,433,433,433,433,433,433,432,432, 432,431,431,429,428,428,426,425,425,423,423,422,420,420,420,420, 417,414,411,410,410,409,409,408,407,407,405,400,399,398,397,397, 395,394,394,394,389,389,387,384,384,381,380,379,379,379,378,377, 377,376,374,373,373,372,372,369,368,368,368,368,367,366,365,363, 363,361,358,355,350,348,347,344,344,343,339,339,337,336,335,334, 333,333,332,332,331,330,328,327,327,326,326,326,325,325,321,321, 320,320,320,317,311,311,311,310,309,309,306,304,302,302,300,299, 298,297,295,295,294,293,293,292,291,291,291,289,289,289,288,288, 285,284,284,284,282,282,279,279,278,277,276,276,275,274,270,270, 269,269,269,268,268,260,260,259,259,259,258,256,254,253,250,249, 248,246,246,245,243,243,243,242,239,239,238,235,232,231,231,225, 224,220,219,219,215,214,212,212,211,210,209,207,206,205,205,204, 202,202,202,201,200,200,199,198,198,197,196,192,190,190,187,187, 182,180,180,178,177,177,175,175,173,172,168,166,165,161,160,159, 157,155,152,152,150,150,145,145,144,139,139,139,139,138,138,137, 133,132,131,131,130,130,129,129,127,123,123,122,121,121,120,120, 118,118,118,118,118,115,113,113,111,111,109,109,107,107,103,102, 102,102,99,98,95,95,94,93,90,89,87,87,86,85,81,81,80,79,78,78, 76,75,74,72,69,69,66,64,63,59,58,57,56,56,56,55,54,54,54,53,53, 51,51,50,49,49,47,47,44,40,40,36 }; const int n4w1b3r4[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 626,626,625,623,623,622,621,619,619,617,616,615,614,613,613,610, 607,605,604,601,600,598,596,595,592,591,590,589,589,588,587,586, 584,583,581,581,577,574,572,571,568,565,565,563,563,563,558,557, 557,556,555,554,553,553,553,546,545,545,543,543,543,542,541,540, 538,537,537,535,533,532,531,530,529,527,526,525,520,520,519,518, 517,515,514,513,511,509,508,506,505,501,497,497,496,493,491,486, 485,485,481,477,475,473,471,468,468,467,467,467,464,463,461,460, 457,457,457,456,450,450,448,447,447,445,445,443,443,441,439,438, 438,437,434,434,431,430,427,425,424,424,423,422,422,421,420,419, 419,418,415,412,412,412,410,410,408,407,407,406,405,403,403,399, 398,397,397,396,395,394,394,393,390,388,387,386,386,385,381,378, 378,377,377,376,375,372,370,369,368,367,366,366,366,366,366,364, 363,362,362,362,361,360,359,358,357,356,356,352,351,350,350,350, 349,348,347,347,343,343,343,342,342,340,340,338,338,337,337,337, 336,334,333,331,330,329,328,326,323,323,322,321,319,318,318,317, 316,316,316,316,314,313,310,310,308,308,308,307,305,305,305,304, 304,304,304,304,303,303,303,302,300,299,298,298,297,297,297,293, 290,290,289,288,287,286,286,281,280,279,278,277,276,274,273,272, 271,269,269,269,268,266,266,266,264,263,263,263,260,259,259,258, 258,254,252,248,247,245,245,244,242,242,241,240,239,235,235,232, 232,231,230,229,228,227,227,225,225,220,220,219,217,216,213,213, 212,211,208,208,208,208,203,200,200,199,199,198,198,197,197,197, 195,195,194,194,192,190,190,188,187,187,186,185,183,183,182,182, 182,180,180,178,177,176,176,175,174,172,172,171,170,167,166,166, 161,160,160,158,158,156,156,156,156,153,153,152,150,148,147,147, 147,141,140,139,139,138,138,138,135,134,131,131,130,128,126,126, 125,125,125,124,123,123,123,120,119,119,118,117,116,115,114,113, 113,112,111,110,107,106,105,105,104,103,103,101,100,100,98,98, 98,98,98,96,94,93,91,89,88,85,84,82,81,78,78,77,75,75,74,72,71, 70,68,67,66,64,64,64,64,59,58,58,57,56,54,54,52,51,50,49,46,45, 45,43,43,43,42,39,38,38,37,36 }; const int n4w1b3r5[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 627,626,625,624,624,621,619,618,618,617,616,609,608,608,608,606, 606,605,604,604,604,602,601,600,598,595,594,592,591,590,589,589, 586,586,584,583,583,581,581,580,579,577,576,575,575,574,574,572, 570,570,569,567,567,564,563,563,563,560,558,554,553,552,550,550, 549,548,548,548,546,545,543,543,542,542,540,539,537,536,536,534, 533,530,526,523,522,521,520,520,519,519,517,517,516,516,511,510, 510,506,503,503,502,502,499,498,497,497,496,495,491,491,491,490, 489,489,486,482,481,481,481,478,477,477,477,476,475,475,474,472, 471,471,469,467,467,467,466,463,462,462,461,461,458,457,454,453, 452,450,449,449,449,446,446,445,443,441,441,437,435,434,434,432, 432,430,429,426,425,425,424,421,421,418,418,417,415,411,411,411, 408,407,406,405,404,404,403,403,403,402,400,399,396,395,395,395, 392,391,391,391,390,390,388,388,387,385,384,381,381,381,380,380, 380,380,377,377,375,374,373,372,371,371,369,368,366,366,366,365, 364,364,359,355,351,351,350,348,347,347,346,344,342,340,339,338, 337,336,335,332,331,331,331,329,329,327,327,326,325,324,324,324, 320,320,320,319,318,318,317,316,315,314,314,314,314,312,306,304, 303,301,300,300,299,297,297,296,292,291,288,288,288,284,283,282, 277,275,272,272,271,270,268,263,261,261,261,261,260,256,256,256, 254,254,250,249,249,246,246,243,242,239,237,231,231,230,230,230, 229,225,224,223,223,222,222,216,216,215,214,214,213,212,211,210, 209,209,208,206,203,201,199,199,199,198,196,196,195,195,192,192, 190,188,185,183,183,181,181,180,179,178,176,175,173,170,170,170, 168,167,167,161,159,156,156,156,156,155,154,154,153,152,151,150, 149,148,144,143,142,141,140,140,139,138,137,136,136,130,129,129, 128,124,122,121,121,121,115,115,114,114,112,112,111,111,108,108, 108,107,107,106,106,106,106,106,102,101,101,99,98,98,98,98,97, 97,95,94,90,89,89,88,86,86,86,85,84,81,81,80,80,79,79,79,77,77, 76,75,75,74,74,74,74,73,72,68,67,66,65,65,64,63,62,62,61,61,60, 60,60,59,58,58,55,55,54,53,53,50,48,46,45,45,45,44,43,43,40,39, 38,37,37,37 }; const int n4w1b3r6[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 626,626,625,625,622,621,621,621,620,620,620,619,618,616,616,616, 616,615,615,611,610,610,608,606,603,602,601,599,598,597,597,595, 594,594,592,591,589,586,586,584,581,578,578,578,577,575,574,573, 570,570,568,564,562,561,560,558,556,555,554,553,552,551,549,547, 547,546,546,543,542,541,540,539,539,538,536,535,533,532,530,529, 529,528,527,526,523,522,521,520,517,516,515,515,512,512,512,512, 511,511,510,509,509,506,505,503,503,503,502,502,501,501,501,501, 499,498,496,495,493,492,492,491,489,489,488,488,488,487,487,484, 480,480,478,477,476,476,474,474,474,474,472,471,468,468,465,464, 464,463,463,462,461,459,459,458,454,451,449,449,449,447,447,446, 446,443,443,441,440,439,439,436,434,432,432,432,431,430,428,426, 425,423,423,422,420,418,418,417,416,415,412,409,409,403,402,401, 400,399,399,398,394,394,392,392,392,391,388,386,384,384,384,382, 382,381,380,379,379,378,377,377,374,374,373,373,372,371,370,370, 370,369,368,368,367,367,367,366,366,366,363,363,363,363,362,361, 361,360,360,358,357,357,356,355,355,350,350,349,348,347,345,345, 342,341,340,339,337,336,336,335,334,333,331,331,329,329,327,324, 323,323,316,316,313,312,311,309,309,307,304,302,301,297,296,295, 294,293,293,292,292,290,289,288,286,286,283,281,279,278,278,276, 272,272,272,270,269,268,267,265,265,263,262,260,259,258,258,254, 252,252,252,248,248,246,246,245,244,244,241,241,240,239,237,236, 231,230,229,228,224,223,220,218,218,218,217,216,215,215,214,214, 212,211,211,211,209,209,206,206,204,203,200,198,194,193,193,193, 193,192,191,189,189,189,188,188,187,187,187,187,186,183,182,181, 180,179,179,178,178,177,174,173,170,170,169,167,166,164,164,164, 161,160,159,158,158,157,157,157,157,156,155,153,152,151,151,150, 148,147,144,142,140,137,136,134,134,133,130,130,129,129,128,127, 127,127,124,124,124,124,123,121,118,115,115,115,112,112,110,105, 104,103,101,100,100,99,98,94,94,94,93,93,93,86,85,84,83,82,81, 81,81,79,78,78,77,75,73,71,65,64,64,63,63,62,60,59,57,56,56,54, 53,53,53,49,48,45,45,42,42,41,39,36 }; const int n4w1b3r7[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 626,625,624,621,621,620,618,618,617,616,615,615,615,614,614,609, 605,603,602,602,601,600,599,597,597,597,592,592,589,588,587,583, 583,582,582,579,579,578,578,572,571,568,567,567,566,564,564,564, 563,563,563,562,562,562,560,560,560,559,555,555,555,554,554,554, 551,550,549,548,547,546,545,545,542,542,541,538,537,536,535,535, 535,534,532,532,531,531,530,528,527,522,515,514,514,510,510,509, 509,508,507,507,507,505,504,504,502,501,501,499,496,494,491,491, 490,490,486,485,485,485,485,482,482,480,480,477,477,475,473,472, 472,472,470,470,466,465,463,462,461,460,456,456,454,453,451,451, 449,447,445,444,444,440,440,437,436,435,435,435,435,433,433,428, 428,426,426,425,424,423,417,415,415,414,411,411,411,409,408,403, 403,401,399,399,398,397,396,396,395,393,390,390,389,385,385,384, 383,383,382,382,379,379,378,376,374,374,373,373,368,366,365,363, 362,362,362,360,359,357,357,356,355,353,352,352,351,351,350,349, 348,347,346,346,345,344,343,342,342,341,341,340,340,340,340,340, 340,339,338,337,337,336,335,332,331,328,325,324,324,323,321,321, 319,318,318,314,313,312,310,310,310,309,309,308,306,306,306,305, 301,296,295,295,293,293,292,292,292,290,290,290,289,287,286,283, 282,281,281,278,277,275,273,272,270,269,268,268,263,262,260,260, 257,256,256,256,255,255,248,247,246,244,243,242,239,238,235,235, 233,231,229,229,228,227,227,227,226,226,225,224,220,213,212,212, 210,209,208,208,206,205,204,204,202,201,199,198,197,196,195,194, 194,194,191,191,188,188,183,182,181,181,181,181,181,177,176,175, 175,173,173,172,171,171,170,170,170,169,167,166,166,165,164,163, 163,161,161,161,161,159,157,157,155,155,154,152,152,152,152,150, 150,149,148,147,146,145,144,141,140,140,139,137,137,136,136,136, 134,131,130,130,130,126,125,124,123,119,119,118,117,117,115,113, 113,112,112,112,112,111,111,109,108,104,99,96,96,94,93,91,91, 91,91,90,90,89,88,88,81,77,74,74,72,70,69,67,67,66,65,65,64,63, 59,58,57,56,56,56,55,53,53,51,50,48,47,47,46,46,44,44,43,43,40, 40,39,38,38,37,37,36,36,35 }; const int n4w1b3r8[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 626,625,624,622,620,620,620,619,613,611,610,609,608,606,606,604, 601,601,601,600,598,598,597,591,587,586,586,586,584,584,584,584, 583,583,582,582,581,581,581,579,579,579,578,578,578,576,573,570, 569,567,567,565,564,562,559,559,558,557,555,553,553,550,550,547, 545,544,543,542,541,541,540,540,539,539,537,536,535,533,532,531, 529,528,527,527,525,524,524,523,521,520,520,518,518,518,517,517, 516,516,515,514,514,512,507,506,505,505,504,503,502,502,502,501, 500,499,499,497,497,496,495,495,495,494,493,491,491,487,485,484, 483,482,480,479,478,475,475,475,472,471,471,469,468,467,466,465, 465,463,463,462,462,462,462,461,461,461,460,458,457,457,456,454, 454,452,451,447,443,443,442,439,439,439,438,437,435,434,433,431, 431,428,428,428,427,427,425,425,423,421,420,419,417,416,415,412, 411,411,406,405,404,401,401,400,397,397,396,395,394,394,394,393, 393,390,390,388,388,386,385,383,381,378,378,377,377,376,375,375, 373,372,370,369,369,367,366,365,365,364,364,363,360,359,359,358, 354,353,353,353,352,350,349,348,345,345,345,344,342,342,341,340, 335,333,333,332,331,331,329,328,327,326,326,325,325,322,322,321, 321,321,320,318,317,317,317,317,317,317,316,315,314,313,313,312, 310,308,307,307,306,306,306,302,298,296,296,295,295,295,293,293, 291,289,288,287,287,286,285,285,282,281,280,275,274,274,270,269, 269,268,268,266,265,265,263,263,263,263,262,261,258,257,257,257, 255,253,252,250,250,246,243,243,240,240,237,237,236,234,234,233, 231,230,228,227,226,226,225,225,223,221,220,220,218,217,217,216, 214,212,212,211,206,206,203,203,202,202,201,201,201,201,200,194, 194,194,192,191,190,186,186,183,183,174,171,167,167,167,166,163, 163,162,159,158,157,156,156,151,150,148,145,145,143,142,141,137, 136,132,132,131,131,129,129,128,126,126,125,125,122,121,120,119, 114,113,112,111,109,109,109,109,106,105,105,102,102,100,95,95, 91,91,88,88,87,84,84,82,81,80,78,76,75,75,73,73,73,72,69,69,68, 67,65,65,64,64,62,61,59,57,57,53,51,51,49,49,49,49,48,47,46,45, 44,43,42,42,41,39,39,38,37,35 }; const int n4w1b3r9[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 627,627,625,625,621,614,612,608,608,608,607,607,606,605,603,602, 601,601,601,599,599,598,598,597,592,591,590,589,589,586,586,583, 582,581,581,580,579,578,577,577,576,573,573,572,569,567,566,564, 563,563,563,563,562,561,560,557,556,555,555,552,549,548,545,545, 541,541,541,537,536,535,535,533,533,531,527,526,526,523,522,522, 521,520,518,518,516,515,515,515,513,513,510,508,508,508,507,505, 505,504,502,500,500,499,498,495,494,491,490,489,486,484,484,480, 479,478,477,475,474,473,472,468,464,463,462,462,461,460,459,458, 458,458,456,456,451,451,451,451,450,448,447,446,444,442,442,442, 440,439,439,438,438,437,437,437,436,435,433,429,429,428,425,424, 424,423,423,421,421,417,415,413,411,411,409,408,407,404,404,403, 403,402,402,401,397,397,396,395,394,393,393,390,390,388,387,385, 384,384,382,382,382,379,377,377,377,375,375,374,374,374,374,372, 364,364,364,363,363,362,361,361,360,359,358,358,358,357,356,355, 354,349,349,348,347,346,345,344,344,341,341,341,340,338,336,334, 334,333,333,332,331,331,329,328,323,321,320,318,317,316,315,315, 315,311,311,310,307,307,306,305,302,301,299,298,298,297,296,296, 295,293,292,290,287,285,285,284,283,283,282,280,280,280,279,279, 278,277,272,272,271,270,269,269,267,266,263,262,260,260,254,254, 252,250,250,250,249,247,245,244,243,243,242,242,240,239,239,239, 239,238,234,231,230,230,229,228,228,225,225,225,224,224,223,222, 220,219,217,214,213,213,211,211,206,205,205,203,203,202,202,201, 200,198,198,197,196,195,194,192,192,190,190,190,190,190,189,186, 186,186,184,183,182,182,181,179,178,178,178,177,176,175,175,175, 167,166,165,162,160,160,160,159,159,158,157,156,155,153,153,152, 150,150,149,149,147,147,147,144,144,143,143,141,139,133,132,130, 127,127,126,126,125,125,123,122,121,120,119,117,117,115,115,112, 111,110,110,108,108,106,106,106,106,104,102,101,100,99,99,98, 98,96,93,93,93,92,88,86,84,83,82,82,80,79,79,78,78,76,75,73,73, 71,71,70,70,68,66,61,61,60,58,56,56,56,55,54,51,47,47,47,47,46, 45,44,44,44,43,40,40,39,37,37 }; const int n4w2b1r0[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 240,240,240,240,240,240,240,239,239,239,239,239,239,238,237,237, 237,237,237,237,237,237,237,237,237,236,236,236,236,236,236,236, 236,235,235,235,235,235,234,234,234,234,234,234,234,233,233,233, 233,232,232,232,232,231,231,231,231,231,231,231,230,230,230,230, 230,230,229,229,229,229,229,229,228,228,228,228,228,228,228,227, 227,227,227,227,227,226,226,226,226,226,226,226,226,226,225,225, 225,225,225,225,225,225,225,224,224,224,224,224,224,223,223,223, 223,223,223,223,223,223,222,221,221,221,221,220,220,220,220,220, 220,219,219,219,219,219,219,218,218,218,218,218,218,218,218,218, 217,217,217,217,217,217,217,217,217,217,216,216,216,216,216,216, 215,215,215,215,215,215,215,214,214,214,214,214,214,214,214,213, 213,213,212,212,212,212,212,212,212,211,211,211,211,211,211,211, 210,210,210,210,210,210,210,210,209,209,209,209,209,208,208,208, 208,208,208,208,208,207,207,207,207,207,207,207,207,206,206,206, 206,206,206,206,205,205,205,205,205,205,205,205,205,204,204,204, 204,203,203,203,203,203,203,203,202,201,201,201,201,201,201,200, 200,200,200,200,200,200,200,200,200,199,199,199,199,199,198,198, 198,198,198,197,197,197,197,197,197,197,197,196,196,196,195,195, 195,195,195,195,195,195,195,195,195,195,195,194,194,194,193,193, 193,193,193,192,192,192,192,192,192,192,192,192,192,191,191,191, 191,191,191,191,191,191,191,190,190,190,190,190,190,190,190,189, 189,189,189,189,189,189,189,188,188,188,188,188,188,187,187,187, 187,187,186,186,186,186,186,186,185,185,185,185,184,184,184,183, 183,183,182,182,182,182,182,182,181,181,181,181,181,181,181,181, 181,180,180,180,180,180,180,180,179,179,179,179,179,178,178,178, 178,178,178,177,177,176,176,176,176,176,176,176,175,175,175,175, 175,175,174,174,174,174,174,174,174,174,173,173,173,172,172,172, 172,172,172,172,172,171,171,170,170,170,170,170,170,170,170,169, 169,169,169,169,169,169,169,168,168,168,168,168,168,168,168,168, 167,167,167,167,167,166,166,166,166,166,166,166,166,165,165,165, 165,165,165,165,165,164,164,164,163,163,163,163,162,162,162,162, 162,162,162,162 }; const int n4w2b1r1[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 240,240,240,240,240,240,239,239,239,239,239,239,239,239,239,238, 238,238,238,238,237,237,237,237,237,236,236,236,236,236,236,236, 236,235,235,235,235,235,235,234,234,234,234,233,233,233,233,233, 232,232,232,232,231,231,231,231,231,231,230,230,230,230,230,230, 230,230,229,229,229,229,228,228,228,228,228,228,228,227,227,227, 227,227,227,227,227,226,226,226,226,225,225,225,225,225,225,225, 225,225,225,225,224,224,224,224,224,223,223,223,223,223,223,223, 223,222,222,222,222,221,221,221,221,220,220,220,220,220,219,219, 219,219,219,219,219,218,218,218,218,218,218,218,217,217,217,216, 216,216,216,215,215,215,215,214,214,214,214,214,214,214,214,214, 214,213,213,213,213,213,213,213,213,213,212,212,212,212,212,212, 211,211,211,211,211,211,211,210,210,210,209,209,209,209,209,209, 209,209,208,208,208,208,208,208,208,208,208,207,207,207,207,206, 206,206,206,206,206,206,206,205,205,205,205,205,205,205,204,204, 204,204,204,204,204,204,204,204,203,203,203,203,203,202,202,202, 202,202,202,201,201,201,201,201,201,200,200,200,200,200,200,200, 200,200,200,199,199,199,199,199,199,198,198,198,198,198,198,198, 197,197,197,197,197,197,197,197,197,196,196,196,196,196,196,196, 195,195,195,195,195,195,195,195,195,194,194,194,194,194,194,193, 193,193,193,193,192,192,192,192,192,192,192,191,191,191,191,191, 191,191,191,191,190,190,190,190,190,190,190,190,190,190,189,189, 189,189,189,189,189,189,188,188,188,188,188,187,187,187,187,187, 187,186,186,186,186,186,185,185,185,185,185,184,184,184,184,184, 184,184,183,183,183,183,183,182,182,182,182,182,182,181,181,181, 181,181,181,181,181,181,180,180,180,180,180,180,179,179,179,179, 179,178,178,178,178,178,178,178,178,178,177,177,177,177,176,176, 176,176,176,176,175,175,175,175,175,175,175,175,174,174,174,174, 174,174,174,173,173,173,173,173,172,172,172,172,172,172,171,171, 171,171,171,171,170,170,170,169,169,169,169,169,169,168,168,168, 168,168,168,167,167,167,167,167,166,166,166,166,166,166,166,165, 165,165,165,165,164,164,164,163,163,163,163,163,163,162,162,162, 162,162,162,162 }; const int n4w2b1r2[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 240,240,240,240,240,240,239,239,239,239,239,239,239,239,239,238, 238,238,238,238,238,237,237,237,237,237,237,236,236,236,236,236, 236,236,236,236,235,235,234,234,234,234,234,234,234,234,233,233, 233,233,232,232,232,232,232,232,232,231,231,231,231,231,231,231, 230,230,230,230,230,230,229,229,229,229,228,228,228,228,228,228, 228,227,227,227,226,226,226,226,225,225,225,225,225,225,225,225, 225,225,224,224,224,224,223,223,223,223,223,223,223,222,222,222, 222,222,222,222,221,221,221,220,220,220,220,219,219,219,219,219, 219,219,219,218,218,218,218,218,218,217,217,217,217,217,217,216, 216,216,216,215,215,215,215,215,215,215,214,214,214,214,214,214, 214,214,214,214,213,213,213,213,212,212,212,212,212,211,211,211, 211,210,210,210,210,210,210,210,210,210,210,209,209,209,209,209, 209,209,209,209,208,208,208,208,208,208,207,207,207,207,207,207, 207,207,206,206,206,206,206,205,205,205,205,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,203,203,203,203,203,203,203, 203,203,203,202,202,202,202,201,201,201,201,201,201,201,201,200, 200,200,199,199,199,199,198,198,198,198,198,198,198,198,198,198, 198,198,197,197,197,197,197,197,197,196,196,196,196,196,196,196, 196,196,196,195,195,195,195,194,194,194,194,194,194,194,194,193, 193,192,192,192,191,191,191,191,191,191,191,191,190,190,190,190, 190,189,189,189,189,189,189,189,189,188,188,188,188,187,187,187, 187,187,187,187,187,187,187,187,186,186,186,186,186,185,185,185, 185,185,185,185,185,184,184,184,184,184,184,183,183,183,183,183, 182,182,182,182,182,182,182,182,182,182,182,182,181,181,181,181, 181,181,180,180,180,180,180,179,179,179,179,179,178,178,178,178, 178,177,177,177,177,176,176,176,176,175,175,175,174,174,174,174, 174,174,174,174,174,174,173,173,173,173,173,173,173,173,173,172, 172,172,172,172,171,171,171,171,171,171,171,171,171,171,171,170, 170,170,170,170,170,170,169,169,169,169,169,169,169,169,169,169, 168,168,168,168,168,167,167,167,167,167,166,166,166,166,165,165, 165,164,164,164,164,164,164,164,164,163,163,163,163,162,162,162, 162,162,162,162 }; const int n4w2b1r3[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 240,240,240,240,240,239,239,239,239,239,239,239,239,239,239,238, 238,237,237,237,237,237,237,236,236,236,236,236,236,235,235,235, 235,235,235,235,234,234,234,234,233,233,233,233,233,233,233,232, 232,232,232,232,232,231,231,231,231,231,231,230,230,230,230,230, 230,229,229,229,229,229,229,229,228,228,228,228,228,228,227,227, 227,226,226,226,226,226,225,225,225,225,224,224,224,223,223,223, 223,223,223,223,223,223,222,222,222,222,222,222,222,222,221,221, 221,221,221,221,221,221,221,220,220,220,220,220,220,220,220,219, 219,219,219,219,219,219,218,218,218,218,218,218,218,217,217,217, 217,217,217,217,217,217,217,217,216,216,216,216,216,216,215,215, 215,215,215,215,214,214,214,214,214,214,214,214,214,213,213,213, 212,212,212,212,211,211,211,211,211,210,210,210,210,210,210,210, 210,209,209,209,209,209,208,208,208,208,208,208,208,208,208,207, 207,207,207,207,207,206,206,206,205,205,205,205,205,204,204,204, 204,203,203,203,203,203,203,203,203,203,202,202,202,202,202,201, 201,201,201,201,200,200,200,200,200,200,200,199,199,199,199,199, 199,198,198,198,198,198,198,198,198,198,198,197,197,197,197,197, 197,196,196,195,195,195,195,194,194,194,194,194,194,194,193,193, 193,193,193,193,193,193,193,193,192,192,192,192,191,191,191,190, 190,190,190,190,190,190,190,189,189,189,189,189,189,189,188,188, 188,187,187,187,187,187,186,186,186,186,186,186,186,185,185,185, 185,185,185,185,184,184,184,184,184,184,184,184,184,184,184,183, 183,183,183,183,183,183,182,182,182,182,182,181,181,181,180,180, 180,180,180,180,180,180,180,179,179,179,179,179,179,178,178,178, 178,178,178,178,178,177,177,177,177,177,177,177,177,176,176,176, 176,176,176,175,175,175,175,175,175,175,175,174,174,174,174,174, 173,173,173,173,173,173,173,172,172,172,172,172,172,172,172,172, 172,172,172,172,172,171,171,171,171,171,171,171,170,170,169,169, 169,168,168,168,168,168,167,167,167,167,167,167,167,167,167,167, 166,166,166,166,166,166,166,166,165,165,165,165,165,165,165,165, 165,164,164,164,164,164,164,163,163,163,163,163,163,163,163,162, 162,162,162,162 }; const int n4w2b1r4[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 240,240,240,240,240,239,239,239,239,238,238,237,237,237,237,237, 236,236,236,236,236,236,236,236,236,236,236,235,235,235,235,235, 235,234,234,234,234,234,234,233,233,233,233,233,233,232,232,232, 232,231,231,231,231,231,231,231,230,230,230,230,230,230,230,230, 230,230,230,229,229,229,229,228,228,227,227,227,227,227,227,227, 227,226,226,226,226,225,225,225,225,224,224,224,224,224,224,224, 223,223,223,223,222,222,222,221,221,221,221,221,221,221,220,220, 220,220,220,219,219,219,219,219,219,218,218,218,218,218,218,218, 218,218,217,217,217,217,217,217,216,216,216,216,216,216,216,215, 215,215,215,215,215,214,214,214,214,214,213,213,213,213,213,213, 213,213,213,213,213,213,212,212,212,212,212,212,212,212,212,211, 211,211,211,211,210,210,210,210,210,209,209,209,209,209,209,208, 208,208,208,208,208,208,208,207,207,207,206,206,206,206,206,206, 206,206,206,206,206,205,205,205,205,205,205,205,204,204,204,204, 204,204,204,203,203,203,203,203,203,203,203,202,202,202,202,201, 201,201,201,201,201,200,200,200,200,200,200,200,200,200,200,200, 199,199,199,199,198,198,198,198,198,198,198,198,198,198,197,197, 197,197,197,197,197,196,196,196,196,196,196,196,196,196,195,195, 195,195,195,195,195,195,195,195,195,195,194,194,194,193,193,193, 192,192,192,192,192,192,192,192,192,192,191,191,191,191,191,191, 191,191,191,190,190,190,190,190,190,189,189,189,189,188,188,188, 188,188,188,188,188,188,187,187,187,187,187,187,186,186,186,186, 186,186,185,185,185,185,185,184,184,183,183,183,183,183,182,182, 182,182,182,182,182,182,182,182,182,181,181,181,181,181,181,181, 181,181,180,180,180,180,180,179,179,179,179,179,178,178,178,178, 177,177,177,177,176,176,176,176,176,176,176,176,176,175,175,175, 175,175,174,174,174,174,174,173,173,173,173,173,172,172,172,172, 172,171,171,171,171,171,171,171,171,171,170,170,170,170,170,170, 170,170,169,169,169,169,169,168,168,168,167,167,167,167,167,167, 167,167,167,167,167,167,167,167,167,167,167,166,166,166,166,166, 165,165,165,165,165,164,164,164,164,163,163,163,163,162,162,162, 162,162,162,162 }; const int n4w2b1r5[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 240,240,240,240,240,240,240,240,240,239,239,239,239,239,239,238, 238,238,238,238,238,238,237,237,237,237,237,237,237,237,237,237, 237,236,236,236,236,236,236,236,236,236,236,236,236,236,236,235, 235,235,235,235,235,234,234,234,234,233,233,233,233,233,233,233, 232,232,232,232,232,232,231,231,231,231,231,231,231,231,231,231, 231,231,230,230,230,230,230,230,229,229,229,229,229,229,229,229, 228,228,228,228,228,228,228,228,228,227,227,227,227,227,227,227, 227,227,227,227,227,226,226,226,226,225,225,225,225,225,225,225, 225,224,224,224,224,224,224,223,223,223,223,223,223,223,223,222, 222,222,222,222,222,222,222,221,221,221,221,220,220,220,220,220, 219,219,219,219,219,219,219,219,218,218,218,218,218,218,218,218, 218,217,217,217,217,217,217,217,217,217,217,216,216,216,216,216, 216,215,215,215,215,215,215,215,214,214,214,214,214,214,214,214, 213,213,213,213,213,212,212,212,212,212,211,211,211,211,211,210, 210,210,210,210,210,209,209,209,209,208,208,208,208,208,208,208, 208,208,207,207,207,207,207,206,206,206,206,205,205,204,204,203, 203,203,202,202,202,201,201,201,201,201,200,200,200,200,200,199, 199,199,199,199,198,198,198,198,198,198,198,197,197,197,197,197, 197,197,196,196,196,196,196,196,196,195,195,195,195,195,195,195, 194,194,194,194,194,194,194,194,194,193,193,193,193,193,192,192, 192,192,192,192,191,191,191,191,191,191,190,190,190,190,190,189, 189,189,189,189,189,189,189,189,188,188,188,187,187,187,187,186, 186,186,186,185,185,185,185,185,185,185,185,185,185,185,185,185, 185,184,184,184,184,184,184,184,184,184,184,183,183,183,183,183, 182,182,181,181,181,181,181,181,181,181,180,180,180,180,179,179, 179,179,179,179,179,179,179,179,178,178,178,178,177,177,177,177, 177,177,177,177,176,176,176,176,175,175,175,175,175,175,174,174, 174,174,174,173,173,173,173,173,173,172,172,172,172,172,171,171, 171,171,170,170,170,169,169,168,168,168,168,168,168,168,168,168, 168,168,167,167,167,167,167,167,167,166,166,166,166,165,165,165, 165,165,165,164,164,164,164,164,164,164,163,163,163,163,162,162, 162,162,162,162 }; const int n4w2b1r6[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 240,240,240,240,240,240,239,239,239,239,239,239,239,239,238,238, 238,238,238,238,237,237,237,237,237,237,236,236,236,236,236,236, 236,236,235,235,235,235,235,234,234,234,234,234,234,234,234,234, 234,233,233,233,233,233,233,233,233,232,232,232,232,231,231,231, 231,230,230,230,230,230,230,230,230,230,230,229,229,229,229,229, 229,229,228,228,228,228,228,227,227,227,227,227,227,227,226,226, 226,226,226,226,225,225,225,225,224,224,224,224,224,223,223,223, 223,223,223,223,223,223,223,223,222,222,222,222,222,222,222,222, 221,221,221,221,220,220,220,220,220,220,219,219,219,219,219,219, 219,219,218,218,218,218,218,218,217,217,217,216,216,216,216,216, 216,216,216,216,216,216,215,215,215,214,214,214,214,214,214,214, 214,213,213,213,213,213,213,213,213,213,213,212,212,211,211,211, 211,210,210,210,210,210,210,210,210,210,210,210,209,209,209,208, 208,208,208,208,208,208,208,208,207,207,207,207,207,207,207,207, 207,207,206,206,206,206,206,206,206,206,206,206,206,205,205,205, 205,204,204,204,204,203,203,203,203,203,203,203,202,202,202,202, 202,201,201,201,201,201,201,201,200,200,200,200,200,200,200,200, 200,200,200,199,199,198,198,198,198,198,197,197,197,197,197,196, 196,196,196,196,195,195,195,194,194,194,194,194,194,193,193,193, 193,193,192,192,192,191,191,191,191,191,191,191,191,191,191,191, 191,190,190,190,190,190,190,189,189,189,189,188,188,188,188,188, 188,188,188,188,188,188,188,188,188,188,187,187,187,187,187,187, 187,186,186,186,186,186,186,186,185,185,185,185,185,184,184,184, 184,184,184,184,183,183,183,183,183,183,182,182,182,182,182,182, 181,181,180,180,180,180,179,179,179,179,179,179,179,178,178,178, 178,178,178,178,177,176,176,176,175,175,175,175,175,175,175,175, 175,174,174,174,174,174,173,173,173,173,173,172,172,172,172,171, 171,171,171,171,171,171,170,170,170,170,170,170,169,169,169,169, 169,169,169,169,169,169,168,168,168,168,168,168,168,168,168,168, 168,167,167,167,167,167,167,167,166,166,166,166,166,166,166,165, 165,165,165,165,164,164,164,164,163,163,163,163,163,163,163,162, 162,162,162,162 }; const int n4w2b1r7[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 240,240,240,240,240,240,240,240,240,240,240,240,239,239,239,239, 239,239,238,238,238,238,238,238,237,237,237,237,237,237,237,237, 237,236,236,236,236,236,236,236,236,236,235,235,235,235,235,235, 235,235,234,234,234,234,233,233,233,233,233,232,232,232,232,232, 231,231,231,231,230,230,230,230,230,230,229,229,229,228,228,228, 228,227,227,227,227,227,227,227,227,227,227,226,226,226,225,225, 225,225,224,224,224,224,224,224,223,223,223,223,223,223,223,222, 222,222,222,222,222,221,221,220,220,220,220,220,220,220,219,219, 219,219,218,218,218,218,218,218,217,217,217,217,217,217,217,216, 216,216,216,216,216,216,216,215,215,214,214,214,214,214,214,214, 213,213,213,213,212,212,212,212,211,211,211,211,210,210,210,210, 209,209,209,209,209,209,208,208,208,208,207,207,207,207,207,207, 207,207,207,207,207,206,206,206,206,206,206,205,205,205,205,205, 205,205,204,204,204,203,203,203,203,203,203,203,203,203,202,202, 202,202,202,202,202,202,202,202,202,202,201,201,200,200,200,200, 200,200,199,199,199,198,198,198,198,198,198,198,198,198,197,197, 197,197,197,197,196,196,196,196,196,195,195,195,195,195,195,195, 195,195,195,195,194,194,194,194,194,194,194,194,194,194,194,193, 193,193,193,193,193,193,192,192,192,192,192,191,191,191,191,191, 191,191,191,191,190,190,190,190,190,190,189,189,189,189,188,188, 188,188,188,188,188,188,188,188,188,188,187,187,187,187,187,187, 186,186,186,186,186,186,186,186,185,185,185,185,185,185,185,185, 185,185,185,184,184,184,184,184,183,183,183,183,183,183,183,183, 183,183,183,182,182,182,182,181,181,181,181,181,181,181,181,181, 180,180,180,180,180,180,180,180,180,180,179,179,179,179,179,178, 178,178,178,178,177,177,177,177,177,176,176,176,176,176,176,176, 175,175,175,175,175,174,174,174,173,173,173,173,173,173,173,173, 173,172,172,172,172,172,172,172,172,171,171,171,171,171,171,170, 170,170,170,170,170,170,170,169,169,169,169,169,168,168,168,168, 168,167,167,167,167,167,166,166,166,166,166,166,165,165,165,165, 165,165,165,164,164,164,164,164,164,164,163,163,163,163,163,162, 162,162,162,162 }; const int n4w2b1r8[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 240,240,240,240,240,240,239,239,239,239,239,239,239,239,238,238, 238,238,238,237,237,237,237,237,237,237,237,236,236,236,236,236, 236,236,235,235,235,235,235,235,235,234,234,233,233,233,233,232, 232,232,232,232,232,232,231,231,231,230,230,230,230,230,230,230, 230,230,229,229,229,229,229,228,228,227,227,227,227,227,227,227, 227,227,226,226,226,226,226,225,225,225,225,225,224,224,224,224, 223,223,223,223,222,222,222,222,222,222,222,221,221,221,221,221, 221,221,221,221,221,221,221,220,220,220,220,220,220,220,220,219, 219,219,219,219,219,219,219,219,219,218,218,218,218,218,218,218, 218,218,217,217,217,216,216,216,215,215,215,215,215,215,214,214, 214,214,214,214,214,213,213,213,213,213,213,213,213,213,212,212, 212,212,212,211,211,211,211,211,211,211,211,211,210,210,210,210, 210,210,210,209,209,208,208,208,208,208,208,207,207,207,207,207, 206,206,206,206,206,206,206,206,205,205,205,204,204,204,204,204, 204,204,203,203,203,203,203,203,203,203,203,203,202,202,202,202, 202,202,202,202,202,202,202,202,201,201,201,201,201,201,201,201, 201,201,200,200,200,200,200,200,199,199,198,198,198,198,198,198, 197,197,196,196,196,196,196,195,195,195,195,195,195,194,194,194, 194,194,193,193,193,193,193,193,193,193,192,192,192,192,192,192, 191,191,191,191,190,190,190,190,190,190,190,190,190,190,190,189, 189,189,189,189,189,189,188,188,188,188,188,188,188,188,188,187, 187,187,187,187,187,187,187,187,186,186,186,186,185,185,185,185, 185,185,185,185,185,185,185,184,184,184,184,184,184,183,183,183, 183,183,183,183,182,182,182,182,182,182,182,182,182,182,182,182, 181,181,181,181,181,181,181,181,181,180,180,180,180,180,179,179, 179,179,179,179,179,178,178,178,178,178,178,178,178,178,178,177, 177,177,177,177,177,177,176,176,176,176,176,176,175,175,175,175, 175,174,174,174,174,174,173,173,173,172,172,172,172,171,171,171, 171,171,170,170,170,170,169,169,169,169,168,168,168,168,168,168, 167,167,166,166,166,166,166,166,166,166,166,165,165,165,165,165, 165,165,164,164,164,164,164,164,164,164,163,163,163,163,162,162, 162,162,162,162 }; const int n4w2b1r9[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 240,240,240,240,240,240,240,239,239,239,239,239,239,239,239,238, 238,238,238,237,237,237,237,237,237,237,237,236,236,236,236,235, 235,235,235,234,234,234,234,234,234,234,234,233,233,233,233,233, 232,232,232,232,232,232,232,232,232,231,231,231,231,231,230,230, 230,230,230,230,230,229,229,229,229,229,229,228,228,228,228,228, 228,227,227,227,227,226,226,226,226,226,226,226,225,225,225,224, 224,224,224,224,224,224,224,224,223,223,223,223,223,223,223,222, 222,222,222,221,221,221,221,221,221,221,221,221,220,220,220,220, 220,220,220,220,219,219,219,219,219,219,219,219,218,218,218,218, 218,217,217,217,217,216,216,216,216,216,216,216,216,216,216,215, 215,215,215,215,215,215,215,215,215,215,215,214,214,214,214,214, 213,213,213,213,213,213,212,212,212,212,212,212,211,211,211,211, 211,210,210,210,210,210,210,210,210,210,210,210,209,209,209,209, 209,209,209,209,209,209,209,208,208,208,208,208,207,207,207,207, 207,206,206,206,206,206,206,206,205,205,205,205,205,205,205,205, 204,204,204,204,203,203,203,203,202,202,202,202,201,201,201,201, 201,201,201,201,200,200,200,200,200,200,200,199,199,199,199,199, 199,198,198,198,198,197,197,197,197,197,197,197,196,196,196,196, 196,196,196,195,195,195,194,194,194,194,194,193,193,193,193,193, 192,192,192,192,192,192,192,191,191,191,191,190,190,190,190,190, 190,189,189,189,189,189,188,188,188,188,187,187,187,186,186,186, 186,186,186,186,186,185,185,185,185,185,185,185,185,184,184,184, 184,184,184,183,183,183,183,183,183,182,182,182,182,182,181,181, 181,181,180,180,180,180,180,179,179,179,179,179,179,179,178,178, 178,178,178,178,178,177,177,177,177,177,176,176,176,176,176,175, 175,175,175,175,175,175,175,174,174,174,173,173,173,173,173,173, 172,172,172,172,172,172,172,171,171,171,171,171,170,170,170,170, 170,170,169,169,169,169,169,169,169,168,168,168,168,168,168,168, 167,167,167,167,167,167,167,167,167,166,166,166,166,166,166,166, 166,166,166,165,165,165,165,165,165,165,165,165,165,164,164,164, 164,164,164,164,163,163,163,163,163,163,163,163,163,163,162,162, 162,162,162,162 }; const int n4w2b2r0[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 300,299,299,299,298,298,297,297,296,295,295,295,295,295,295,294, 294,293,293,292,292,292,292,291,291,290,290,290,289,289,289,288, 288,288,288,287,287,287,287,285,285,285,284,283,283,283,283,283, 283,282,282,282,281,281,279,278,277,277,276,276,276,275,275,275, 275,275,275,275,275,275,274,274,274,273,273,272,272,272,271,271, 271,271,271,271,270,270,269,269,269,269,268,267,267,266,265,265, 265,264,264,264,264,264,263,263,263,262,262,261,261,260,260,260, 260,259,259,258,257,257,256,255,255,255,254,253,252,252,252,252, 251,251,251,250,249,248,248,248,247,247,246,245,245,245,244,244, 244,244,243,243,243,243,242,242,242,241,241,241,240,240,239,239, 239,238,237,237,237,236,235,235,235,234,234,234,234,233,233,232, 232,231,231,231,230,230,229,229,229,229,228,228,228,227,226,225, 224,224,224,223,223,223,222,222,222,222,222,221,221,220,219,217, 217,217,217,217,216,215,215,214,214,213,212,212,212,211,210,209, 209,208,207,207,207,207,207,207,206,206,206,206,204,204,204,204, 203,203,199,199,199,199,199,198,198,197,197,197,197,197,197,196, 196,196,195,195,194,194,194,193,193,193,193,192,192,190,190,189, 189,189,188,188,187,186,186,186,186,186,185,184,184,184,184,182, 182,182,182,182,181,181,181,180,179,179,179,178,178,177,177,177, 177,176,176,176,175,175,175,173,173,172,172,172,171,171,171,170, 170,170,169,169,169,168,168,168,167,166,166,166,166,166,165,165, 164,164,163,162,162,161,161,160,160,160,160,159,159,159,158,158, 158,157,156,156,153,153,153,153,152,152,152,152,151,151,151,151, 150,150,149,149,149,149,149,149,149,149,148,147,147,146,145,145, 145,143,143,142,142,142,142,142,141,141,141,141,141,140,140,139, 139,138,137,137,136,134,134,134,134,133,132,132,132,132,132,132, 131,131,131,130,130,130,129,128,128,127,127,126,126,125,125,125, 125,124,124,124,123,123,122,122,122,122,121,121,121,120,119,119, 118,118,118,118,117,117,117,117,117,116,116,116,116,115,115,114, 114,113,113,113,113,112,112,112,112,111,110,110,110,110,110,109, 109,109,108,108,108,107,106,106,106,105,105,104,104,104,103,103, 103,103,103,102 }; const int n4w2b2r1[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 300,299,299,299,297,297,297,297,297,296,296,296,295,295,294,294, 294,293,293,293,292,291,290,290,290,289,288,288,288,288,288,288, 287,287,287,287,286,286,286,286,286,285,285,285,285,285,284,284, 283,283,283,282,282,281,280,279,279,279,278,278,278,277,277,276, 276,276,275,274,274,274,274,273,272,272,271,271,271,271,270,270, 270,270,270,270,269,269,269,268,267,267,266,265,265,264,264,264, 264,264,264,263,263,263,262,262,262,261,261,261,261,260,260,259, 258,256,256,255,255,254,254,254,253,253,253,253,253,252,251,250, 250,250,250,250,249,248,245,244,243,243,243,242,241,241,241,241, 241,240,240,240,240,240,239,239,239,238,238,237,237,236,236,236, 235,235,234,233,232,231,230,230,230,229,229,228,228,228,227,227, 227,227,226,226,225,225,225,225,224,224,223,223,223,222,221,221, 219,219,219,219,219,218,217,217,217,217,216,216,215,214,214,213, 213,213,213,213,212,212,212,212,211,211,211,211,210,210,210,210, 209,209,208,207,207,207,206,205,205,205,205,204,204,203,203,202, 202,201,201,201,200,199,199,199,198,197,196,196,194,194,194,193, 193,193,192,192,192,192,192,191,191,191,190,190,189,189,189,188, 188,187,187,187,187,187,186,186,185,185,184,184,184,183,182,182, 182,182,182,180,180,180,180,179,179,178,177,177,176,176,175,175, 175,174,174,173,173,173,173,173,172,171,171,171,170,170,170,170, 170,170,169,169,168,167,167,167,167,166,166,165,165,165,165,164, 164,163,163,162,162,162,162,162,161,161,161,160,159,159,159,158, 158,157,157,157,156,156,156,155,155,155,154,154,153,153,152,151, 151,150,150,150,150,150,150,150,149,149,149,148,148,148,148,147, 147,147,147,147,146,146,145,144,144,143,143,143,142,142,142,142, 140,140,139,139,139,139,139,138,138,138,137,136,136,136,136,136, 136,136,135,135,135,135,134,134,134,133,133,133,132,132,132,132, 130,129,129,128,128,128,128,127,127,127,127,126,126,126,125,124, 124,124,124,119,118,118,117,117,116,116,116,115,115,115,115,114, 114,114,113,113,113,113,113,113,112,111,111,111,110,110,110,110, 110,109,109,108,108,108,108,107,106,106,105,105,105,104,104,104, 103,103,102,102 }; const int n4w2b2r2[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 300,300,300,300,298,298,298,295,295,295,294,294,293,292,292,292, 292,292,291,291,290,290,290,290,290,290,290,288,288,288,288,287, 287,287,287,286,286,286,286,286,285,285,285,285,285,285,285,284, 284,284,284,283,283,283,283,282,281,281,281,281,281,281,280,280, 280,280,280,280,279,279,279,279,279,278,277,276,276,276,275,275, 274,274,274,274,274,273,273,273,272,271,271,271,271,270,270,270, 270,270,269,269,269,268,268,268,267,267,267,267,266,266,266,264, 263,263,263,263,262,262,261,261,261,260,259,259,257,257,257,257, 257,257,257,256,255,254,254,254,253,253,252,251,251,250,250,249, 249,248,247,247,247,246,246,245,244,243,243,242,240,240,240,240, 239,239,239,238,238,237,236,236,236,235,235,234,234,234,234,233, 232,232,232,232,232,231,231,231,230,230,230,229,227,227,227,227, 226,225,225,224,224,223,223,222,221,220,220,220,220,220,220,219, 219,219,218,217,217,217,217,217,216,216,215,214,214,214,214,213, 212,212,212,212,212,212,211,211,210,210,210,210,210,210,209,208, 208,207,207,206,206,205,205,204,204,204,204,204,203,203,203,203, 203,202,202,202,202,201,201,200,200,199,199,199,198,198,198,197, 197,195,195,195,195,195,194,194,193,193,193,192,192,192,191,191, 191,190,190,190,189,189,188,188,188,188,187,187,186,186,185,185, 185,185,185,184,184,184,183,183,183,182,182,182,181,180,180,180, 180,179,179,179,178,178,178,177,175,175,174,174,174,173,172,172, 172,170,170,170,169,168,167,166,166,166,166,165,165,164,164,164, 164,164,163,163,163,162,162,162,161,161,161,161,161,160,160,160, 159,159,157,157,157,155,154,154,153,153,153,152,152,152,152,151, 151,151,151,149,149,148,146,146,146,145,144,144,144,144,143,142, 142,142,142,141,140,140,139,138,138,138,138,137,137,136,136,136, 136,135,135,135,134,134,134,133,132,132,132,132,132,131,131,130, 130,130,130,129,127,126,125,124,124,123,123,123,122,122,122,122, 121,121,121,121,121,121,117,117,117,116,116,116,115,115,115,114, 114,114,114,113,113,112,112,112,112,111,111,110,110,109,108,108, 107,106,106,106,105,105,105,105,105,105,105,104,104,104,103,103, 102,102,102,102 }; const int n4w2b2r3[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 300,299,299,299,298,298,298,298,298,298,297,297,296,296,295,295, 295,295,295,295,295,294,294,293,293,292,292,292,292,291,291,290, 289,288,288,288,287,287,287,287,286,285,285,285,284,284,282,282, 281,280,280,279,279,278,278,277,277,277,277,277,276,276,276,275, 274,274,274,274,274,274,274,273,273,272,272,271,271,271,271,271, 270,270,270,270,269,269,269,268,267,267,266,266,266,263,263,262, 262,262,261,260,260,260,260,260,259,258,258,258,258,257,257,257, 257,257,256,256,256,255,255,254,254,254,254,254,254,254,253,253, 253,252,252,252,251,250,250,249,249,249,248,247,247,247,247,246, 246,246,245,245,245,245,244,244,243,243,242,242,241,241,241,241, 241,240,239,239,238,238,238,238,237,236,236,236,236,236,235,235, 234,234,234,234,233,233,232,231,231,231,231,230,229,229,229,228, 228,227,227,227,226,225,225,225,225,225,223,223,222,221,220,220, 220,220,220,220,220,219,218,218,218,218,217,217,217,216,216,215, 215,214,214,214,213,213,211,211,210,210,210,210,209,209,208,207, 207,207,207,205,204,204,204,204,203,203,202,201,201,200,200,200, 199,199,198,198,198,197,197,196,196,196,196,196,195,195,195,195, 194,193,193,193,193,193,193,193,193,193,193,191,191,191,191,190, 190,188,188,188,187,186,186,186,185,185,185,185,184,184,184,183, 183,183,182,182,181,180,180,179,179,179,179,179,178,178,178,178, 177,176,176,175,175,175,174,174,173,173,173,173,171,170,169,168, 166,166,165,165,164,164,164,163,163,162,161,161,161,161,160,159, 158,158,157,157,157,157,156,156,156,155,155,154,153,153,153,153, 152,152,152,151,151,151,150,150,150,150,149,149,149,148,148,148, 148,148,147,147,147,146,146,145,145,144,144,144,144,142,142,142, 142,141,141,141,141,140,140,139,139,139,139,137,137,136,136,135, 135,135,135,135,135,135,135,134,134,134,132,132,132,132,130,130, 129,128,127,127,127,126,126,126,126,125,125,125,125,124,124,122, 122,122,121,121,120,120,120,120,120,119,119,119,118,118,117,116, 116,115,114,114,113,113,112,111,111,111,111,110,110,109,109,109, 109,109,109,108,108,108,107,107,107,106,106,105,105,105,105,105, 104,103,102,102 }; const int n4w2b2r4[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 300,300,299,299,299,298,298,297,296,296,296,296,295,295,293,293, 293,292,292,292,292,291,291,291,290,290,289,289,289,289,289,288, 288,287,287,287,287,286,286,286,285,285,285,284,284,283,283,282, 281,281,280,280,279,279,279,278,278,277,277,277,276,276,276,275, 274,274,274,274,273,273,273,272,272,271,270,270,269,269,269,269, 267,267,266,266,265,265,265,264,264,263,263,262,262,262,262,261, 261,261,260,259,259,259,258,257,255,255,254,254,254,253,253,253, 252,252,252,251,251,251,249,248,248,248,247,247,246,245,244,244, 244,244,243,243,243,242,241,239,239,239,238,237,236,236,236,236, 235,235,233,233,233,233,232,232,232,232,232,230,230,230,230,229, 229,229,229,229,228,228,228,226,226,226,226,226,226,225,225,224, 224,224,224,224,224,223,222,222,221,221,221,221,221,221,221,220, 220,220,220,219,218,218,218,217,217,217,217,216,216,216,215,214, 214,213,213,213,213,213,213,213,212,211,211,210,210,210,210,210, 209,209,209,208,208,208,207,207,207,207,206,205,205,205,205,205, 204,204,204,204,204,204,203,203,203,202,202,202,201,200,200,199, 199,199,198,198,198,197,197,197,197,196,195,194,193,193,192,192, 192,191,191,190,190,190,190,190,189,189,188,187,187,187,187,187, 186,185,184,183,183,182,180,180,179,179,179,178,178,177,177,176, 176,175,175,175,175,174,174,173,173,173,172,172,171,170,170,170, 170,169,168,168,168,168,168,167,167,166,166,165,165,165,165,165, 164,164,164,163,162,162,161,161,161,161,160,160,160,160,160,159, 157,157,157,157,156,156,156,156,155,155,155,155,154,154,154,153, 152,151,150,150,149,149,148,148,148,148,147,147,146,146,146,145, 145,144,144,143,142,142,142,141,141,140,140,139,139,137,137,137, 137,137,136,136,135,135,135,134,133,133,132,132,132,132,130,130, 129,129,129,129,128,128,128,128,127,127,125,125,125,125,125,124, 124,124,123,123,122,122,122,120,120,120,120,120,120,119,119,119, 118,118,117,117,117,117,117,116,116,115,115,114,114,114,114,114, 113,113,113,113,113,112,112,112,111,111,110,110,110,109,109,109, 108,108,108,108,108,107,106,106,106,105,105,105,105,104,104,102, 102,102,102,102 }; const int n4w2b2r5[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 300,300,300,300,299,298,298,297,296,296,295,295,294,294,293,293, 291,290,289,289,288,287,287,287,286,286,286,285,284,284,284,284, 283,283,282,281,281,280,280,280,280,279,279,279,278,278,278,278, 278,278,276,276,276,276,276,276,276,275,275,275,275,274,274,273, 272,272,272,271,271,270,270,269,269,269,269,268,268,266,266,266, 265,265,265,265,265,264,263,263,263,263,263,263,262,262,262,262, 261,261,261,261,261,260,260,260,259,259,259,258,258,258,258,257, 257,256,255,255,254,253,253,253,252,252,251,251,251,251,250,250, 250,249,249,249,248,248,248,247,247,247,247,247,246,246,246,246, 246,246,245,245,245,245,244,244,244,244,244,244,243,243,243,243, 243,243,242,242,242,242,240,239,238,237,237,237,237,237,237,237, 236,236,235,234,234,233,233,232,232,232,231,231,231,231,231,230, 229,229,229,229,229,228,228,227,227,227,227,227,226,226,224,224, 223,222,222,222,222,222,221,221,221,220,220,219,219,219,219,219, 218,218,217,217,217,217,216,216,216,216,216,216,215,215,215,215, 214,214,214,214,213,212,212,211,210,210,209,209,208,208,208,208, 208,207,207,207,207,206,206,206,206,205,205,204,204,203,203,202, 202,202,202,202,201,201,201,200,199,198,198,197,195,192,192,192, 191,190,190,190,190,189,189,189,189,188,188,187,187,185,185,185, 185,184,184,183,183,182,182,182,181,181,181,181,180,180,180,180, 179,179,177,177,176,176,175,175,175,174,174,174,174,174,174,174, 172,172,172,172,171,169,168,167,167,166,166,166,165,164,164,164, 164,163,163,163,163,162,162,162,162,161,161,160,159,159,159,158, 157,155,155,154,154,153,153,153,153,153,152,152,151,151,150,149, 149,149,148,147,147,147,147,147,146,146,145,145,144,144,144,143, 142,142,142,141,141,140,140,140,139,139,139,138,138,137,137,137, 137,136,136,136,136,135,135,134,134,134,134,134,133,133,133,133, 132,132,130,130,129,128,128,127,127,127,126,126,126,126,126,126, 124,124,123,123,122,122,122,121,121,121,119,119,119,118,117,117, 117,116,116,116,114,114,114,114,113,113,112,110,110,110,110,110, 110,109,109,108,108,108,107,107,106,106,105,104,104,104,104,103, 103,102,102,102 }; const int n4w2b2r6[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 300,300,300,299,298,298,298,297,297,297,296,295,295,295,295,295, 294,294,294,294,294,293,293,293,293,292,292,292,291,291,291,291, 289,289,289,289,288,288,288,288,288,288,287,286,285,285,284,284, 284,284,284,283,283,283,282,282,282,282,281,281,281,280,279,279, 279,278,278,278,277,276,275,275,275,275,274,274,273,272,272,272, 272,271,271,271,270,269,269,269,268,268,268,268,267,267,267,267, 266,266,265,265,265,264,264,263,263,263,262,262,262,262,260,259, 259,259,259,259,258,257,256,256,256,256,256,255,253,253,252,252, 251,251,251,250,250,250,249,249,248,248,248,247,247,247,247,247, 246,246,246,246,246,246,245,244,243,243,242,242,242,241,241,241, 241,241,241,241,240,240,240,239,239,239,239,239,238,237,237,237, 236,235,235,234,233,233,233,232,232,232,231,231,229,229,228,228, 228,227,227,227,227,227,226,226,226,225,225,225,225,223,223,223, 223,223,223,222,222,222,221,221,221,220,220,220,220,220,219,219, 218,218,218,217,217,216,216,216,216,215,215,214,213,212,211,211, 211,211,211,210,210,209,209,207,206,206,205,204,204,203,203,203, 203,202,201,201,201,201,201,200,199,199,199,198,197,196,196,196, 195,194,194,194,193,193,192,192,192,191,191,190,190,189,189,188, 188,188,188,188,188,188,188,187,186,186,186,185,185,185,185,184, 184,184,183,183,183,182,182,182,182,182,182,181,181,181,181,180, 180,180,179,179,179,178,177,177,176,176,176,176,176,175,175,175, 175,174,174,172,171,171,171,171,171,171,171,168,168,168,168,167, 167,167,167,166,166,165,164,164,164,163,163,162,162,162,162,162, 161,161,160,160,159,159,158,157,157,157,157,157,156,156,154,153, 152,151,151,150,150,150,149,148,148,147,146,146,146,145,145,145, 145,145,144,144,143,143,143,140,140,139,139,138,138,136,136,135, 134,133,133,133,133,133,132,132,132,131,131,131,131,131,131,131, 130,130,129,128,127,127,127,127,127,127,126,126,124,124,123,123, 123,122,121,121,120,119,119,119,118,118,118,118,118,117,117,117, 117,116,116,116,115,114,113,113,113,113,112,112,111,111,110,110, 109,108,108,108,107,107,107,106,106,106,106,105,105,105,105,105, 105,103,103,102 }; const int n4w2b2r7[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 300,300,300,299,299,298,298,298,297,297,297,297,296,295,295,295, 294,294,294,293,293,293,293,292,291,291,291,291,291,291,291,290, 290,289,289,288,288,287,287,287,286,286,286,285,285,285,284,283, 283,283,283,282,282,282,280,280,279,279,279,279,279,278,277,277, 276,276,275,275,275,275,274,273,273,273,273,273,273,271,271,271, 271,271,271,270,270,270,270,270,269,269,269,268,267,267,266,265, 265,264,264,264,263,262,262,262,261,261,260,260,259,259,259,258, 258,257,256,255,254,254,254,253,253,252,252,252,251,251,251,250, 250,250,250,249,249,249,249,248,248,248,248,247,247,247,247,246, 246,246,245,244,244,244,243,243,243,243,242,241,241,241,241,240, 238,238,237,237,236,235,235,233,233,232,232,232,232,232,232,232, 231,230,229,229,229,228,228,228,227,227,227,227,226,226,226,226, 225,225,224,224,222,222,221,221,220,220,219,217,217,217,217,216, 216,216,215,215,215,214,214,214,214,214,214,213,213,212,212,212, 212,212,212,211,211,211,210,210,210,210,210,210,209,209,208,208, 207,206,206,205,205,205,204,204,204,204,203,203,202,202,202,202, 202,202,202,202,201,201,201,201,201,199,198,198,198,198,196,196, 196,195,193,193,193,193,193,193,192,192,192,192,192,191,190,190, 189,189,189,188,188,188,187,187,186,186,186,186,184,184,183,183, 182,181,181,180,179,179,178,178,177,177,176,175,175,175,175,174, 174,174,172,172,171,171,171,171,170,170,170,168,167,167,167,166, 166,166,166,166,166,165,165,165,165,165,164,164,164,162,161,161, 159,159,159,158,158,158,158,158,158,157,156,156,155,155,155,154, 154,154,153,152,151,151,151,151,150,149,148,147,147,146,146,146, 146,146,145,145,144,143,142,141,141,140,140,140,140,139,139,138, 137,137,137,137,137,137,137,136,136,135,135,135,134,134,134,134, 133,133,132,131,131,131,130,130,130,130,129,129,126,126,126,126, 126,125,125,125,125,124,124,124,123,123,122,121,121,121,121,120, 120,119,119,119,118,118,118,117,117,117,116,116,115,114,114,113, 112,112,112,112,111,111,111,110,109,109,109,109,109,108,108,108, 107,106,106,106,105,105,105,105,105,104,104,104,103,103,102,102, 102,102,102,102 }; const int n4w2b2r8[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 300,299,298,296,296,295,295,295,295,293,292,292,292,291,291,290, 290,288,288,288,288,288,288,287,287,286,286,286,285,285,284,284, 284,283,282,281,281,280,280,280,279,279,279,278,278,278,278,278, 277,277,276,274,274,274,273,273,273,272,271,271,270,269,269,268, 267,267,267,267,266,266,265,265,265,265,264,264,264,263,263,262, 262,261,261,261,260,259,259,259,258,258,257,257,257,257,256,256, 255,254,254,254,254,254,254,254,253,253,252,251,251,251,251,251, 250,250,249,249,249,248,248,248,247,247,246,246,246,245,245,244, 244,244,244,241,241,241,240,240,240,239,239,239,239,239,239,238, 238,238,238,238,237,236,236,236,236,235,235,235,235,235,233,233, 232,232,232,230,230,230,229,229,228,227,227,226,226,226,225,224, 223,223,223,223,222,222,221,221,221,220,220,220,220,220,219,219, 219,219,218,218,218,217,216,216,216,216,215,215,214,213,213,213, 212,212,212,211,211,211,211,210,210,209,209,209,209,209,208,208, 208,208,208,207,207,207,206,206,205,205,204,204,203,202,202,201, 201,201,201,201,200,199,199,198,196,196,196,195,195,195,195,194, 194,193,193,193,192,192,191,191,191,190,190,189,188,188,188,188, 187,186,185,185,185,184,184,184,183,183,183,182,182,182,181,181, 181,180,180,180,179,178,178,178,178,177,177,177,177,177,177,176, 176,176,176,176,175,175,175,174,174,173,173,173,172,172,171,171, 171,169,169,169,168,168,168,168,168,168,167,167,167,166,166,165, 165,165,165,164,164,164,164,164,163,163,162,162,161,161,161,160, 160,159,159,159,159,159,159,158,157,157,156,156,156,156,156,155, 155,155,154,153,153,153,153,152,152,152,152,151,151,151,150,149, 149,149,149,149,148,148,148,147,147,146,146,146,145,145,145,145, 145,145,144,144,143,143,143,142,141,141,141,140,140,140,140,139, 139,139,138,137,137,137,136,135,135,135,135,134,134,134,134,132, 132,131,131,131,130,128,128,127,127,127,127,126,126,126,125,125, 124,124,123,122,122,121,121,119,118,118,118,117,117,116,116,116, 116,115,115,114,113,113,113,113,112,111,111,111,111,111,110,109, 109,109,108,108,108,108,107,106,106,106,106,106,105,105,104,104, 104,103,102,102 }; const int n4w2b2r9[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 300,300,299,299,298,298,298,295,295,295,294,294,294,294,293,293, 293,292,292,292,292,292,290,290,290,288,288,288,287,287,287,287, 287,286,286,286,285,285,285,284,284,283,283,283,283,283,282,282, 282,282,281,281,280,280,279,279,279,278,278,277,277,277,276,275, 275,275,274,274,274,274,273,273,272,272,271,271,271,271,271,270, 270,270,270,270,269,269,269,269,268,268,268,268,268,268,267,266, 266,266,266,266,265,265,264,264,264,263,262,262,261,261,261,261, 260,260,259,259,259,259,258,258,257,256,256,255,255,254,253,253, 253,252,252,251,251,251,251,250,250,250,250,250,249,249,248,248, 247,247,247,246,246,246,245,244,244,244,242,241,241,241,241,240, 239,239,239,238,238,238,238,237,236,236,236,236,236,236,236,235, 235,235,235,235,234,234,234,234,233,233,233,231,231,231,230,229, 229,229,228,228,228,227,227,226,226,225,225,224,224,224,223,223, 222,222,222,221,221,221,220,220,220,220,219,219,219,219,219,218, 218,217,216,216,216,215,215,215,214,213,213,212,211,211,211,211, 211,210,210,210,209,208,207,207,206,205,205,205,204,203,203,201, 201,201,200,200,199,199,199,199,198,197,197,197,197,196,196,196, 195,194,194,193,193,193,193,192,192,190,189,189,188,188,188,188, 188,188,187,187,187,185,185,184,183,182,182,182,182,182,182,181, 181,181,180,180,179,179,179,179,179,178,178,178,176,175,175,175, 174,173,173,173,173,173,172,172,172,172,172,170,169,169,169,169, 169,168,168,167,167,166,166,166,166,165,164,164,164,163,162,162, 159,159,159,157,157,157,157,156,156,156,156,156,156,156,155,154, 153,152,152,152,152,152,152,152,151,151,150,150,150,149,149,148, 148,145,145,145,144,144,144,143,143,142,142,142,142,142,142,141, 141,141,140,140,140,139,139,138,138,137,137,137,137,136,136,135, 134,134,133,133,133,133,133,132,132,130,130,130,130,129,129,128, 128,128,128,127,127,127,126,126,125,125,125,125,125,125,124,124, 123,123,123,122,122,122,121,120,120,120,120,120,120,119,119,119, 118,117,117,117,116,116,116,116,115,115,115,114,113,113,112,112, 112,112,110,110,109,109,109,108,108,108,108,107,107,107,105,105, 105,104,103,103 }; const int n4w2b3r0[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 380,380,380,379,379,379,378,377,377,377,376,376,374,373,373,372, 370,370,370,370,370,369,369,368,367,366,365,365,365,365,364,363, 362,361,361,360,360,359,359,358,358,357,357,357,357,356,355,353, 352,351,350,350,349,348,348,348,348,348,347,345,345,345,341,341, 339,338,337,337,337,337,336,334,334,332,331,329,329,327,327,325, 323,323,322,321,320,320,320,319,319,317,314,313,312,312,310,308, 308,307,306,306,306,306,304,304,304,303,303,303,302,302,300,299, 295,294,294,294,293,293,293,290,290,287,286,286,286,285,285,283, 282,281,281,280,279,278,278,277,277,277,274,273,273,272,272,271, 270,270,269,268,267,266,266,264,264,262,261,261,261,261,261,260, 260,260,260,258,258,257,257,257,256,256,254,254,254,253,253,252, 252,252,252,251,251,249,249,248,247,247,246,246,245,245,242,242, 240,240,240,239,239,237,237,236,236,235,234,234,234,234,233,233, 233,232,230,230,229,228,227,226,225,225,225,225,224,224,222,221, 220,219,219,218,217,217,216,216,214,214,214,213,212,212,210,210, 210,209,209,208,206,206,206,204,203,203,202,202,201,199,199,198, 198,197,196,195,195,195,195,194,194,194,192,191,191,189,188,188, 185,185,185,182,182,181,180,180,179,179,179,179,178,178,175,174, 173,172,172,172,171,171,168,168,168,167,166,166,165,165,165,165, 164,164,163,163,162,160,159,159,159,158,158,157,154,153,153,151, 151,149,148,148,147,147,146,146,146,145,144,144,143,141,141,141, 141,140,140,139,139,139,139,138,138,136,136,136,136,136,135,134, 134,133,132,131,131,129,127,127,127,126,125,124,124,120,120,119, 117,117,116,116,115,115,115,114,113,111,111,110,109,109,108,108, 108,107,106,106,106,105,105,101,99,99,98,96,96,96,95,94,92,91, 91,90,89,88,88,88,87,86,85,83,83,83,82,82,81,78,77,77,77,75,74, 73,73,73,73,73,73,72,70,69,65,63,62,62,60,60,59,57,57,57,57,57, 56,56,54,54,54,53,52,51,50,48,48,47,47,46,46,45,45,44,44,44,44, 44,43,43,43,42,41,40,40,39,39,39,38,38,38,37,34,33,33,33,32,32, 31,30,30,29,28,28,28,28,28,25,23,22,22,22 }; const int n4w2b3r1[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 380,379,379,379,378,376,376,376,374,373,373,370,369,368,366,366, 365,364,362,362,362,361,361,360,359,359,359,358,356,356,355,355, 355,355,352,352,352,351,351,351,349,349,348,348,348,346,345,344, 344,344,343,343,343,341,341,340,340,339,338,336,335,335,335,334, 334,333,333,332,332,331,330,330,330,329,328,327,327,327,327,327, 326,326,325,324,322,322,321,320,320,319,319,318,315,313,313,313, 313,313,313,309,307,306,306,303,301,300,299,298,297,296,296,295, 294,294,294,294,293,293,292,292,292,292,292,291,291,291,290,290, 289,289,288,288,288,288,286,285,283,282,281,280,278,277,276,275, 274,273,271,271,270,270,269,269,269,268,268,267,267,266,265,265, 265,261,260,260,259,259,258,258,258,257,257,257,257,256,254,253, 252,251,251,251,249,249,249,249,247,247,246,246,246,245,244,243, 243,242,242,241,241,241,239,239,238,237,236,236,235,235,235,234, 234,234,232,232,231,230,228,228,228,227,227,226,225,224,223,222, 222,221,221,221,220,220,217,216,216,216,216,216,215,214,213,213, 213,210,210,210,210,210,210,209,208,208,207,207,206,205,205,203, 203,201,200,200,200,199,199,199,198,196,192,189,189,188,188,187, 186,186,185,184,181,180,180,180,179,179,178,174,174,173,173,172, 171,170,170,169,168,167,167,166,166,166,164,163,163,163,162,162, 161,161,160,160,159,159,159,157,156,155,153,153,152,151,150,150, 150,149,148,148,148,148,146,145,145,144,144,143,142,141,140,138, 138,138,137,137,136,135,134,133,132,132,132,131,130,130,129,129, 129,129,129,128,127,127,127,127,127,126,123,123,122,122,122,121, 121,121,120,120,120,118,118,115,114,114,114,113,113,112,112,112, 111,111,110,110,109,109,108,107,107,106,106,105,103,102,102,98, 98,97,97,97,96,91,90,90,89,89,88,87,86,84,84,83,83,81,80,80,80, 80,79,79,78,78,77,77,77,76,76,76,75,71,71,71,70,69,68,67,65,65, 65,64,64,63,62,62,62,58,56,55,54,53,52,50,50,50,49,49,48,48,48, 47,46,46,45,44,43,42,42,41,39,39,39,39,38,38,37,35,35,34,34,33, 33,32,32,32,31,29,26,26,26,24,24,23,23,22,22,22 }; const int n4w2b3r2[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 380,380,380,379,379,378,377,377,376,376,374,373,372,371,370,368, 368,368,367,367,367,367,366,365,363,362,361,361,360,360,359,359, 359,358,358,357,357,356,355,354,354,354,353,353,353,351,351,350, 348,346,344,343,343,342,341,341,341,341,340,339,339,338,338,338, 337,335,334,332,331,331,329,329,325,325,324,320,319,318,318,318, 318,318,316,316,315,312,312,311,308,308,307,306,306,305,304,304, 304,304,303,302,301,300,300,299,299,298,298,297,297,296,295,294, 294,292,292,291,291,291,291,291,290,289,289,287,287,286,286,286, 286,284,284,283,282,282,281,280,279,279,278,278,277,274,272,271, 271,269,267,267,267,266,265,265,265,265,264,264,262,262,262,261, 261,260,260,260,259,259,259,258,257,257,257,256,256,255,255,255, 255,254,254,251,251,250,248,248,248,243,240,240,240,239,239,237, 235,235,233,233,231,231,230,229,229,228,228,227,225,225,223,223, 222,221,219,218,218,218,217,217,215,215,213,213,212,211,211,210, 210,208,207,207,206,206,206,205,205,203,201,200,200,200,199,199, 198,198,197,197,197,196,196,196,195,195,194,194,193,191,191,191, 189,188,188,187,187,186,186,186,185,185,185,185,184,183,181,181, 180,180,179,177,177,176,176,175,175,174,172,172,172,171,171,171, 171,170,170,169,168,167,167,166,164,163,162,161,159,158,157,157, 157,155,154,153,152,152,152,151,151,150,150,148,148,147,147,146, 146,144,144,144,144,143,143,143,142,142,141,141,140,140,139,138, 137,137,137,136,135,135,135,135,134,133,132,130,130,130,129,129, 129,127,125,124,124,124,124,123,123,122,122,122,120,120,119,117, 117,116,115,115,114,112,110,109,109,108,107,105,105,105,105,104, 103,103,103,102,102,101,101,100,100,100,99,99,98,98,98,97,96, 96,93,93,93,92,92,92,90,88,88,87,86,85,85,84,84,83,82,80,80,79, 76,75,75,74,74,73,73,72,71,71,70,70,69,68,68,66,65,65,63,63,62, 62,62,62,62,60,60,58,58,57,57,56,56,55,53,52,52,51,51,50,49,48, 47,47,46,46,44,44,44,42,41,41,41,41,40,39,37,36,36,36,36,36,36, 35,35,33,32,31,30,29,29,28,27,26,26,24,23,23 }; const int n4w2b3r3[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 380,380,378,376,375,375,374,372,371,370,370,370,369,369,368,368, 365,365,365,364,363,362,361,360,359,359,357,354,354,353,353,352, 350,349,349,349,349,349,348,347,347,346,345,345,342,341,340,340, 339,338,337,337,337,335,334,334,334,333,333,332,331,331,329,329, 329,328,328,327,326,325,325,324,324,323,322,320,320,320,320,319, 318,317,314,314,314,313,313,312,309,306,306,305,303,303,303,302, 302,301,301,301,299,299,297,296,296,295,295,294,293,293,293,292, 292,292,292,291,291,291,289,289,288,288,288,287,286,286,286,286, 285,284,284,284,283,283,283,282,280,279,278,278,277,277,276,276, 275,274,271,271,270,270,269,269,269,268,268,268,267,267,267,266, 265,265,265,263,263,262,262,260,259,258,258,258,258,257,256,256, 255,255,254,254,254,252,252,252,251,250,250,249,249,247,246,246, 244,244,242,242,241,241,241,241,241,240,238,237,236,236,232,231, 230,229,229,229,228,228,228,226,225,224,223,222,221,221,220,219, 219,219,218,217,215,214,213,212,211,210,210,210,209,209,209,208, 207,207,207,207,206,206,205,205,204,202,202,202,200,199,199,198, 196,195,192,192,191,191,191,190,190,189,188,186,186,184,184,184, 183,183,183,182,182,182,182,180,180,180,179,179,179,178,178,178, 177,176,176,176,175,175,174,174,174,174,171,170,170,169,167,167, 166,163,161,160,159,157,156,156,156,156,155,154,154,153,152,151, 151,151,150,150,150,148,148,146,146,146,145,145,144,144,144,144, 144,142,142,141,140,138,138,137,136,133,132,132,131,131,131,131, 130,129,128,126,125,123,123,123,121,121,120,120,120,120,120,120, 118,117,116,116,114,114,112,112,112,112,108,108,107,107,106,104, 104,104,103,103,100,98,98,95,94,94,94,93,93,93,92,92,89,89,89, 88,87,86,86,83,83,81,80,80,79,79,77,77,76,76,76,76,76,75,75,75, 74,74,74,74,74,73,73,71,71,71,71,70,69,68,68,68,67,67,67,65,62, 62,62,61,60,60,59,58,58,57,57,56,55,55,55,55,53,53,53,51,50,50, 50,50,48,48,47,46,46,45,44,43,43,40,38,36,35,33,33,32,32,32,31, 29,28,27,25,25,25,24,24,24,24,22,22,22 }; const int n4w2b3r4[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 380,380,379,378,378,378,377,376,374,374,372,372,372,371,370,370, 369,368,368,368,367,366,366,365,362,361,361,360,359,359,358,356, 356,355,355,355,355,353,353,352,351,351,350,350,349,349,348,348, 348,348,347,347,346,345,344,344,343,343,343,342,341,341,339,339, 339,339,336,335,334,331,329,329,329,329,328,328,328,325,325,325, 325,322,322,321,321,320,320,320,319,318,318,318,317,316,316,315, 315,315,314,314,313,313,312,312,312,311,310,309,308,307,307,307, 306,304,301,300,300,299,299,298,298,297,296,295,295,295,295,295, 295,293,293,293,292,291,289,288,285,284,280,278,277,276,275,274, 274,273,273,273,273,272,272,269,269,268,268,267,267,264,264,264, 264,262,260,260,260,258,258,257,257,256,255,254,253,253,253,252, 252,251,251,250,249,249,248,246,245,244,243,243,243,242,242,241, 241,241,241,239,238,238,237,237,237,234,234,231,230,229,228,228, 227,227,226,226,226,226,225,225,224,224,224,224,221,221,219,219, 219,219,218,218,215,215,214,214,212,212,210,209,208,208,207,205, 204,203,201,200,198,198,198,198,197,197,197,196,196,195,194,193, 192,191,188,187,187,186,185,185,185,185,184,184,183,183,183,181, 181,181,180,180,180,179,179,178,177,177,176,175,173,173,173,173, 171,171,170,168,168,168,168,162,161,159,158,158,158,157,157,156, 155,154,154,154,153,152,152,151,151,148,148,148,147,146,144,144, 144,143,142,140,138,138,138,137,137,136,136,136,135,134,133,133, 133,132,132,132,131,129,129,128,128,127,126,124,123,123,122,122, 120,120,120,120,120,118,118,118,117,117,117,117,116,115,115,115, 114,114,113,110,110,109,108,107,106,106,106,104,103,102,102,101, 100,97,97,96,96,95,95,91,90,90,89,89,88,88,87,86,86,85,85,84, 84,84,84,83,83,83,81,81,81,80,79,78,77,77,77,76,73,73,71,71,70, 70,70,69,68,68,67,66,65,65,62,61,61,61,59,59,59,59,57,57,56,54, 54,54,54,53,53,53,52,51,50,50,50,49,48,48,48,48,47,45,44,42,41, 41,41,41,38,38,38,37,34,33,32,31,31,31,31,31,30,30,29,28,28,28, 27,26,26,26,26,26,25,24,23,23,22,22 }; const int n4w2b3r5[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 380,380,380,380,378,378,378,378,377,377,375,374,374,373,372,372, 371,370,369,368,367,365,363,363,362,362,361,360,359,359,358,358, 357,357,357,357,356,355,354,353,352,352,351,351,351,349,349,349, 348,347,347,347,346,344,344,343,340,339,339,337,336,335,335,335, 335,335,332,331,331,331,330,330,329,329,327,326,326,325,325,323, 322,321,321,321,320,317,317,316,315,314,312,312,311,311,310,310, 309,307,306,306,306,303,303,302,301,300,299,298,298,297,297,294, 294,294,293,292,292,292,291,291,290,290,289,289,288,288,287,285, 284,284,283,282,281,281,280,279,278,276,275,274,274,274,273,272, 272,271,271,271,271,270,270,269,269,269,268,267,266,266,265,265, 264,264,264,264,264,263,260,260,259,259,256,256,256,256,256,255, 255,255,254,253,253,251,251,250,250,250,249,248,248,248,247,246, 246,245,245,245,243,242,242,241,240,239,237,236,236,236,235,234, 233,232,230,230,229,228,228,228,228,228,226,225,223,222,220,220, 219,218,216,215,213,212,212,211,210,209,209,209,208,208,205,205, 204,203,202,202,202,202,202,200,199,198,198,198,198,197,196,196, 195,194,194,193,193,192,192,192,191,189,189,188,186,186,186,185, 183,183,183,183,181,180,180,180,179,178,177,176,176,176,175,175, 174,172,171,169,169,168,168,167,167,165,165,165,164,164,164,163, 161,160,160,158,158,158,157,157,157,156,156,156,155,155,155,154, 154,151,151,150,149,149,148,148,147,146,145,144,144,143,141,141, 139,138,137,137,136,135,135,135,132,132,132,130,130,130,129,129, 128,128,128,127,126,126,126,126,126,126,125,123,122,122,121,120, 120,119,119,119,117,116,115,115,115,114,114,113,112,111,111,110, 109,108,108,107,106,105,105,104,104,104,102,101,101,100,99,98, 98,98,95,95,95,94,93,93,92,91,91,90,90,89,89,88,86,83,82,82,81, 80,79,77,77,75,75,73,72,72,72,72,70,69,69,67,66,65,65,65,65,64, 64,64,64,64,64,62,59,58,58,57,55,55,53,52,51,48,48,48,48,47,46, 46,46,46,46,46,45,44,43,43,39,39,39,37,37,36,34,32,32,31,31,31, 29,28,27,27,26,26,25,24,24,23,23,23,23,22,22,22 }; const int n4w2b3r6[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 378,378,377,377,377,374,374,373,372,372,371,371,370,369,368,366, 366,365,364,364,363,363,362,361,358,357,357,357,356,356,355,355, 351,351,349,348,345,345,344,344,340,339,338,338,337,336,335,335, 334,332,332,331,330,329,329,329,327,327,326,325,324,323,323,321, 321,321,320,318,318,318,317,316,315,315,315,314,314,313,312,312, 311,311,310,308,306,306,305,304,304,303,303,301,301,299,298,298, 296,295,295,294,292,291,289,288,287,286,286,285,285,284,284,283, 282,282,282,282,282,282,280,279,279,279,278,278,278,277,277,276, 276,274,274,273,272,272,271,271,271,271,269,267,267,265,264,264, 264,263,263,263,262,262,261,261,259,258,257,255,255,254,252,251, 251,250,250,250,249,248,247,247,246,245,245,243,243,242,241,240, 240,240,238,237,236,236,235,235,234,233,231,231,230,230,229,228, 227,227,227,226,225,225,224,223,223,222,222,222,222,221,220,219, 219,218,218,217,216,215,215,215,214,212,212,211,211,210,209,209, 209,208,206,206,206,204,203,202,202,202,201,200,200,200,200,200, 198,198,198,197,196,195,194,194,192,191,190,189,189,188,188,188, 187,186,186,186,185,185,185,185,184,183,182,182,182,181,181,180, 179,179,179,177,177,177,177,176,174,174,174,174,173,173,173,172, 172,170,168,168,167,165,165,164,164,163,163,163,162,160,160,159, 159,158,157,156,156,156,155,155,155,155,154,154,153,153,152,152, 151,150,149,149,148,148,147,147,147,147,146,146,144,144,143,143, 143,141,140,139,139,139,138,138,138,136,136,135,135,135,133,133, 132,132,132,131,130,130,129,128,126,126,124,124,124,123,123,120, 120,119,119,118,118,118,117,116,115,115,113,112,111,111,111,110, 110,110,110,109,108,108,108,108,107,107,105,105,105,104,103,103, 103,102,101,101,100,100,97,97,96,96,95,95,95,95,95,94,90,88,88, 87,86,86,86,85,85,85,84,83,81,81,81,79,79,76,76,76,74,74,73,72, 72,72,72,71,70,68,67,66,65,65,63,61,59,58,58,58,57,56,55,55,55, 54,54,52,51,50,50,49,47,47,46,46,43,42,42,42,41,41,41,41,39,39, 39,36,33,33,31,31,29,29,28,27,27,27,26,25,25,23,23,22 }; const int n4w2b3r7[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 380,380,380,379,379,379,379,378,378,378,377,376,376,376,374,372, 372,372,370,370,369,368,368,367,366,366,366,366,365,365,365,364, 364,363,361,361,361,360,358,358,358,357,356,356,356,356,355,354, 353,351,351,350,350,349,349,349,348,343,342,342,340,340,339,337, 337,336,336,336,334,334,333,332,331,330,330,330,328,328,327,326, 325,324,324,322,322,322,321,321,320,320,320,320,319,319,318,318, 316,315,313,312,311,310,310,310,309,308,308,308,308,307,305,305, 305,305,305,304,303,303,302,301,300,297,297,297,296,294,294,291, 291,290,290,290,289,289,288,288,287,287,284,284,283,283,282,282, 280,280,280,279,279,279,278,277,277,277,277,277,276,275,275,272, 270,269,268,268,268,267,267,267,266,266,265,263,261,258,258,257, 257,256,253,252,252,250,250,249,249,248,247,246,246,245,245,244, 244,242,242,241,241,241,241,239,239,237,235,234,233,233,228,228, 226,226,226,225,224,224,223,223,222,221,221,221,220,219,218,218, 218,217,217,216,215,214,213,213,213,212,210,209,208,208,207,207, 206,205,203,202,201,201,201,200,198,196,193,193,193,192,191,191, 190,189,188,187,187,185,184,183,183,182,181,181,181,181,180,179, 178,178,178,175,175,175,174,174,174,174,173,173,173,172,172,172, 170,170,169,169,167,167,166,166,166,166,165,164,164,164,163,162, 162,162,161,161,160,159,157,157,157,156,156,154,153,151,151,149, 149,149,148,147,147,147,147,146,143,143,141,140,139,138,138,138, 136,136,134,131,131,129,128,128,128,127,125,124,124,123,122,122, 121,121,120,120,119,117,115,114,113,113,113,112,112,112,110,110, 108,108,108,107,106,105,104,104,104,103,101,100,100,100,100,99, 98,98,95,95,94,94,94,94,93,93,92,92,92,92,92,92,91,90,89,89,87, 87,85,84,84,83,82,81,79,78,78,78,77,76,75,75,74,72,71,71,71,70, 69,68,67,66,66,66,66,65,64,63,63,63,62,61,61,61,60,59,59,58,57, 57,56,54,53,52,52,52,52,51,51,50,50,48,48,46,46,45,44,44,43,43, 39,39,39,38,38,37,36,35,35,34,34,33,33,32,32,31,31,30,30,30,27, 27,27,26,25,25,25,24,24,23,23,22 }; const int n4w2b3r8[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 380,379,378,378,376,375,374,373,372,372,371,370,370,366,366,364, 363,363,362,361,361,361,361,361,360,360,359,357,356,356,356,355, 353,352,352,350,350,349,347,346,346,346,345,345,344,343,342,342, 340,340,339,339,339,339,338,337,335,335,335,333,333,331,331,331, 330,330,329,328,328,327,327,325,324,324,324,324,323,321,321,321, 320,320,318,316,315,315,314,314,313,311,308,308,308,307,307,306, 305,305,304,304,302,302,300,300,299,298,298,297,296,295,292,291, 289,289,289,288,288,287,287,287,286,286,286,285,285,284,284,283, 283,281,281,280,280,279,278,278,278,277,276,275,274,274,273,272, 272,272,271,270,269,268,266,265,265,263,260,259,258,258,258,258, 257,257,257,256,255,255,253,253,253,252,251,250,250,249,248,248, 246,245,245,244,243,243,242,241,241,238,238,238,237,236,234,234, 233,232,232,231,230,230,228,228,228,228,227,226,225,225,225,222, 222,222,221,221,220,219,217,216,216,216,215,214,213,213,213,212, 212,211,208,208,208,207,206,206,204,203,202,202,201,201,196,195, 195,195,195,194,194,193,192,191,191,189,189,189,188,187,186,186, 185,184,184,184,183,183,182,182,182,182,181,181,180,180,179,178, 177,176,175,175,175,174,173,171,171,170,170,170,170,169,168,168, 168,167,167,166,166,166,164,164,164,162,162,162,162,161,161,161, 160,158,157,156,155,154,153,152,152,151,150,150,150,149,148,148, 148,147,147,147,145,145,145,142,141,139,139,139,139,138,138,138, 136,135,134,133,133,132,132,132,131,130,129,129,127,127,125,125, 125,124,123,121,121,121,120,119,119,119,118,118,118,117,117,117, 117,116,115,115,114,112,112,111,111,111,109,109,109,108,108,107, 107,105,104,102,102,100,99,99,99,99,96,95,94,94,93,89,88,87,86, 85,85,85,85,84,84,83,83,82,82,82,82,81,81,81,80,79,78,78,78,77, 76,76,74,74,73,72,72,71,71,71,69,67,65,64,64,64,64,63,62,61,61, 60,59,57,55,55,53,53,52,51,51,51,50,50,49,48,48,48,47,46,46,45, 45,45,43,42,42,42,42,40,40,40,40,40,39,38,38,34,34,34,34,33,33, 32,32,30,30,30,29,27,27,23,23,22,22,22 }; const int n4w2b3r9[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 379,378,378,378,375,375,373,373,373,372,372,372,371,371,370,369, 369,369,369,368,368,366,365,365,365,364,364,363,363,362,361,361, 361,358,358,356,354,354,354,354,353,353,351,350,349,349,349,349, 349,346,346,346,346,346,346,346,345,345,342,342,342,341,340,337, 337,337,337,336,336,335,333,331,328,327,327,327,326,325,325,323, 321,321,321,320,319,318,318,317,317,316,316,315,315,314,314,313, 312,312,312,310,309,309,307,306,305,305,304,303,301,300,300,299, 299,298,298,297,297,296,296,296,295,295,295,295,294,294,293,292, 292,292,291,291,291,289,289,288,285,284,284,284,282,281,281,280, 279,279,279,278,278,274,274,273,272,272,272,271,271,270,269,269, 269,268,267,267,266,265,264,264,263,262,260,260,258,258,257,257, 256,256,256,255,254,254,253,253,252,252,252,252,251,250,248,247, 247,246,246,246,242,242,242,241,240,240,240,239,236,236,236,234, 234,233,232,231,231,230,225,224,223,223,222,220,219,219,218,217, 217,215,215,215,215,214,214,214,211,211,210,210,210,210,209,207, 205,204,204,203,202,201,200,200,199,199,199,198,198,197,195,195, 195,194,192,191,190,190,189,188,188,187,186,186,184,183,182,182, 182,181,181,181,180,180,180,178,178,178,177,177,176,175,174,174, 174,174,174,173,173,172,171,171,169,169,169,169,167,167,165,165, 164,164,164,163,163,162,162,162,159,157,157,155,155,154,153,153, 152,151,151,151,150,148,147,147,147,145,144,142,142,142,141,140, 138,136,136,135,135,135,134,133,133,133,132,131,131,130,129,128, 128,125,125,125,124,123,123,121,120,120,119,118,118,117,117,116, 116,115,113,113,113,113,113,112,112,112,110,110,109,108,108,107, 107,107,107,107,106,105,104,104,101,101,100,100,100,100,99,98, 97,96,96,96,96,95,95,94,94,94,93,93,92,91,91,88,88,87,86,86,84, 83,82,82,81,79,78,78,78,77,74,74,74,73,73,72,71,71,71,71,71,71, 68,68,67,67,67,65,63,63,61,60,59,58,56,56,55,54,54,53,52,51,50, 49,49,48,48,48,47,47,46,46,45,41,40,39,38,38,38,37,35,35,35,34, 34,33,33,31,29,29,28,28,28,27,24,24,23,22,22,22 }; const int n4w3b1r0[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 168,168,168,168,168,168,168,168,168,167,167,167,167,167,167,167, 167,167,167,167,167,166,166,166,166,166,165,165,165,165,165,165, 165,165,165,165,165,165,164,164,164,164,164,164,164,164,164,164, 164,164,164,164,164,164,163,163,163,163,163,163,163,163,162,162, 162,162,162,162,162,162,162,162,162,162,162,161,161,161,161,161, 161,161,161,161,161,161,161,161,161,160,160,160,160,160,160,160, 160,160,160,160,160,159,159,159,159,159,159,158,157,157,157,157, 157,157,157,157,157,156,156,156,156,156,156,156,156,156,156,156, 156,155,155,155,155,155,155,155,155,155,154,154,154,154,154,154, 154,153,153,153,153,153,153,152,152,152,152,152,152,152,151,151, 151,151,151,151,151,151,151,151,151,150,150,150,150,150,150,150, 150,149,149,149,149,148,148,148,148,148,147,147,147,147,147,147, 146,146,146,146,146,146,146,146,145,145,145,145,145,145,145,145, 145,145,145,145,145,145,145,145,144,144,144,144,144,144,144,144, 144,144,143,143,143,143,143,143,143,143,143,143,142,142,142,142, 142,142,142,142,142,142,141,141,141,141,141,141,141,140,140,140, 140,140,140,140,140,140,140,140,139,139,139,139,139,139,139,138, 138,138,138,138,137,137,137,137,137,137,137,137,137,137,137,137, 137,137,136,136,136,136,136,136,136,136,136,135,135,135,135,135, 135,135,135,135,135,134,134,134,134,134,134,134,134,134,134,134, 133,133,133,132,132,132,132,132,132,132,132,132,132,132,132,132, 132,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131, 131,131,130,130,130,130,130,130,130,129,129,129,129,129,129,129, 129,128,128,128,128,128,128,128,127,127,127,127,127,127,126,126, 126,126,126,126,126,125,125,125,125,125,125,125,125,125,125,125, 125,124,124,124,124,124,124,124,124,123,123,123,123,123,123,123, 122,122,122,122,122,122,122,122,121,121,121,121,121,121,121,121, 121,121,120,120,120,120,120,120,120,119,119,119,119,119,119,119, 118,118,118,118,118,118,118,118,118,118,118,118,118,118,117,117, 117,117,117,117,117,116,116,116,116,116,116,116,116,115,115,115, 115,115,115,115,115,115,115,114,114,114,114,114,114,114,114,114, 114,114,114,114 }; const int n4w3b1r1[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 168,168,168,168,168,168,168,168,168,167,167,167,167,167,167,167, 167,166,166,166,166,166,166,166,166,166,165,165,165,165,165,165, 165,165,165,165,165,164,164,164,164,164,164,164,164,164,164,163, 163,163,163,163,163,163,163,163,162,162,162,162,162,162,162,162, 162,162,162,161,161,161,161,161,161,161,160,160,160,160,160,160, 160,160,160,160,160,160,160,160,160,159,159,159,158,158,158,158, 158,158,157,157,157,157,157,157,157,157,157,157,157,157,157,156, 156,156,156,156,156,156,156,156,156,155,155,155,155,155,155,155, 155,155,155,155,155,154,154,154,154,154,154,154,153,153,153,153, 153,152,152,152,152,152,152,152,152,152,152,152,152,152,151,151, 151,151,151,151,151,151,151,151,150,150,150,150,150,150,150,150, 150,150,150,150,150,150,150,150,150,150,149,149,149,149,149,149, 149,149,149,148,148,148,148,148,148,148,147,147,147,147,147,147, 147,147,146,146,146,146,146,145,145,145,145,145,145,145,145,145, 145,144,144,144,144,144,144,144,144,144,144,144,144,143,143,143, 143,143,143,143,143,143,142,142,142,142,142,142,142,142,141,141, 141,141,141,141,141,140,140,140,140,140,140,139,139,139,139,139, 139,139,139,139,139,139,139,139,139,139,139,139,138,138,138,138, 138,138,138,138,138,137,137,137,137,137,137,137,137,137,137,137, 137,137,137,137,136,136,136,136,136,135,135,135,135,135,135,135, 135,134,134,134,134,134,134,133,133,133,133,133,133,133,133,133, 133,132,132,132,132,132,132,132,132,132,131,131,131,131,131,131, 131,131,131,131,131,131,130,130,130,130,130,130,130,130,130,129, 129,129,129,129,129,129,129,129,129,129,129,128,128,128,128,128, 128,128,128,128,128,127,127,127,127,127,126,126,126,126,126,125, 125,125,125,125,125,125,125,125,125,125,124,124,124,124,124,124, 124,124,124,123,123,123,123,123,123,123,123,123,123,122,122,122, 122,121,121,121,121,121,121,120,120,120,120,120,120,119,119,119, 119,119,119,119,119,119,118,118,118,118,118,118,118,118,118,118, 118,118,118,117,117,117,117,117,117,116,116,116,116,116,116,116, 116,116,115,115,115,115,115,114,114,114,114,114,114,114,114,114, 114,114,114,114 }; const int n4w3b1r2[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 168,168,168,168,168,167,167,167,167,167,167,167,167,167,167,167, 167,167,167,167,167,166,166,166,166,166,166,166,166,166,166,166, 165,165,165,165,165,165,165,165,165,165,164,164,164,164,164,164, 163,163,163,163,163,163,162,162,162,162,162,162,162,162,162,162, 162,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161, 160,160,160,160,160,160,160,160,160,160,160,160,160,160,159,159, 159,159,159,159,159,159,159,159,159,159,159,159,159,158,158,158, 158,157,157,157,157,157,157,156,156,156,156,156,156,156,156,156, 156,155,155,155,155,155,155,155,155,155,155,155,154,154,154,154, 154,154,153,153,153,153,153,153,153,153,152,152,152,152,152,152, 152,152,151,151,151,151,151,151,151,151,150,150,150,150,150,150, 149,149,149,149,149,149,149,149,149,149,149,149,148,148,148,148, 148,148,148,148,148,148,148,148,147,147,147,147,147,147,147,147, 147,146,146,146,146,146,146,146,146,146,146,146,146,146,146,145, 145,145,145,145,145,145,145,145,144,144,144,144,143,143,143,143, 143,143,143,142,142,142,142,142,142,142,141,141,141,141,141,141, 141,141,141,141,141,141,141,141,141,140,140,140,140,140,139,139, 139,139,139,139,139,139,138,138,138,138,138,138,138,138,138,137, 137,137,137,137,137,137,137,137,136,136,136,136,136,136,136,136, 136,136,136,135,135,135,135,135,135,135,135,135,135,135,134,134, 134,134,134,134,134,134,134,134,134,134,134,134,134,133,133,133, 133,133,133,133,133,133,132,132,132,132,132,132,132,131,131,131, 131,131,131,131,130,130,130,130,130,130,130,130,129,129,129,129, 129,129,129,129,129,129,129,128,128,128,128,128,128,127,127,127, 127,127,126,126,126,126,126,126,126,126,126,126,125,125,125,125, 125,125,124,124,124,124,124,124,124,124,124,124,124,124,123,123, 123,123,123,123,122,122,122,122,122,122,122,121,121,121,121,121, 121,121,121,121,121,121,121,120,120,120,120,120,120,120,120,120, 119,119,119,119,119,119,119,119,119,118,118,118,118,118,118,118, 118,118,118,118,118,118,118,118,118,117,117,117,117,117,117,117, 117,116,116,116,116,116,116,116,116,115,115,115,115,114,114,114, 114,114,114,114 }; const int n4w3b1r3[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 168,168,168,168,168,168,168,168,168,168,168,168,167,167,167,167, 167,167,167,166,166,166,166,166,166,166,165,165,165,165,165,165, 165,164,164,163,163,163,163,163,163,163,163,163,162,162,162,162, 161,161,161,161,161,161,161,161,161,161,161,161,161,160,160,160, 160,160,160,160,160,160,160,159,159,159,159,158,158,158,158,158, 158,158,158,158,158,158,158,157,157,157,157,157,157,157,157,157, 157,157,157,156,156,156,156,156,156,156,156,156,155,155,155,155, 155,155,154,154,154,154,154,154,154,153,153,153,153,152,152,152, 152,152,152,152,152,152,152,152,151,151,151,151,151,151,151,151, 151,151,151,151,151,151,150,150,150,150,150,150,150,150,150,150, 149,149,149,149,149,149,149,149,149,148,148,148,148,147,147,147, 147,147,147,147,147,146,146,146,146,146,146,146,146,146,146,146, 146,146,146,146,146,146,146,146,145,145,145,145,145,145,145,145, 145,145,144,144,144,144,144,144,144,143,143,143,143,143,143,143, 143,142,142,142,142,142,142,142,142,142,142,142,142,141,141,141, 141,141,141,141,141,141,140,140,140,140,140,140,140,140,140,140, 140,139,139,139,139,139,139,139,138,138,138,138,138,138,138,137, 137,137,137,137,137,137,137,136,136,136,136,136,136,136,136,136, 136,135,135,135,135,135,135,135,135,135,134,134,134,134,134,134, 134,134,134,134,134,134,134,134,134,134,133,133,133,133,133,133, 133,133,133,133,133,132,132,132,132,132,132,132,132,132,132,131, 131,131,131,131,131,131,131,131,131,130,130,130,130,130,130,130, 130,129,129,129,129,129,129,129,129,129,129,129,128,128,128,128, 128,128,128,127,127,127,127,127,127,127,127,126,126,126,126,126, 126,126,126,126,125,125,125,125,125,125,125,125,125,124,124,124, 124,124,124,123,123,123,123,123,123,123,122,122,122,122,122,122, 122,122,122,122,122,122,122,122,122,122,122,122,122,121,121,121, 121,121,121,121,120,120,120,120,120,120,120,120,120,120,120,120, 119,119,119,119,119,119,119,119,119,118,118,118,118,118,118,118, 118,118,118,118,118,117,117,117,117,117,116,116,116,116,116,116, 115,115,115,115,115,115,115,114,114,114,114,114,114,114,114,114, 114,114,114,114 }; const int n4w3b1r4[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 168,168,168,168,168,168,168,168,168,168,168,167,167,167,167,167, 167,167,167,167,166,166,166,166,166,166,166,165,165,165,165,165, 165,165,164,164,164,164,164,164,164,164,164,164,164,164,163,163, 163,163,163,163,162,162,162,162,162,162,162,162,162,162,162,162, 162,161,161,161,161,161,161,161,161,161,161,161,160,160,160,160, 160,160,160,159,159,159,159,159,159,159,158,158,158,158,158,158, 157,157,157,157,157,157,157,157,157,157,157,156,156,156,156,156, 156,155,155,155,155,155,155,155,155,155,155,154,154,154,154,154, 154,154,154,153,153,153,153,153,153,153,153,153,152,152,152,152, 152,152,152,151,151,151,151,151,150,150,150,150,150,150,150,150, 150,149,149,149,149,149,149,149,149,148,148,148,148,148,148,148, 148,148,147,147,147,147,147,147,147,147,146,146,146,146,146,146, 146,146,145,145,145,145,145,145,145,145,145,145,145,145,145,144, 144,144,144,144,144,144,144,144,144,143,143,143,143,143,143,143, 143,143,143,143,143,143,143,143,143,142,142,142,142,142,142,142, 142,142,142,142,141,141,141,141,141,141,141,141,140,140,140,140, 140,140,140,140,140,140,140,139,139,139,139,139,139,139,139,139, 138,138,138,138,138,138,138,138,138,138,138,138,137,137,137,137, 137,137,137,137,137,137,136,136,136,136,136,136,136,136,136,135, 135,135,135,135,135,135,135,135,135,135,135,135,134,134,134,134, 134,134,133,133,133,133,133,133,133,133,132,132,132,132,132,132, 132,132,132,132,132,132,132,131,131,131,131,131,131,131,130,130, 130,130,130,130,130,129,129,129,129,129,129,129,128,128,128,128, 128,128,128,128,128,128,127,127,127,127,127,127,127,127,127,126, 126,126,126,126,126,126,126,126,126,126,125,125,125,125,125,125, 125,125,124,124,124,124,124,124,124,124,124,124,123,123,123,123, 123,123,123,123,123,123,122,122,122,122,122,122,121,121,121,121, 121,121,121,120,120,120,120,120,120,120,120,120,120,119,119,119, 119,119,119,119,119,118,118,118,118,118,118,118,118,118,117,117, 117,117,117,117,117,117,117,117,117,116,116,116,116,116,116,116, 116,116,116,116,116,116,115,115,115,115,115,115,115,115,115,114, 114,114,114,114 }; const int n4w3b1r5[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 168,168,168,168,168,168,168,168,167,167,167,167,167,167,167,167, 167,167,167,166,166,166,166,166,166,166,166,166,166,165,165,165, 165,165,165,165,165,165,165,165,165,165,165,164,164,164,164,164, 164,164,164,164,163,163,163,163,163,163,163,163,163,163,163,162, 162,162,162,162,162,162,162,161,161,161,161,161,161,161,161,160, 160,160,160,160,160,160,160,160,160,159,159,159,159,159,159,159, 159,159,159,159,159,158,158,158,158,158,158,158,158,158,157,157, 157,157,157,157,157,157,157,157,157,157,156,156,156,156,156,155, 155,155,155,155,155,155,155,155,155,154,154,154,154,154,154,153, 153,153,153,153,153,153,153,153,152,152,152,152,152,152,152,152, 151,151,151,151,151,151,151,151,151,151,151,151,151,150,150,150, 150,150,149,149,149,149,148,148,148,148,147,147,147,147,147,147, 147,147,147,146,146,146,146,146,146,146,146,146,146,145,145,145, 145,145,145,145,145,145,144,144,144,144,144,144,144,144,144,144, 144,144,144,144,143,143,143,143,143,143,143,142,142,142,142,142, 142,142,142,142,141,141,141,141,141,141,141,141,141,141,140,140, 140,140,140,140,140,139,139,139,139,139,139,139,139,139,139,139, 138,138,138,138,138,138,137,137,137,137,137,137,136,136,136,136, 136,136,136,136,136,136,136,135,135,135,135,135,135,135,135,135, 135,135,135,135,135,134,134,134,134,134,134,134,133,133,133,133, 133,133,133,133,133,133,133,133,133,132,132,132,132,132,132,132, 131,131,131,131,131,131,131,131,131,131,130,130,130,130,130,130, 129,129,129,129,129,129,129,129,129,129,129,129,129,128,128,128, 128,128,128,128,128,128,127,127,127,127,127,127,126,126,126,126, 126,126,126,126,126,126,126,126,125,125,125,125,125,125,125,125, 125,125,125,124,124,124,124,124,124,123,123,123,123,123,123,123, 123,123,123,123,122,122,122,122,122,122,122,122,122,121,121,121, 121,121,121,121,121,121,121,121,121,121,121,120,120,120,120,120, 120,120,120,120,120,119,119,119,119,119,119,119,119,118,118,118, 118,118,118,118,118,118,117,117,117,117,117,117,117,117,117,117, 116,116,116,116,115,115,115,115,114,114,114,114,114,114,114,114, 114,114,114,114 }; const int n4w3b1r6[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 168,168,168,168,168,168,168,168,167,167,167,167,167,167,167,167, 167,167,166,166,166,166,166,165,165,165,165,165,165,165,165,165, 164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,163, 163,163,163,163,163,163,163,162,162,162,162,162,161,161,161,161, 161,161,161,161,161,161,161,161,161,160,160,160,160,160,159,159, 159,158,158,158,158,158,158,158,158,157,157,157,157,157,157,157, 157,156,156,156,156,156,156,156,155,155,155,155,155,155,155,155, 155,155,155,155,155,155,154,154,154,154,153,153,153,153,153,153, 153,153,153,152,152,152,152,152,152,152,152,152,152,152,152,152, 152,152,152,151,151,151,151,151,151,151,151,150,150,150,150,150, 150,150,150,150,149,149,149,149,149,149,149,149,149,148,148,148, 148,148,148,148,148,148,148,147,147,147,147,147,147,147,147,147, 146,146,146,146,146,146,146,146,146,146,146,145,145,145,145,145, 145,145,145,145,144,144,144,144,144,144,144,144,144,143,143,143, 143,143,143,143,143,143,143,143,142,142,142,142,142,142,142,142, 142,142,141,141,141,141,140,140,140,140,140,140,140,140,139,139, 139,139,139,139,139,138,138,138,138,138,138,137,137,137,137,137, 137,137,137,137,136,136,136,136,136,136,135,135,135,135,135,135, 135,135,135,135,134,134,134,134,134,134,134,134,134,134,134,133, 133,133,133,133,133,133,133,133,132,132,132,132,132,132,131,131, 131,131,131,131,131,131,131,131,131,131,130,130,130,130,130,130, 130,129,129,129,129,129,129,129,129,129,129,129,128,128,128,128, 128,128,128,128,128,128,128,128,128,128,127,127,127,127,127,127, 127,127,127,127,127,126,126,126,126,126,126,126,126,126,126,126, 126,126,126,126,125,125,125,125,125,125,125,125,125,125,125,125, 124,124,124,124,124,124,124,124,123,123,123,123,123,123,123,123, 123,123,123,123,123,123,123,122,122,122,122,122,122,122,122,122, 122,121,121,121,121,121,121,120,120,120,120,120,120,120,119,119, 119,119,119,119,119,119,118,118,118,118,118,118,117,117,117,117, 117,117,117,117,117,117,117,116,116,116,116,116,116,116,116,116, 116,115,115,115,115,115,115,115,115,115,114,114,114,114,114,114, 114,114,114,114 }; const int n4w3b1r7[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 168,168,168,168,168,168,168,168,168,168,168,167,167,167,167,167, 167,167,167,166,166,166,166,166,166,166,166,166,166,166,166,166, 166,165,165,165,165,165,165,165,165,165,164,164,164,164,164,164, 164,163,163,163,163,163,163,163,163,163,163,163,163,162,162,162, 162,162,162,162,162,161,161,161,161,161,161,161,161,161,161,161, 161,160,160,160,160,160,160,160,159,159,159,159,159,159,159,159, 158,158,158,158,158,158,158,157,157,157,157,157,156,156,156,156, 156,156,156,155,155,155,155,155,155,154,154,154,154,154,154,154, 154,154,154,153,153,153,153,153,153,153,153,153,153,153,153,153, 152,152,152,152,152,152,152,152,151,151,151,151,151,151,151,151, 151,151,151,150,150,150,150,150,150,150,150,150,149,149,149,149, 149,149,149,149,149,149,148,148,148,148,148,148,148,148,148,148, 148,148,147,147,147,147,147,147,147,146,146,146,146,146,146,146, 146,146,145,145,145,145,145,145,145,145,144,144,144,144,144,144, 144,143,143,143,143,143,143,143,143,143,143,143,143,142,142,142, 142,142,142,142,141,141,141,141,141,141,141,140,140,140,140,140, 140,140,140,140,139,139,139,139,139,139,139,138,138,138,138,138, 138,137,137,137,137,137,137,137,136,136,136,136,136,135,135,135, 135,134,134,134,134,134,134,134,134,134,133,133,133,133,133,133, 133,133,133,133,133,133,133,132,132,132,132,132,132,132,131,131, 131,131,131,131,130,130,130,130,130,130,130,130,130,129,129,129, 129,129,129,128,128,128,128,128,128,128,128,128,127,127,127,127, 127,127,127,127,127,127,127,127,127,126,126,126,126,126,126,125, 125,125,125,125,125,125,125,125,125,124,124,124,124,124,124,124, 124,124,123,123,123,123,123,123,123,122,122,122,122,122,122,122, 122,122,122,121,121,121,121,121,121,121,121,121,121,121,121,120, 120,120,120,120,120,120,120,120,119,119,119,119,119,119,119,119, 119,119,119,118,118,118,118,118,118,118,118,118,118,118,118,118, 118,118,117,117,117,117,117,117,117,117,117,116,116,116,116,116, 116,116,116,116,116,116,116,116,116,116,115,115,115,115,115,115, 115,115,115,115,115,115,114,114,114,114,114,114,114,114,114,114, 114,114,114,114 }; const int n4w3b1r8[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 168,168,168,168,168,168,167,167,167,167,167,167,167,167,167,167, 167,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166, 165,165,165,165,165,165,165,165,165,164,164,164,164,164,164,164, 164,164,163,163,163,163,163,163,163,163,163,163,162,162,162,162, 162,162,162,161,161,161,161,160,159,159,159,159,159,159,159,159, 159,159,158,158,158,158,158,158,158,158,157,157,157,157,157,156, 156,156,156,156,156,156,155,155,155,155,155,155,155,155,155,154, 154,154,154,154,154,154,154,154,154,154,154,153,153,153,153,153, 153,153,152,152,152,152,152,152,152,152,152,151,151,151,151,151, 151,151,151,151,150,150,150,150,150,150,150,150,150,150,149,149, 149,149,149,149,149,149,149,149,148,148,148,148,148,148,148,148, 148,148,148,148,148,148,147,147,147,147,147,147,147,147,146,146, 146,146,146,146,146,146,146,146,146,146,145,145,145,145,145,145, 145,145,145,144,144,144,144,144,144,144,143,143,143,143,143,143, 143,143,142,142,142,142,142,142,142,142,142,142,142,141,141,141, 141,141,141,141,141,141,140,140,140,140,140,140,140,140,140,140, 140,139,139,139,139,139,139,138,138,138,138,138,138,138,138,138, 138,138,138,137,137,137,137,137,137,137,137,137,137,137,136,136, 136,136,136,136,136,136,136,135,135,135,135,135,135,135,135,135, 135,135,135,135,135,134,134,134,134,133,133,133,133,133,133,133, 133,133,132,132,132,132,132,132,132,132,132,132,132,131,131,131, 131,130,130,130,130,130,130,130,130,130,129,129,129,129,129,129, 129,129,129,129,129,128,128,128,128,128,128,128,128,127,127,127, 127,127,127,127,127,127,127,127,127,126,126,126,126,126,126,126, 126,126,125,125,125,125,125,125,125,124,124,124,124,124,124,124, 123,123,123,123,123,123,123,123,122,122,122,122,122,122,122,122, 122,122,121,121,121,121,121,121,121,121,120,120,120,120,120,120, 120,119,119,119,119,119,119,119,119,119,119,119,119,118,118,118, 118,118,118,118,118,118,118,118,117,117,117,117,117,117,117,117, 117,117,117,117,117,116,116,116,116,116,116,116,116,116,116,116, 116,116,116,116,116,115,115,115,115,115,115,115,115,114,114,114, 114,114,114,114 }; const int n4w3b1r9[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 168,168,168,168,168,168,168,168,168,167,167,167,167,167,167,167, 167,167,167,166,166,166,166,166,166,166,166,165,165,165,165,165, 165,165,165,165,165,165,165,165,165,164,164,164,164,164,164,164, 164,163,163,163,163,163,163,162,162,162,162,162,162,162,162,162, 162,162,161,161,161,161,161,161,161,161,161,161,161,161,161,160, 160,160,160,160,160,160,160,160,160,160,159,159,159,159,159,159, 159,159,158,158,158,158,158,158,158,158,158,158,158,158,158,157, 157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157, 157,157,156,156,156,156,156,156,156,155,155,155,155,155,155,155, 155,154,154,154,154,154,153,153,153,152,152,152,152,152,152,152, 152,152,152,152,152,151,151,151,151,151,151,151,151,151,151,151, 150,150,150,150,150,150,150,150,150,150,150,150,149,149,149,149, 149,149,149,149,148,148,148,148,148,148,148,147,147,147,147,147, 147,147,147,146,146,146,146,146,146,146,146,146,146,146,146,146, 145,145,145,145,145,145,145,145,145,145,145,145,144,144,144,144, 144,144,144,144,144,144,144,144,143,143,143,143,143,143,143,142, 142,142,142,142,142,142,142,142,141,141,141,141,141,140,140,140, 140,140,140,140,140,140,139,139,139,139,139,139,139,138,138,138, 138,138,138,138,137,137,137,137,137,137,137,137,136,136,136,136, 136,136,136,136,136,136,135,135,135,135,135,135,135,135,134,134, 134,134,134,134,134,133,133,133,133,133,133,133,133,133,132,132, 132,132,132,132,132,132,132,132,132,132,131,131,131,131,131,131, 131,131,131,131,130,130,130,130,130,130,129,129,129,129,129,129, 129,129,129,129,129,128,128,128,128,128,128,128,128,128,127,127, 127,127,127,127,127,126,126,126,126,126,126,126,126,126,125,125, 125,125,125,125,125,125,125,125,125,124,124,124,124,124,124,124, 124,124,123,123,123,123,123,122,122,122,122,122,122,121,121,121, 121,121,121,121,121,121,120,120,120,120,120,120,120,120,120,119, 119,119,119,119,119,119,119,119,119,119,118,118,118,118,118,118, 118,118,118,118,117,117,117,117,117,117,117,117,116,116,116,116, 116,116,116,115,115,115,115,115,115,115,115,114,114,114,114,114, 114,114,114,114 }; const int n4w3b2r0[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 210,210,210,209,209,209,209,208,208,208,208,207,207,206,206,206, 206,205,205,205,205,205,205,204,204,202,201,201,201,201,200,200, 200,200,200,200,199,199,199,199,199,199,198,198,197,197,197,197, 197,197,197,197,197,197,196,196,196,196,196,195,195,195,195,195, 195,195,194,194,194,193,192,192,191,191,191,190,190,190,190,189, 189,189,189,188,188,187,187,187,186,186,186,185,185,185,185,185, 185,184,184,183,183,183,183,183,183,182,182,182,182,181,181,181, 180,180,180,179,179,179,179,179,178,178,178,178,177,176,176,176, 176,175,175,175,174,174,174,174,173,173,172,172,172,172,171,171, 171,171,170,170,170,169,169,169,168,168,168,168,168,168,168,168, 167,166,166,165,165,164,164,164,164,164,163,163,163,162,162,162, 161,161,161,161,161,161,160,160,159,159,159,159,159,159,158,158, 158,158,157,157,156,156,156,156,155,155,155,155,154,154,154,154, 154,154,154,153,153,153,153,152,152,152,151,151,151,151,150,150, 150,150,149,149,148,148,148,148,148,148,148,148,148,148,148,147, 147,147,146,145,145,144,144,144,144,144,144,143,143,143,143,142, 142,142,142,142,141,141,141,141,141,140,140,140,139,139,139,139, 138,138,137,137,136,136,136,136,135,134,134,134,134,134,133,133, 132,131,131,131,130,130,130,130,130,129,129,128,128,127,127,126, 126,126,126,126,126,126,125,125,125,123,123,123,123,123,122,122, 122,121,121,121,121,119,119,119,119,119,119,118,117,116,116,116, 116,116,115,115,115,114,114,114,114,113,113,113,113,113,113,113, 113,112,111,111,111,111,111,110,110,110,109,109,109,108,108,108, 107,107,107,106,106,106,105,105,105,104,104,104,104,103,103,102, 101,101,101,101,101,101,99,99,99,99,99,98,98,98,98,98,98,97,97, 97,96,96,96,95,95,95,95,95,94,94,94,94,94,94,93,93,93,93,92,92, 92,91,91,91,91,90,90,89,89,89,88,88,88,88,88,87,87,87,86,86,86, 86,85,85,85,84,84,84,83,83,82,82,81,81,81,81,81,80,80,80,80,80, 80,79,79,79,78,78,78,78,78,78,78,78,77,76,76,76,75,75,75,74,74, 74,73,73,73,73,73,73,73,73,72,72,72,72 }; const int n4w3b2r1[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 210,209,208,208,208,207,207,206,206,205,205,205,204,204,204,203, 203,202,202,202,201,201,200,200,200,199,199,199,198,198,198,197, 197,197,196,196,196,196,195,195,195,195,194,193,193,193,193,192, 192,192,192,192,192,191,191,191,191,191,191,190,190,189,189,188, 188,188,187,187,187,187,187,187,186,186,186,186,186,186,185,185, 184,184,184,183,182,182,182,182,182,182,182,181,181,181,181,180, 180,179,179,179,179,178,178,178,178,178,177,177,177,177,176,176, 176,176,175,175,174,174,174,174,174,174,173,173,173,173,172,171, 171,171,171,171,170,170,170,170,170,169,169,169,169,169,168,168, 168,168,168,168,168,167,167,166,166,166,165,165,165,164,164,164, 163,163,163,163,162,162,161,161,161,160,159,159,159,159,158,158, 158,158,158,157,157,156,156,156,156,156,156,156,156,155,155,155, 155,155,154,154,154,154,153,153,153,153,153,152,152,152,152,152, 151,151,151,150,150,150,150,148,148,147,147,147,147,147,147,147, 147,146,146,146,145,145,145,145,145,145,144,144,144,144,143,143, 143,143,143,142,142,142,142,142,142,142,142,141,141,141,140,140, 139,139,139,137,137,137,137,137,137,136,136,136,136,136,136,135, 135,135,135,135,135,134,134,134,134,133,133,133,133,133,132,132, 131,131,131,131,130,130,129,129,129,129,129,128,128,128,128,127, 127,127,127,127,127,126,126,125,125,125,125,125,125,124,124,124, 123,123,122,122,121,121,121,121,120,120,120,120,120,119,119,119, 119,118,117,117,117,117,117,117,116,116,115,115,114,114,114,114, 114,113,113,113,113,113,112,112,112,112,112,111,111,110,110,110, 110,109,109,108,108,108,106,106,106,106,105,105,105,105,104,104, 104,104,103,103,103,103,103,103,103,102,102,102,100,100,100,100, 100,99,99,99,98,98,98,98,97,97,97,96,96,96,96,95,95,95,94,94, 94,94,94,94,94,93,93,93,92,92,92,92,92,92,92,91,91,91,90,90,90, 90,89,89,89,89,89,88,88,88,87,87,87,87,86,86,86,86,86,86,85,85, 84,84,84,83,83,83,82,82,81,81,80,80,80,79,79,79,78,78,78,77,77, 77,77,77,76,76,75,75,75,75,74,74,74,73,73,73,72,72 }; const int n4w3b2r2[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 210,210,210,209,209,208,208,208,208,208,207,207,206,206,205,204, 203,203,203,202,202,202,202,202,202,202,201,200,200,200,200,199, 199,199,198,198,198,198,197,197,197,197,197,197,197,196,196,196, 196,196,196,196,195,195,195,195,195,195,195,195,194,192,192,192, 192,191,191,190,190,190,190,190,190,189,189,189,189,189,188,188, 188,187,187,186,186,186,185,185,185,185,185,185,185,185,185,184, 183,183,183,183,182,182,182,181,181,181,181,180,180,180,179,179, 179,179,179,179,178,178,177,177,176,176,176,175,175,175,175,174, 174,174,174,173,173,172,172,172,172,172,172,172,171,171,171,171, 171,170,170,170,170,170,169,169,169,169,169,168,168,168,168,167, 167,167,167,167,166,166,166,166,165,165,165,165,164,164,164,163, 163,163,163,162,162,162,162,162,161,161,161,161,160,160,160,160, 159,159,159,158,158,158,157,156,155,155,155,154,154,154,154,154, 153,153,153,153,153,153,152,152,151,151,150,150,150,150,150,149, 149,149,149,148,148,148,148,148,147,146,146,145,144,144,144,144, 143,143,142,142,142,141,141,141,140,140,140,140,140,140,139,139, 139,139,138,138,138,137,137,136,136,136,135,135,135,135,135,135, 135,135,134,134,134,133,133,133,133,133,133,133,132,132,132,132, 132,132,131,131,131,131,130,130,129,128,128,128,127,127,127,127, 127,126,126,126,125,125,125,124,124,124,124,123,123,123,123,122, 122,121,121,121,121,120,119,118,118,118,117,117,117,116,116,116, 116,116,115,115,115,115,114,114,113,113,113,112,112,112,112,111, 111,111,111,111,111,110,110,110,110,109,109,108,108,107,107,107, 107,106,105,105,105,105,105,105,105,104,104,104,104,104,103,103, 102,102,101,101,100,100,100,100,100,98,98,98,98,98,98,98,98,97, 97,97,97,97,97,96,96,96,96,95,95,95,95,94,94,94,94,93,93,92,92, 91,91,91,91,91,90,90,89,89,89,89,89,88,88,87,87,86,86,86,85,84, 84,84,84,84,83,83,83,83,83,83,83,83,82,81,81,81,81,81,81,81,81, 80,80,79,79,79,79,79,79,78,78,78,78,78,78,77,76,76,76,75,75,75, 74,74,74,74,74,74,73,73,73,73,73,73,73,72 }; const int n4w3b2r3[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 210,210,209,209,209,209,209,209,208,208,208,207,206,206,206,206, 206,206,205,205,205,205,204,204,204,204,204,204,203,203,203,203, 202,202,202,202,202,201,201,201,201,201,200,200,200,200,199,199, 199,199,199,199,199,198,198,197,197,197,197,196,196,196,196,195, 195,195,195,194,192,192,192,192,191,191,190,190,189,189,189,188, 188,188,188,188,188,187,186,186,185,185,185,185,184,183,183,183, 183,183,183,183,183,183,182,182,181,181,180,180,180,179,179,179, 179,179,179,179,178,178,178,177,177,177,176,176,176,176,176,175, 175,175,174,174,173,173,173,173,173,173,173,172,172,172,172,171, 171,171,170,170,170,168,168,168,168,168,168,167,167,166,166,166, 166,165,165,165,163,163,163,162,162,162,161,161,161,160,160,160, 160,160,159,159,159,159,159,159,159,158,158,158,157,157,157,156, 156,156,156,155,155,155,154,154,154,154,154,154,153,153,153,152, 151,151,151,151,151,150,150,150,149,149,149,149,149,148,148,147, 147,147,146,146,146,146,145,145,145,145,145,144,144,144,144,143, 143,143,142,141,141,141,141,141,141,141,140,140,139,139,139,139, 138,138,138,137,137,137,136,136,136,136,136,135,134,133,132,132, 132,132,132,132,131,131,131,130,130,130,130,130,130,130,129,129, 129,129,129,129,129,129,128,128,128,128,128,127,127,126,126,125, 125,125,125,125,124,124,124,124,124,123,123,122,122,121,121,120, 120,120,119,119,119,118,118,118,118,118,117,117,117,117,117,117, 116,115,115,115,115,114,114,114,113,113,113,113,112,112,112,112, 111,111,111,111,110,110,110,110,110,110,109,109,109,109,108,108, 108,108,108,107,107,107,106,106,106,106,106,106,106,105,104,104, 103,103,103,102,102,102,102,101,101,101,101,100,100,100,100,99, 99,99,99,98,98,98,98,97,96,95,95,95,95,95,95,94,94,94,94,93,93, 92,92,92,91,91,91,91,91,91,91,91,91,91,90,90,89,89,89,89,89,88, 88,88,88,88,88,88,88,88,87,87,87,86,85,85,85,85,85,84,84,84,83, 83,83,82,82,82,82,81,81,80,80,80,79,79,79,79,78,77,77,77,76,76, 76,76,76,76,75,75,74,74,74,74,73,73,73,72,72,72 }; const int n4w3b2r4[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 210,210,210,210,209,209,209,209,208,208,207,207,207,207,207,207, 206,206,206,206,206,206,206,206,206,205,205,204,204,203,203,203, 203,202,202,202,201,200,200,200,200,200,200,199,199,199,198,198, 198,198,198,198,197,197,197,197,197,197,197,196,196,196,195,195, 194,194,194,194,194,193,192,192,192,192,192,191,191,190,190,189, 189,188,188,187,187,187,187,187,187,186,186,186,186,185,185,185, 185,185,184,184,184,184,184,183,183,183,183,183,183,183,183,182, 182,182,182,181,181,181,181,180,180,180,179,179,179,179,179,178, 178,178,178,178,178,178,177,177,176,176,175,175,175,175,175,174, 174,173,173,173,173,173,173,172,172,172,172,172,172,171,171,171, 171,171,170,170,169,169,169,169,169,169,169,169,169,168,168,167, 167,166,166,166,166,165,165,165,165,165,164,164,164,164,164,164, 164,164,164,164,163,163,163,162,162,162,161,161,161,161,160,160, 160,160,160,160,159,159,158,158,158,157,157,156,156,156,155,155, 154,153,153,152,152,152,152,152,151,151,151,151,151,151,151,151, 150,150,150,150,150,149,149,149,148,147,147,147,147,147,147,146, 145,145,145,145,144,144,143,142,141,141,141,140,140,140,140,139, 139,139,139,139,138,138,137,136,134,134,134,134,134,132,132,132, 132,132,132,132,131,131,131,131,131,131,131,131,130,130,130,129, 129,129,129,129,128,128,128,128,127,127,127,127,127,126,126,126, 125,125,125,124,124,124,123,123,123,122,122,122,122,122,122,121, 121,121,121,120,120,119,119,119,119,118,118,118,117,117,117,117, 117,116,116,116,114,114,114,114,114,114,113,113,113,112,112,112, 112,112,112,112,111,111,111,111,110,110,110,109,109,109,109,109, 107,107,107,107,107,107,107,106,106,106,105,105,105,105,105,103, 102,102,102,102,102,101,100,99,99,99,98,98,97,97,97,97,96,96, 96,96,96,96,96,96,95,95,95,94,94,94,93,93,93,93,93,93,93,93,92, 92,92,92,92,91,91,91,91,90,90,90,88,88,87,87,86,86,86,85,85,85, 84,84,84,84,83,83,83,83,83,83,83,82,82,82,82,81,81,80,80,80,80, 79,79,78,78,78,76,76,76,76,75,75,75,74,74,73,73,72,72,72 }; const int n4w3b2r5[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 210,210,210,210,210,210,210,209,209,209,209,208,208,208,208,207, 207,207,207,207,207,207,206,206,206,206,205,205,204,204,203,203, 203,203,203,202,201,201,201,201,201,200,200,200,199,199,199,199, 199,198,198,198,197,197,197,197,196,196,196,195,195,195,195,195, 195,195,195,194,194,194,193,193,193,193,193,192,192,191,190,190, 190,189,189,189,189,189,189,189,188,186,186,186,186,186,185,184, 183,183,183,183,183,182,182,182,182,182,182,182,182,182,181,181, 181,181,180,180,180,180,180,180,179,179,179,178,178,177,177,177, 177,177,177,177,176,176,175,175,175,175,175,174,174,174,174,174, 174,173,173,173,173,172,172,172,172,172,172,172,172,171,170,170, 170,169,169,169,168,168,168,168,168,167,167,167,167,167,166,166, 165,165,165,165,164,164,164,164,164,164,164,163,162,161,161,161, 161,161,160,160,160,160,159,159,158,158,157,157,156,156,156,155, 155,155,155,154,153,153,153,152,152,151,151,151,151,151,150,150, 150,149,149,149,149,149,149,148,148,148,148,148,147,147,147,146, 146,146,145,145,145,143,143,143,142,142,141,141,141,140,140,140, 140,140,140,139,139,139,138,138,138,138,138,137,137,137,136,136, 136,135,135,135,134,134,134,133,133,133,132,132,132,131,131,129, 129,128,128,128,128,127,127,127,126,126,126,125,125,125,125,125, 125,124,124,124,124,124,123,123,123,123,123,122,122,122,121,121, 120,120,120,120,119,119,118,118,118,118,118,117,117,117,116,116, 116,115,115,115,114,114,114,114,113,112,112,112,112,112,112,112, 111,111,111,111,111,110,110,110,110,110,109,109,109,109,109,108, 108,108,108,108,108,108,107,107,107,107,106,106,106,106,106,106, 104,104,104,103,103,103,102,102,102,102,102,101,100,100,100,99, 99,99,99,99,99,98,98,97,97,97,97,97,97,97,97,96,96,95,95,95,95, 94,94,94,94,94,93,93,93,93,92,92,92,91,91,91,91,91,91,91,90,89, 89,88,88,87,87,87,87,87,86,86,85,85,85,84,83,83,83,83,83,82,82, 82,82,81,80,80,80,80,80,79,79,79,79,78,78,78,78,78,77,77,76,76, 75,75,75,75,75,75,74,74,74,73,73,73,73,73,72,72 }; const int n4w3b2r6[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 210,210,210,209,209,209,209,208,208,207,207,206,206,206,205,205, 204,204,204,204,202,202,202,202,202,201,201,200,200,200,200,200, 199,199,199,198,198,197,197,197,197,197,197,197,196,194,194,193, 193,193,193,193,192,192,192,192,191,191,191,190,190,190,190,190, 190,190,189,188,188,188,188,188,187,187,187,187,187,187,186,186, 186,186,185,185,185,184,184,183,183,183,183,183,182,182,182,181, 181,181,180,180,180,180,179,179,179,179,178,178,178,177,177,177, 176,176,176,175,175,175,175,174,174,174,174,173,173,173,173,173, 171,171,171,170,170,169,169,169,169,169,168,167,167,167,167,167, 167,167,166,166,166,166,166,166,166,166,166,165,165,165,165,164, 164,164,164,163,163,162,162,162,161,161,161,161,161,161,161,161, 160,160,160,160,159,159,159,158,158,157,156,156,156,156,156,156, 155,155,155,154,154,154,154,154,153,153,153,153,153,153,153,153, 152,152,152,152,152,152,152,152,151,151,150,150,149,149,149,148, 148,148,147,147,146,146,146,146,146,145,145,145,145,145,145,145, 144,144,144,144,144,143,143,143,143,142,142,141,141,141,141,141, 141,140,140,140,140,140,140,139,139,139,139,139,139,139,138,138, 138,138,138,138,138,138,138,137,137,137,136,136,135,135,135,135, 134,134,134,134,133,133,133,133,132,132,132,132,132,132,132,131, 131,130,130,129,129,129,128,127,127,126,126,124,124,124,123,123, 123,122,122,122,121,121,121,120,120,120,119,119,119,119,119,118, 118,118,117,117,117,117,116,116,116,115,115,114,114,114,114,114, 114,114,114,114,113,113,113,112,112,111,111,111,111,111,110,110, 110,110,109,109,109,108,108,108,107,106,106,106,105,105,105,103, 103,102,100,100,100,99,99,99,98,98,98,97,97,96,96,96,96,95,95, 95,95,95,95,95,95,95,95,95,94,94,94,93,93,93,93,92,92,92,92,92, 92,92,92,91,91,91,91,91,90,90,90,90,90,90,90,89,89,89,88,88,87, 87,87,87,87,86,86,86,86,86,86,85,85,85,85,85,85,84,84,84,83,83, 83,82,82,82,82,82,80,80,80,79,79,79,78,78,78,78,77,77,77,76,76, 75,75,75,75,74,74,74,74,74,74,74,74,73 }; const int n4w3b2r7[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 210,210,210,209,209,209,209,208,208,208,207,207,206,206,206,206, 206,205,205,205,205,205,205,205,205,204,204,204,204,203,203,202, 202,202,202,202,202,201,201,201,201,201,200,199,199,199,198,198, 198,198,198,197,197,197,196,196,196,196,196,195,195,195,195,194, 194,193,193,193,193,193,193,192,191,191,191,191,190,190,190,189, 189,189,189,189,189,188,188,188,188,187,187,187,187,187,187,186, 186,186,186,185,185,185,184,184,184,184,184,184,183,183,182,182, 182,182,182,181,181,180,180,180,180,179,179,179,179,177,177,177, 177,177,177,177,176,176,176,175,175,174,173,173,173,173,173,172, 171,171,171,171,171,171,171,171,171,170,169,169,169,169,169,168, 167,167,167,167,166,166,166,166,166,166,165,165,164,164,163,163, 163,163,162,162,162,161,161,161,161,161,161,160,160,158,158,157, 157,157,157,157,157,156,156,156,155,155,155,155,155,154,154,153, 152,152,152,152,151,151,150,149,149,148,148,147,146,146,146,145, 145,145,144,144,144,143,143,143,143,142,141,141,141,141,141,140, 140,140,140,139,139,139,138,138,138,137,137,137,137,137,137,136, 136,135,135,134,134,133,133,132,131,131,131,131,130,130,130,130, 130,129,129,129,128,128,127,127,127,127,126,125,125,125,124,124, 124,123,123,123,122,122,122,121,121,121,121,120,120,120,120,120, 119,119,119,119,118,118,118,118,117,117,117,117,116,116,116,116, 116,115,115,115,114,114,114,114,114,113,113,113,113,113,112,112, 111,111,111,111,111,111,110,110,110,110,110,109,109,109,108,108, 108,107,107,107,107,107,107,107,106,106,106,106,106,106,105,105, 105,105,105,105,105,104,104,103,103,103,103,103,102,102,101,101, 101,101,100,100,100,100,100,100,99,99,99,99,99,98,98,98,98,97, 96,96,96,96,95,95,95,94,94,94,94,94,94,93,93,93,93,93,93,93,92, 92,92,91,91,91,91,90,88,88,88,88,87,87,86,86,86,85,85,85,85,84, 84,84,84,83,83,83,83,83,82,82,82,82,82,82,81,81,81,80,79,79,78, 78,78,77,77,77,76,76,76,76,76,76,76,75,75,75,75,75,75,75,74,74, 74,74,74,73,73,73,73,72,72,72,72,72,72,72 }; const int n4w3b2r8[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 210,210,210,210,209,209,208,208,208,208,208,207,207,207,207,206, 206,205,205,205,205,205,205,204,204,204,204,203,203,203,202,202, 201,201,201,201,201,200,200,200,200,199,199,199,199,199,199,199, 198,198,198,198,198,197,197,197,197,197,197,196,196,196,196,196, 195,195,195,194,194,194,193,193,192,192,192,192,192,191,191,191, 190,190,189,189,189,189,188,188,188,187,187,187,187,186,186,186, 186,185,185,185,185,184,184,184,184,184,184,183,183,182,182,181, 181,181,181,180,180,180,180,179,179,179,178,178,178,178,178,177, 176,176,175,175,175,174,173,173,173,172,172,171,171,170,170,170, 170,169,169,169,169,169,168,168,167,167,167,167,167,167,166,166, 166,166,166,165,164,164,164,163,163,163,162,162,161,161,160,160, 160,160,160,160,159,159,159,158,158,158,158,158,158,157,157,156, 156,155,155,155,155,154,153,153,153,153,152,152,152,152,152,152, 152,151,151,151,151,150,150,150,150,150,149,149,149,149,149,149, 148,148,148,148,147,147,147,146,146,145,144,144,144,144,144,144, 144,144,144,144,143,143,143,143,142,142,141,141,141,141,141,141, 140,140,140,139,139,139,139,139,139,139,139,138,138,137,137,137, 137,137,137,136,136,136,136,135,135,135,135,135,134,134,134,134, 134,133,133,132,132,131,131,131,131,130,130,130,129,128,128,128, 127,126,126,126,126,126,126,125,125,125,125,125,124,124,123,123, 123,123,123,123,123,123,122,122,122,122,121,121,121,121,120,120, 120,120,120,120,120,120,119,119,119,119,119,118,118,118,117,116, 116,116,116,116,115,115,114,114,114,114,113,113,113,113,113,112, 112,112,112,111,111,111,110,110,109,109,109,109,108,107,107,107, 107,106,106,106,106,105,104,104,104,104,104,103,103,103,103,103, 103,102,102,102,102,102,101,101,101,100,100,100,99,99,99,98,98, 98,98,97,97,96,96,96,96,96,96,96,94,94,94,94,93,93,92,92,92,91, 91,91,91,91,90,90,89,89,89,89,88,88,87,87,86,86,86,86,86,86,85, 85,85,85,85,84,84,83,83,83,82,82,81,80,79,79,79,78,78,78,78,78, 78,77,77,76,76,76,75,75,74,74,74,74,74,74,73,72,72,72,72,72 }; const int n4w3b2r9[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 210,209,209,209,209,208,208,208,208,208,207,206,206,206,205,205, 205,204,204,204,203,203,203,203,202,202,202,202,202,202,201,201, 200,200,200,199,199,198,198,198,198,197,196,196,195,195,195,194, 194,194,194,194,193,193,193,193,193,193,193,192,191,191,191,190, 190,190,189,189,189,189,189,189,189,189,188,188,188,188,187,187, 187,187,187,187,187,187,186,186,186,185,185,185,185,185,184,184, 184,183,183,183,183,181,181,180,180,180,179,179,178,178,178,177, 177,177,176,176,175,175,175,175,175,175,174,174,174,174,174,174, 174,173,173,173,172,172,172,171,171,171,171,171,171,171,170,170, 170,169,169,169,169,169,169,169,168,168,168,167,167,167,167,166, 166,166,166,165,165,165,165,163,163,162,161,161,161,160,159,159, 158,158,158,158,158,158,157,157,157,157,157,157,156,156,156,156, 154,154,154,154,153,153,153,153,153,152,152,152,152,151,150,150, 150,150,150,149,149,149,149,149,149,148,148,148,148,147,147,147, 147,147,147,147,147,146,146,146,145,145,145,145,145,145,145,144, 144,144,144,144,144,143,143,142,142,142,142,142,141,140,139,139, 139,139,139,138,138,138,137,137,136,136,136,135,135,135,135,134, 134,133,133,132,132,132,132,131,131,131,131,131,130,129,128,128, 128,128,128,127,127,127,127,127,125,125,124,124,124,123,123,122, 122,122,122,122,122,121,121,121,121,121,120,120,120,120,119,119, 118,118,118,118,117,117,116,116,116,116,115,115,115,114,114,113, 113,113,113,113,113,112,112,112,112,111,111,111,110,110,109,109, 109,109,108,108,108,108,108,107,107,107,107,107,106,106,106,106, 106,105,105,104,104,104,104,104,103,103,103,102,102,102,102,101, 101,100,100,100,100,99,99,99,99,98,98,98,98,98,97,97,97,96,96, 96,96,96,95,95,95,95,94,94,94,93,93,93,93,92,92,92,92,92,91,91, 90,90,90,90,89,89,89,89,88,88,87,87,87,86,86,86,86,86,86,85,85, 84,84,84,84,83,83,83,83,83,83,82,82,82,82,82,81,81,80,80,80,80, 80,79,79,79,79,78,78,78,78,78,78,77,77,77,77,76,76,76,75,75,75, 75,74,74,74,74,74,73,73,73,72,72,72,72 }; const int n4w3b3r0[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 266,266,266,266,265,263,263,261,261,261,260,260,260,260,259,259, 259,258,257,257,257,257,256,256,256,255,255,254,253,253,253,253, 253,252,252,251,250,249,249,249,249,247,247,246,246,245,245,244, 244,244,243,242,242,240,240,240,239,239,239,239,238,237,237,237, 236,236,236,235,235,234,234,234,234,234,233,233,233,232,232,232, 230,230,229,229,227,227,227,227,226,226,226,226,224,224,224,224, 223,223,223,223,223,222,222,221,221,220,219,219,219,218,218,218, 217,217,217,216,216,216,215,214,214,214,213,213,211,210,210,209, 209,209,208,208,207,206,206,206,205,205,203,203,203,203,202,202, 201,201,200,199,199,199,197,197,197,196,195,195,193,192,192,192, 191,191,191,190,190,189,188,187,185,185,185,184,184,183,183,182, 182,182,182,182,181,181,181,181,181,180,180,180,180,180,180,179, 179,178,177,177,176,176,176,174,173,173,172,172,171,171,170,170, 170,169,169,169,168,168,168,167,165,164,164,164,162,162,162,162, 162,161,160,158,157,156,156,155,155,154,153,152,152,150,150,150, 149,149,149,146,146,146,146,145,145,144,144,144,143,142,142,142, 141,139,138,138,138,138,137,135,134,134,134,133,132,132,132,131, 131,131,131,131,131,130,128,128,127,127,125,125,125,122,122,122, 122,122,122,121,121,120,120,120,120,120,120,119,119,119,118,118, 118,117,117,116,116,116,115,114,114,114,113,112,111,111,111,110, 110,109,108,108,107,105,105,104,101,101,101,101,100,100,100,100, 100,100,99,97,97,97,96,95,95,93,91,91,91,90,90,90,89,89,89,88, 87,87,86,86,85,85,84,81,81,80,79,79,77,77,77,76,76,76,75,75,74, 74,73,73,72,72,72,71,71,70,70,69,69,69,68,68,68,68,68,67,67,66, 66,66,66,66,66,66,66,65,65,64,64,64,63,62,62,61,59,59,58,57,57, 57,57,56,56,55,55,54,54,53,53,53,53,53,52,52,51,51,51,51,51,50, 49,49,49,49,49,47,47,47,46,46,45,42,41,41,40,39,37,37,37,37,36, 36,36,34,34,34,33,33,33,33,32,32,31,30,29,29,27,27,26,26,25,25, 25,23,23,22,22,22,21,21,21,20,20,19,19,19,18,17,16,16 }; const int n4w3b3r1[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 265,265,264,264,264,262,262,261,259,259,258,256,255,255,254,254, 254,253,252,251,250,250,250,250,250,248,248,247,247,247,246,246, 246,245,244,243,243,243,242,242,242,242,242,242,242,240,240,240, 240,237,237,236,236,236,235,234,233,233,232,232,232,231,230,230, 230,230,229,229,228,227,227,226,226,225,225,225,223,222,222,222, 222,222,221,221,220,220,220,220,220,219,219,219,219,219,219,218, 218,218,217,217,215,215,215,215,215,215,214,213,213,213,212,212, 211,211,209,209,208,207,206,206,205,205,204,204,204,204,204,204, 204,203,202,201,200,200,199,199,199,199,198,196,196,195,194,193, 193,192,192,191,191,191,189,189,189,189,189,189,188,188,187,186, 186,185,185,184,184,183,183,182,182,181,181,181,180,179,178,178, 178,178,178,177,177,177,176,175,175,175,173,173,173,172,171,171, 171,171,170,170,168,168,167,166,166,166,166,164,164,164,163,163, 162,162,162,161,161,160,159,159,159,158,157,157,156,155,155,155, 153,152,152,152,151,151,151,151,149,149,149,149,148,148,148,147, 147,147,146,146,146,145,145,145,144,143,143,142,141,141,141,141, 141,140,140,140,139,139,138,138,138,136,135,135,135,135,135,133, 133,132,132,132,132,131,131,131,131,130,130,129,129,129,128,128, 128,128,128,127,127,127,125,125,125,123,123,122,121,120,120,117, 117,116,115,114,114,110,110,109,109,109,108,108,106,105,105,105, 104,104,104,103,101,101,101,101,101,100,100,99,99,99,99,98,97, 97,96,96,94,94,94,93,93,93,92,92,91,91,91,91,91,91,90,90,89,89, 88,87,87,87,87,87,87,86,85,84,84,83,82,81,81,81,80,80,79,79,78, 78,76,75,74,74,74,73,73,73,72,72,71,70,70,70,70,69,69,68,68,67, 67,66,65,64,64,64,62,62,61,61,60,59,58,58,57,56,55,55,54,53,53, 53,53,51,51,51,51,51,51,50,50,50,49,49,49,48,48,48,47,47,47,46, 45,45,44,43,43,42,42,42,42,42,40,39,39,38,37,37,37,36,35,34,33, 32,32,32,31,31,31,30,28,28,28,27,27,26,26,26,25,25,24,24,22,21, 21,21,21,20,20,18,18,18,18,17,17,17,17,16,16,16 }; const int n4w3b3r2[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 266,266,265,265,265,263,263,262,262,262,262,262,261,260,260,259, 258,258,257,257,257,257,255,254,254,253,252,252,252,252,250,249, 249,248,248,247,246,246,245,245,244,244,243,243,243,242,242,241, 241,240,240,240,240,240,240,239,239,239,239,239,238,238,237,237, 236,236,235,234,234,233,232,231,230,229,228,228,227,227,227,226, 226,226,225,225,225,225,225,224,223,223,223,223,223,223,222,222, 222,221,221,220,218,217,217,215,215,215,215,214,214,214,213,213, 213,212,212,212,211,210,210,210,208,208,207,207,207,206,205,205, 204,204,203,203,203,203,201,201,201,200,200,200,200,200,199,198, 198,197,197,196,195,195,195,194,194,194,194,194,193,193,193,193, 191,191,190,190,190,190,190,189,189,189,188,187,187,186,185,185, 185,185,184,183,182,181,181,180,180,180,179,179,178,177,177,177, 176,176,175,174,174,174,174,173,172,172,171,170,170,170,170,169, 168,168,167,166,165,163,163,162,162,161,161,161,161,160,159,159, 158,158,158,158,157,157,156,155,154,154,153,153,153,153,153,150, 150,149,149,148,148,146,146,145,145,144,143,143,142,142,141,141, 141,140,140,139,139,138,138,137,137,137,137,136,136,136,136,136, 135,135,135,134,134,133,132,131,131,131,131,130,130,128,128,127, 127,127,127,127,125,124,124,124,124,122,122,122,121,121,121,121, 121,121,121,121,120,118,118,118,117,117,117,116,116,115,114,113, 113,111,111,108,108,107,106,106,104,104,103,103,102,102,102,101, 101,100,100,100,100,99,98,98,97,94,94,93,93,92,92,92,90,90,88, 88,88,87,86,86,85,85,84,84,84,83,82,81,81,80,79,79,79,79,78,78, 78,76,76,76,75,73,72,72,71,71,71,70,69,69,68,67,67,67,66,65,64, 64,63,63,62,62,62,58,58,57,57,57,57,56,55,55,54,54,53,53,52,52, 50,50,50,50,50,49,48,48,48,47,47,47,47,46,46,46,45,45,45,45,44, 43,42,41,41,40,40,39,38,38,38,37,37,37,36,36,36,35,35,34,34,34, 33,32,31,31,31,31,31,30,30,30,30,29,29,29,29,29,29,28,27,27,27, 27,26,26,25,24,23,23,22,20,20,19,18,18,17,17,17,16,16,16 }; const int n4w3b3r3[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 266,265,265,265,265,263,263,262,261,261,260,259,259,257,257,257, 255,255,255,255,255,254,254,253,252,252,251,251,251,251,248,247, 247,246,246,246,246,246,245,244,243,242,242,242,242,241,240,239, 239,239,237,237,237,237,237,237,237,236,236,235,235,235,235,235, 234,234,232,232,232,232,230,230,230,230,229,229,229,229,228,228, 227,227,227,226,225,224,224,224,223,223,223,223,223,223,222,220, 220,219,219,219,218,218,218,218,217,216,216,216,215,215,214,213, 213,212,211,211,210,210,209,209,209,208,205,205,204,204,203,203, 201,201,201,200,199,198,198,198,197,197,197,196,196,195,195,193, 193,192,192,191,191,191,191,191,190,190,187,187,187,187,186,186, 185,185,185,184,184,183,183,182,182,182,182,181,181,180,180,180, 179,178,178,177,176,176,174,174,174,173,173,172,172,172,171,171, 171,170,170,169,168,166,166,166,166,166,165,165,165,165,165,164, 163,163,162,162,161,161,160,160,159,159,159,158,157,157,157,156, 156,156,155,155,155,155,155,154,154,153,153,152,150,150,149,148, 148,147,146,146,146,144,143,143,143,143,143,142,141,141,141,141, 140,140,140,139,136,136,135,134,132,131,131,131,130,130,130,130, 129,129,129,129,128,127,126,125,123,122,122,121,121,121,120,120, 119,119,119,118,118,117,117,116,115,114,114,113,113,113,112,112, 111,111,111,110,110,110,110,109,109,109,108,108,107,107,107,106, 105,105,105,105,104,101,100,100,100,100,99,99,99,98,97,95,95, 95,94,93,92,92,92,92,91,91,90,90,89,88,88,87,87,87,87,87,86,86, 86,85,85,83,83,83,83,82,82,82,80,80,79,79,78,78,78,78,77,77,77, 76,76,76,75,75,75,74,74,73,72,72,71,71,71,71,70,70,69,69,68,67, 65,65,65,64,63,62,62,62,61,61,61,60,59,59,59,59,58,58,58,58,57, 56,56,55,55,54,53,53,53,52,52,52,51,51,50,50,50,50,49,46,46,46, 45,45,45,43,43,43,41,40,40,38,37,37,37,37,36,35,33,33,32,32,32, 32,32,32,32,32,31,31,31,30,30,29,28,27,26,26,26,26,24,24,23,22, 22,21,21,21,21,20,20,20,19,19,19,19,18,17,17,16 }; const int n4w3b3r4[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 266,266,266,266,266,263,262,262,262,262,261,261,261,261,261,260, 260,260,260,259,258,258,258,257,257,257,257,256,256,255,255,254, 254,253,253,252,252,251,251,251,251,250,250,249,249,249,248,248, 247,247,247,246,245,245,243,243,242,241,240,240,239,238,238,238, 237,237,237,236,236,235,235,235,234,234,233,233,233,233,233,232, 232,231,231,230,230,228,228,228,228,227,226,226,226,225,225,224, 224,223,223,221,221,221,220,220,220,220,218,218,217,217,216,215, 215,215,215,214,214,214,213,213,213,213,211,211,211,211,210,210, 210,209,209,207,206,205,204,203,203,203,202,201,201,201,200,200, 200,199,198,197,195,195,195,195,194,194,193,193,192,192,191,191, 190,189,189,189,188,188,186,186,186,186,185,184,183,182,182,181, 180,179,178,177,177,176,175,175,175,175,174,174,174,173,173,172, 172,171,171,171,171,169,169,167,167,166,165,165,165,165,164,164, 163,162,162,161,161,161,160,160,159,159,158,158,157,156,156,156, 156,156,156,155,154,154,154,154,153,152,152,151,151,151,151,151, 150,150,150,150,149,149,149,147,147,147,146,145,145,144,144,143, 142,142,142,141,141,141,140,137,136,136,134,134,134,133,132,132, 132,130,130,129,129,129,128,128,127,127,127,126,125,125,124,123, 123,123,123,122,122,121,120,120,119,119,118,118,118,118,115,115, 114,114,114,113,112,112,111,111,110,110,110,110,109,109,108,108, 108,107,105,104,104,104,103,103,102,102,102,102,102,102,101,101, 101,101,100,99,99,99,98,98,98,97,96,95,95,95,94,94,93,92,92,91, 91,91,91,91,90,90,89,89,88,87,87,87,86,86,85,84,84,83,82,82,81, 81,81,81,80,80,79,78,78,78,78,77,77,76,76,75,74,74,74,73,71,71, 71,71,71,70,70,69,68,68,67,66,66,65,65,64,64,64,63,63,61,61,61, 61,60,59,58,58,58,57,57,56,54,54,54,53,52,52,52,51,51,50,50,49, 48,48,48,47,47,47,46,46,44,44,44,43,42,42,41,40,38,38,38,38,37, 36,36,36,36,35,35,35,34,32,31,31,28,27,27,27,27,26,26,25,25,25, 25,24,24,23,23,23,23,22,22,21,21,20,19,19,19,19,19,17 }; const int n4w3b3r5[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 266,266,266,266,266,265,264,263,263,262,262,262,262,262,262,262, 261,261,261,261,260,260,260,259,259,258,256,256,256,255,255,253, 252,252,252,252,251,251,250,248,248,247,247,247,247,246,246,246, 245,245,245,244,244,243,242,242,241,241,241,240,240,240,239,239, 238,238,238,236,236,235,235,235,234,234,233,233,233,232,232,231, 229,229,229,228,228,227,227,227,226,226,226,225,225,223,221,221, 221,221,221,220,220,220,219,218,218,218,216,215,215,215,214,214, 213,213,212,212,211,211,211,210,210,209,209,209,209,209,207,207, 206,205,205,205,205,204,204,204,203,202,202,201,199,199,198,198, 198,198,198,197,196,196,195,195,195,194,194,193,193,193,193,192, 192,191,191,191,191,190,190,189,189,188,188,188,188,187,187,186, 186,186,185,185,183,183,182,182,182,181,181,180,180,180,178,178, 178,177,176,176,176,176,175,175,175,174,174,174,173,173,172,171, 171,171,171,170,169,168,168,168,167,167,165,165,165,164,163,161, 161,161,160,159,159,158,158,157,156,155,155,155,154,154,154,153, 153,152,151,151,149,149,148,147,146,144,143,143,143,142,142,142, 141,139,139,139,139,138,137,137,136,136,136,135,135,134,134,133, 133,132,132,132,131,131,130,129,128,128,127,127,127,126,125,125, 125,125,124,124,123,122,122,122,122,122,122,121,121,121,120,118, 118,117,117,116,116,116,116,114,114,113,113,113,112,112,112,112, 111,111,111,111,110,109,109,109,108,108,107,107,105,105,105,105, 105,104,104,103,103,103,102,102,102,101,100,100,100,100,100,99, 99,98,98,98,97,95,95,94,94,94,93,91,91,90,90,90,90,89,88,88,88, 88,87,86,86,85,85,84,84,84,83,83,83,80,80,80,78,78,76,76,75,75, 74,74,73,73,72,71,71,70,69,69,69,68,68,68,67,67,66,65,63,63,61, 61,60,59,59,59,59,59,58,58,58,58,57,56,56,54,52,52,52,51,49,49, 49,47,46,46,46,45,45,45,45,45,44,44,44,43,43,43,42,41,41,41,40, 39,39,36,35,33,33,33,33,32,32,32,32,31,31,30,29,28,28,28,28,27, 26,26,25,25,25,25,24,24,22,22,21,20,20,20,20,20,19,18,18,17,16, 16 }; const int n4w3b3r6[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 266,265,265,265,264,263,262,260,260,260,259,259,258,258,258,257, 257,256,256,255,253,253,252,252,252,252,252,251,251,250,249,249, 248,247,246,246,246,246,245,244,244,244,243,243,242,241,240,237, 237,237,237,236,236,235,233,233,232,232,230,229,228,228,228,228, 228,228,227,226,226,225,225,225,225,224,224,224,224,224,224,223, 222,222,222,221,221,219,219,219,219,219,218,218,218,216,215,215, 215,215,215,214,214,214,214,214,213,213,212,212,212,212,209,209, 209,208,208,208,208,207,207,207,207,206,205,205,205,205,204,204, 203,203,202,202,201,200,199,199,199,198,197,197,197,196,195,195, 194,194,193,193,192,192,191,191,190,190,189,189,189,189,188,188, 187,186,186,186,185,185,185,184,183,183,183,183,182,182,182,181, 181,180,180,179,179,178,178,178,177,176,176,175,175,173,173,172, 171,171,170,170,169,169,169,168,168,168,167,165,165,165,164,164, 164,163,163,163,162,161,161,161,160,160,159,159,159,158,157,156, 155,155,155,155,155,155,155,154,154,154,154,154,153,153,153,153, 152,152,152,151,151,151,150,150,150,150,150,150,149,149,148,147, 146,146,145,144,144,143,143,143,143,143,141,141,141,141,140,140, 140,139,139,139,139,139,138,136,136,135,135,134,134,132,131,129, 129,129,129,129,129,128,127,127,126,126,126,125,125,125,125,125, 124,124,123,122,122,121,121,121,120,120,120,120,119,119,118,117, 116,116,116,116,115,115,115,115,114,112,112,111,111,110,108,107, 106,105,105,104,104,104,102,102,101,101,101,101,100,100,100,99, 99,98,97,97,97,97,95,95,94,94,93,93,92,92,92,92,92,91,91,90,89, 89,89,88,88,88,88,87,86,86,85,84,83,82,81,81,80,79,78,77,77,77, 77,77,77,76,75,74,74,73,73,73,73,72,72,72,72,72,72,72,72,72,71, 69,69,68,67,67,67,66,66,65,65,65,65,64,63,63,61,61,60,58,56,56, 55,54,53,52,52,51,50,50,50,49,48,47,47,47,46,46,45,44,43,43,42, 42,41,40,40,40,39,39,35,35,34,33,33,32,32,32,32,31,31,29,29,28, 28,28,27,27,26,26,26,25,25,25,24,23,22,19,19,19,19,18,17,17,16, 16 }; const int n4w3b3r7[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 265,265,265,265,263,263,263,262,262,261,261,260,260,258,258,258, 258,258,257,257,257,257,257,256,256,255,255,254,254,254,253,253, 253,253,253,252,252,251,251,250,250,250,249,248,248,248,248,247, 247,247,246,246,246,246,245,243,243,242,241,241,241,240,240,240, 240,238,238,238,238,238,238,238,238,238,237,236,235,235,234,234, 234,232,232,230,230,229,228,227,227,227,226,226,226,226,226,226, 225,224,223,223,223,223,223,223,222,222,222,221,221,221,220,220, 219,219,218,217,217,217,217,217,216,216,215,215,215,214,212,212, 212,212,211,211,210,210,209,208,208,207,205,205,204,204,204,203, 203,203,202,202,201,201,201,200,200,200,199,198,197,197,196,195, 195,194,194,194,194,194,194,193,193,192,190,190,190,190,190,189, 189,189,189,189,188,188,188,187,187,186,186,185,185,185,185,184, 184,183,183,182,181,181,180,180,179,179,177,176,176,176,175,174, 174,173,167,167,166,166,165,165,165,165,164,164,164,163,161,160, 160,159,159,159,156,156,155,155,154,154,154,153,152,152,152,150, 150,150,149,147,146,145,144,144,144,144,143,143,142,142,142,141, 140,139,139,138,138,138,138,137,136,135,135,135,134,134,134,133, 132,132,132,132,131,131,130,130,130,130,129,128,128,128,128,128, 128,127,127,127,127,127,125,124,124,124,124,123,123,123,122,121, 121,121,121,120,120,119,119,118,118,117,117,116,116,115,115,114, 114,114,113,112,112,112,112,111,111,111,111,110,109,108,108,108, 107,107,107,106,105,105,104,102,102,101,101,101,99,98,98,97,97, 97,97,96,95,94,94,93,91,91,91,91,90,90,90,89,88,88,88,88,88,87, 86,86,85,85,85,85,84,84,84,82,82,82,81,81,81,81,80,80,79,79,78, 78,78,74,74,74,74,72,71,70,70,69,68,68,67,65,65,65,65,63,61,61, 61,61,60,60,59,58,58,58,58,58,57,56,56,56,55,55,54,54,54,54,53, 53,51,51,48,48,47,47,46,46,45,44,44,43,42,42,42,41,41,41,40,39, 38,37,36,35,34,33,32,32,32,32,31,31,30,28,28,27,27,27,27,26,26, 24,24,23,22,21,20,20,20,19,19,19,18,18,18,18,17,17,16,16,16,16 }; const int n4w3b3r8[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 266,266,265,264,264,264,263,263,261,261,261,260,259,259,259,259, 258,257,256,255,254,254,252,252,252,251,251,251,250,250,248,246, 246,245,244,243,243,243,242,241,241,241,241,241,240,240,240,240, 238,238,238,237,236,236,235,235,235,235,234,234,234,234,234,233, 233,232,232,232,232,231,231,230,230,230,230,229,228,227,226,226, 226,226,226,225,225,225,224,223,223,223,223,223,222,221,220,220, 218,218,217,216,215,214,214,213,213,213,213,212,212,212,212,212, 211,211,210,209,209,209,209,209,209,208,208,208,207,206,206,206, 204,204,203,203,203,202,202,202,201,201,201,200,200,199,199,199, 199,199,199,198,198,197,197,196,196,196,195,195,193,192,192,192, 191,191,189,189,188,188,188,188,187,186,185,185,184,183,183,182, 181,181,181,181,180,179,179,178,178,178,178,177,177,176,174,174, 174,174,174,173,173,173,172,172,169,169,168,168,168,167,167,166, 165,164,163,163,163,162,162,162,161,161,161,161,160,159,159,158, 158,157,156,156,154,153,152,151,151,151,151,150,150,150,150,150, 148,148,148,147,147,147,147,146,146,146,144,143,143,142,142,142, 142,142,141,140,140,140,139,139,138,138,138,137,136,135,135,134, 134,133,133,133,133,132,132,132,132,131,130,130,128,128,128,127, 127,123,123,122,122,122,121,121,121,120,119,119,118,118,117,116, 116,115,114,114,114,113,113,113,113,112,111,111,111,110,110,110, 109,108,107,107,106,105,105,105,105,104,104,103,102,102,102,101, 100,100,99,99,98,98,97,97,97,97,95,95,92,91,91,91,91,88,87,87, 87,87,86,86,86,86,85,85,85,83,83,82,82,82,82,82,81,81,81,81,80, 80,79,78,78,78,77,77,77,77,76,76,76,75,75,75,74,74,74,74,74,72, 72,72,71,71,70,70,68,68,68,67,67,67,66,66,65,65,65,63,62,62,62, 62,61,60,60,60,60,60,59,58,57,56,56,55,55,54,53,52,52,51,51,50, 50,50,50,49,49,48,48,48,48,48,47,46,46,45,45,45,44,43,43,43,41, 40,39,39,38,38,36,36,34,34,34,34,32,31,30,30,30,30,29,29,29,28, 27,27,26,26,25,24,23,22,22,21,21,21,19,18,18,17,16,16 }; const int n4w3b3r9[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 266,266,265,265,263,263,263,262,262,261,261,261,261,261,259,259, 258,257,256,256,255,254,254,253,253,253,252,252,251,250,250,249, 248,248,247,246,246,246,246,245,245,244,244,244,244,243,242,242, 242,242,242,241,241,240,239,238,237,237,235,235,235,234,234,233, 232,232,230,229,229,229,228,228,227,227,227,227,226,226,226,225, 225,223,221,221,221,221,221,221,220,220,220,220,219,219,219,218, 218,218,217,217,217,215,215,215,214,214,212,210,210,209,209,209, 209,209,208,207,205,205,205,204,204,204,203,203,203,202,201,201, 201,201,201,201,200,200,199,199,198,198,198,198,198,198,197,196, 195,195,194,194,193,193,193,192,192,191,190,189,189,188,188,188, 187,186,185,185,184,183,182,182,181,181,180,180,179,179,179,179, 178,177,176,176,175,175,174,173,173,173,173,172,172,172,171,170, 170,169,169,169,168,167,165,165,165,165,164,163,163,161,161,160, 160,159,159,159,159,158,158,157,156,156,155,155,154,154,153,153, 152,151,150,150,149,149,149,147,147,147,147,147,146,146,146,144, 143,143,143,143,142,142,141,141,140,140,139,138,137,137,136,136, 136,135,135,133,133,131,131,131,131,130,130,130,130,129,129,129, 128,127,127,126,125,124,124,123,122,122,122,121,120,120,120,120, 119,119,119,118,117,117,117,117,117,116,116,116,115,115,114,114, 114,113,112,112,111,111,110,110,109,109,107,107,107,107,106,105, 105,105,105,104,103,103,103,102,102,102,102,101,101,101,101,100, 100,100,99,99,98,98,96,96,96,94,93,92,91,91,91,91,90,90,90,90, 89,89,89,88,88,87,87,87,87,87,85,84,83,82,82,82,81,81,80,80,79, 79,78,78,78,78,77,76,76,76,75,74,74,73,71,69,69,69,68,68,68,68, 66,66,66,66,64,63,63,62,62,62,61,60,60,59,59,59,58,58,58,58,57, 56,56,55,55,55,55,54,54,54,53,53,53,53,52,52,52,51,49,49,49,49, 49,49,48,47,47,47,45,43,43,42,42,42,42,42,41,41,40,40,39,39,39, 39,38,37,37,35,33,33,33,32,32,31,29,28,28,27,26,26,25,24,24,24, 23,23,22,22,21,21,20,20,19,18,18,18,18,17,17,16,16,16 }; const int n4w4b1r0[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 132,132,132,132,132,132,132,132,132,132,132,132,132,131,131,131, 131,131,131,131,131,131,131,130,130,130,130,130,129,129,129,129, 129,129,129,129,129,129,128,128,128,128,128,128,128,128,128,128, 128,128,128,127,127,127,127,127,127,127,127,127,127,127,127,126, 126,126,126,126,125,125,125,125,125,125,125,125,125,125,125,125, 124,124,124,124,124,124,124,124,124,124,124,124,124,123,123,123, 123,123,123,123,123,123,123,123,123,123,123,122,122,122,122,122, 122,122,122,122,122,122,122,121,121,121,121,121,121,121,121,121, 121,121,121,121,121,121,121,121,121,121,121,121,121,120,120,120, 120,120,120,120,120,120,120,120,120,120,119,119,119,119,119,119, 119,119,119,119,118,118,118,118,117,117,117,117,117,117,117,117, 117,117,117,117,117,116,116,116,116,116,116,116,116,116,116,116, 116,116,116,116,115,115,115,115,115,115,115,115,115,115,114,114, 114,114,114,114,114,114,114,114,114,114,114,114,113,113,113,113, 113,113,113,113,113,113,113,113,113,112,112,112,112,112,112,112, 112,112,111,111,111,111,111,111,111,111,111,111,110,110,110,110, 110,110,110,109,109,109,109,109,109,109,109,109,108,108,108,108, 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108, 107,107,107,107,107,107,107,107,107,107,107,106,106,106,106,106, 106,106,106,106,106,106,106,106,105,105,105,105,105,105,105,105, 105,105,105,105,104,104,104,104,104,104,104,104,104,104,104,103, 103,103,103,103,103,103,103,103,103,103,102,102,102,102,102,102, 102,102,102,102,102,102,101,101,101,101,101,101,101,101,101,101, 101,101,101,100,100,100,100,100,100,100,100,100,100,100,99,99, 99,99,99,99,99,99,98,98,98,98,98,98,98,98,98,98,98,98,98,98,97, 97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,96,96,96,96,96,96, 96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,94,94,94,94,94, 94,94,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,92, 92,92,92,92,92,92,92,92,92,92,92,92,91,91,91,91,91,91,91,90,90, 90,90,90,90,90,90,90,90,90,90,90 }; const int n4w4b1r1[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 132,132,132,132,132,132,132,132,132,132,132,131,131,131,131,131, 131,131,130,130,130,130,130,130,130,130,130,130,129,129,129,129, 129,129,129,129,128,128,128,128,128,128,128,128,128,128,128,127, 127,127,127,127,127,127,127,127,127,127,127,127,127,127,126,126, 126,126,126,126,126,126,126,126,126,126,125,125,125,125,125,125, 125,125,125,125,125,125,125,125,124,124,124,124,124,124,123,123, 123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, 122,122,122,122,122,121,121,121,121,121,121,121,121,121,121,121, 121,120,120,120,120,120,120,120,120,120,120,120,120,120,120,119, 119,119,119,119,119,119,119,119,119,119,119,118,118,118,118,118, 118,118,118,118,118,118,118,118,118,117,117,117,117,117,117,117, 117,117,117,117,117,117,116,116,116,116,116,116,116,116,116,116, 116,116,116,116,116,115,115,115,115,115,115,115,115,115,115,115, 115,115,114,114,114,114,114,114,114,114,114,114,114,114,114,114, 114,114,114,113,113,113,113,113,113,113,113,113,113,112,112,112, 112,112,112,112,112,112,112,111,111,111,111,111,111,111,111,111, 111,111,111,110,110,110,110,110,110,110,110,110,110,110,110,109, 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, 108,108,108,108,108,108,108,108,108,108,107,107,107,107,107,107, 107,107,107,107,106,106,106,106,106,106,106,106,106,106,106,105, 105,105,105,105,105,105,105,105,105,105,105,105,105,104,104,104, 104,104,104,104,104,104,104,104,104,104,104,103,103,103,103,103, 103,103,103,103,103,103,103,103,103,103,102,102,102,102,102,102, 102,102,102,102,102,102,102,102,101,101,101,101,101,101,101,101, 101,101,101,101,101,101,100,100,100,100,100,100,100,100,100,100, 99,99,99,99,99,99,99,99,99,99,99,98,98,98,98,98,98,98,98,98,98, 98,98,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,96,95,95,95, 95,95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,94,93,93,93,93, 93,93,93,93,93,93,93,92,92,92,92,92,92,91,91,91,91,91,91,91,91, 91,91,91,91,91,90,90,90,90,90,90,90,90,90,90,90 }; const int n4w4b1r2[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 132,132,132,132,132,132,132,132,132,132,132,132,132,131,131,131, 131,131,131,131,130,130,130,130,130,130,130,130,130,130,130,129, 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, 129,128,128,128,128,128,128,128,128,128,128,128,128,128,127,127, 127,127,127,127,127,127,127,127,127,126,126,126,126,126,126,126, 126,126,126,125,125,125,125,125,125,125,125,125,125,125,125,125, 125,124,124,124,124,124,124,124,124,124,124,124,124,123,123,123, 123,123,123,123,123,123,123,123,123,123,123,123,123,122,122,122, 122,122,122,122,122,122,122,122,122,122,122,121,121,121,121,121, 121,121,121,121,120,120,120,120,120,120,120,120,120,120,119,119, 119,119,119,119,119,119,119,119,119,118,118,118,118,118,118,118, 118,118,118,118,118,117,117,117,117,117,117,117,117,117,116,116, 116,116,116,115,115,115,115,115,115,115,115,115,114,114,114,114, 114,114,114,114,114,114,114,114,114,114,113,113,113,113,113,113, 113,113,113,113,113,113,113,112,112,112,112,112,112,112,112,112, 112,112,112,112,111,111,111,111,111,111,111,111,111,111,111,111, 111,111,111,111,111,110,110,110,110,110,110,110,110,110,110,110, 109,109,109,109,109,109,109,109,109,108,108,108,108,108,108,108, 108,108,108,107,107,107,107,107,107,107,107,107,107,106,106,106, 106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,105, 105,105,105,105,105,104,104,104,104,104,104,104,104,104,104,104, 104,104,104,103,103,103,103,103,103,103,103,103,103,103,103,102, 102,102,102,102,102,102,102,102,102,102,102,102,101,101,101,101, 101,101,101,101,101,101,101,101,101,101,100,100,100,100,100,100, 100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,99, 99,99,99,99,99,98,98,98,98,98,98,98,98,97,97,97,97,97,97,97,97, 97,97,96,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95, 95,95,94,94,94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,93, 93,93,93,93,93,92,92,92,92,92,92,92,92,92,91,91,91,91,91,91,91, 91,91,91,90,90,90,90,90,90,90,90,90,90,90 }; const int n4w4b1r3[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,131, 131,131,131,131,131,131,131,131,131,131,131,131,131,130,130,130, 130,130,130,130,130,130,129,129,129,129,129,129,129,129,128,128, 128,128,128,128,128,128,128,128,128,128,128,127,127,127,127,127, 127,127,127,127,126,126,126,126,126,126,126,126,126,125,125,125, 125,125,125,125,125,125,125,125,125,125,125,125,125,124,124,124, 124,124,124,124,124,123,123,123,123,123,123,123,123,123,123,123, 123,122,122,122,122,122,122,122,121,121,121,121,121,121,121,121, 121,121,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,119,119,119,119,119,119,119,119,119,119,118,118,118,118,118, 118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,117, 117,117,117,117,117,117,117,117,117,117,117,116,116,116,116,116, 116,116,116,116,116,115,115,115,115,115,115,115,115,115,115,115, 115,115,115,115,114,114,114,114,114,114,114,114,114,114,114,114, 113,113,113,113,113,113,113,113,113,113,113,112,112,112,112,112, 112,112,112,112,112,112,112,112,111,111,111,111,111,111,111,111, 111,111,111,111,110,110,110,110,110,110,110,110,110,110,110,110, 109,109,109,109,109,109,109,108,108,108,108,108,108,108,108,108, 107,107,107,107,107,107,107,107,107,107,107,107,107,107,106,106, 106,106,106,106,106,106,106,106,106,106,105,105,105,105,105,105, 105,105,105,105,105,105,105,104,104,104,104,104,104,104,104,104, 104,104,104,104,103,103,103,103,103,103,103,103,103,103,103,102, 102,102,102,102,102,102,102,102,102,102,101,101,101,101,101,101, 101,101,101,101,101,101,101,101,101,100,100,100,100,100,100,100, 100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,99, 99,98,98,98,98,98,98,98,98,98,98,98,98,98,97,97,97,97,97,97,97, 97,96,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95, 95,95,95,95,95,95,94,94,94,94,94,94,94,94,94,94,94,94,94,94,93, 93,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,92,91,91,91, 91,91,91,90,90,90,90,90,90,90,90,90,90,90,90 }; const int n4w4b1r4[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 132,132,132,132,132,132,132,132,132,132,132,132,131,131,131,131, 131,131,131,131,131,131,131,131,131,131,131,130,130,130,130,130, 130,130,130,130,130,130,130,129,129,129,129,129,129,129,129,129, 129,129,128,128,128,128,128,128,128,128,128,128,128,128,128,128, 127,127,127,127,127,127,127,127,126,126,126,126,126,126,126,126, 126,126,125,125,125,125,125,125,125,125,125,125,125,125,125,124, 124,124,124,124,124,124,124,124,124,123,123,123,123,123,123,123, 123,123,123,123,123,123,123,123,123,123,122,122,122,122,122,122, 122,122,122,121,121,121,121,121,121,121,121,121,121,121,121,120, 120,120,120,120,120,120,120,120,120,119,119,119,119,119,119,119, 119,119,119,119,119,118,118,118,118,118,118,118,118,118,118,118, 118,117,117,117,117,117,117,117,117,117,117,117,117,116,116,116, 116,116,116,116,115,115,115,115,115,115,115,114,114,114,114,114, 114,114,114,114,114,114,114,113,113,113,113,113,112,112,112,112, 112,112,112,112,112,112,112,112,112,111,111,111,111,111,111,111, 111,111,111,111,110,110,110,110,110,110,110,110,110,110,110,110, 110,110,109,109,109,109,109,109,109,109,109,109,109,108,108,108, 108,108,108,108,108,108,108,108,107,107,107,107,107,107,107,107, 107,107,107,107,106,106,106,106,106,106,106,106,105,105,105,105, 105,105,105,105,105,105,105,105,105,105,105,104,104,104,104,104, 104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,103, 103,103,103,103,103,103,103,103,102,102,102,102,102,102,102,102, 102,102,102,102,102,102,102,102,102,101,101,101,101,101,101,100, 100,100,100,100,100,99,99,99,99,99,99,99,99,99,99,98,98,98,98, 98,98,98,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,97,97, 97,97,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,96,96, 96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,95,95,95,95, 95,94,94,94,94,94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93, 93,93,93,93,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,91,91, 91,91,91,90,90,90,90,90 }; const int n4w4b1r5[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 132,132,132,132,132,132,131,131,131,131,131,131,131,131,131,131, 131,130,130,130,130,130,130,130,130,130,130,130,130,130,129,129, 129,129,129,129,129,129,129,129,129,129,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,128,128,127,127,127,127,127,127, 127,127,127,127,127,127,127,127,127,126,126,126,126,126,126,126, 126,126,126,125,125,125,125,125,125,125,125,125,125,124,124,124, 124,124,124,124,124,123,123,123,123,123,123,123,123,123,123,123, 122,122,122,122,122,122,122,122,122,122,122,122,122,121,121,121, 121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121, 121,121,121,120,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,119,119,119,119,119,119,119,119,119,119,119,118,118,118, 118,118,118,118,118,118,118,118,117,117,117,117,117,117,117,117, 117,117,117,117,117,117,116,116,116,116,116,116,116,116,115,115, 115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,114, 114,114,114,114,114,114,113,113,113,113,113,113,113,113,113,113, 112,112,112,112,112,112,112,112,112,112,112,112,111,111,111,111, 111,111,111,111,111,111,111,111,111,111,111,110,110,110,110,110, 110,110,110,110,110,110,110,110,110,109,109,109,109,109,109,109, 109,108,108,108,108,108,108,108,108,108,107,107,107,107,107,107, 107,107,106,106,106,106,106,106,106,106,106,106,105,105,105,105, 105,105,105,105,105,105,105,105,105,104,104,104,104,104,104,104, 104,104,104,104,104,104,104,104,103,103,103,103,103,103,103,103, 103,103,103,103,103,103,102,102,102,102,101,101,101,101,101,101, 101,101,101,101,100,100,100,100,100,100,100,100,100,100,100,100, 100,100,100,100,99,99,99,99,99,99,99,99,99,99,99,99,99,99,98, 98,98,98,98,98,98,98,98,98,98,98,98,98,98,97,97,97,97,97,97,96, 96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,95,95,94, 94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,93,93,93,93,92, 92,92,92,92,92,92,92,92,92,92,91,91,91,91,91,91,91,91,91,91,91, 90,90,90,90,90,90,90,90,90,90,90,90,90 }; const int n4w4b1r6[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 132,132,132,132,132,132,132,132,132,132,132,132,132,131,131,131, 131,131,131,131,131,131,131,131,131,131,131,131,131,130,130,130, 130,130,130,130,130,130,130,130,130,130,130,130,130,129,129,129, 129,129,129,129,129,129,129,129,129,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,128,128,127,127,127,127,127,127, 127,127,127,127,127,126,126,126,126,126,126,126,126,126,126,126, 126,126,126,126,125,125,125,125,125,125,125,125,125,125,125,125, 125,124,124,124,124,124,124,124,124,124,124,124,123,123,123,123, 123,123,123,123,122,122,122,122,122,122,122,122,121,121,121,121, 121,121,121,121,121,121,121,120,120,120,120,120,120,120,120,119, 119,119,119,119,119,119,119,119,119,118,118,118,118,118,118,118, 118,118,118,118,118,118,117,117,117,117,117,117,116,116,116,116, 116,116,116,116,116,116,116,116,115,115,115,115,115,115,115,115, 115,114,114,114,114,114,114,114,114,114,114,114,113,113,113,113, 113,113,113,113,113,113,113,113,113,113,112,112,112,112,112,112, 112,112,112,112,112,112,111,111,111,111,111,111,111,111,111,111, 111,110,110,110,110,110,110,109,109,109,109,109,109,109,109,109, 109,109,109,109,108,108,108,108,108,108,108,108,108,108,108,108, 108,107,107,107,107,107,107,107,107,107,106,106,106,106,106,106, 106,106,106,106,106,106,106,106,106,106,105,105,105,105,105,105, 105,105,105,105,105,105,105,105,105,104,104,104,104,104,104,104, 104,104,103,103,103,103,103,103,103,103,103,103,103,103,103,102, 102,102,102,102,102,102,102,102,102,102,102,101,101,101,101,101, 101,101,101,101,101,101,101,101,101,100,100,100,100,100,100,100, 100,100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,99, 99,99,99,99,99,99,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97, 96,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,95, 95,95,95,95,94,94,94,94,94,94,94,94,94,94,93,93,93,93,93,93,93, 93,93,93,93,93,92,92,92,92,92,92,92,92,92,92,92,91,91,91,91,91, 91,91,91,91,91,90,90,90,90,90,90,90,90,90,90 }; const int n4w4b1r7[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 132,132,132,132,132,132,132,132,132,131,131,131,131,131,131,131, 131,131,131,131,130,130,130,129,129,129,129,129,129,129,129,129, 129,129,128,128,128,128,128,128,128,128,127,127,127,127,127,127, 127,127,126,126,126,126,126,126,126,126,126,126,126,126,126,126, 126,126,126,126,126,125,125,125,125,125,125,125,125,125,125,125, 124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124, 124,124,123,123,123,123,123,123,123,123,123,123,123,122,122,122, 122,122,122,122,122,122,122,122,121,121,121,121,121,121,121,121, 121,121,121,121,121,121,120,120,120,120,120,120,120,120,120,120, 119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, 119,119,119,118,118,118,118,118,118,118,118,118,118,118,118,118, 117,117,117,117,117,117,117,117,117,117,116,116,116,116,116,116, 116,116,116,116,116,116,116,116,116,115,115,115,115,115,115,115, 115,115,115,115,114,114,114,114,114,114,114,114,114,114,114,114, 114,114,113,113,113,113,113,113,113,113,113,113,113,113,113,113, 113,113,113,113,112,112,112,112,112,112,112,112,112,112,112,112, 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, 111,111,110,110,110,110,110,110,110,110,110,110,110,109,109,109, 109,109,109,109,108,108,108,108,108,108,108,108,108,108,108,108, 108,108,107,107,107,107,107,107,107,107,107,107,107,107,107,106, 106,106,106,106,106,106,106,105,105,105,105,105,105,105,104,104, 104,104,104,104,104,104,103,103,103,103,103,103,103,103,103,103, 102,102,102,102,102,102,102,102,102,102,102,102,102,101,101,101, 101,101,101,101,101,101,100,100,100,100,100,100,100,100,100,100, 100,100,99,99,99,99,99,99,99,99,99,99,99,98,98,98,98,98,98,98, 98,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,97,97,97,97, 96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,94,94,94, 94,94,94,94,94,94,93,93,93,93,93,93,93,93,93,93,93,93,93,93,92, 92,92,92,92,92,92,92,92,92,92,92,92,91,91,91,91,91,91,90,90,90, 90,90,90,90,90,90,90,90,90,90,90,90 }; const int n4w4b1r8[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 132,132,132,132,132,132,132,132,132,132,132,132,131,131,131,131, 130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130, 129,129,129,129,129,129,129,129,129,129,129,129,128,128,128,128, 128,128,128,128,128,128,128,128,127,127,127,127,127,127,127,127, 127,127,127,127,127,127,127,127,127,126,126,126,126,126,126,126, 126,126,126,126,126,126,125,125,125,125,125,125,125,125,125,124, 124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124, 124,123,123,123,123,123,123,123,123,123,122,122,122,122,122,122, 121,121,121,121,121,121,121,121,121,121,121,120,120,120,120,120, 120,120,120,120,120,120,119,119,119,119,119,119,119,119,119,119, 119,119,119,118,118,118,118,118,118,118,118,118,118,118,118,118, 118,117,117,117,117,117,117,117,117,117,117,117,117,117,117,116, 116,116,116,116,116,116,116,116,116,116,115,115,115,115,115,115, 115,115,115,115,115,115,115,115,114,114,114,114,114,114,114,114, 113,113,113,113,113,113,113,113,112,112,112,112,112,112,112,112, 112,112,111,111,111,111,111,111,111,111,111,111,111,111,111,111, 110,110,110,110,110,110,110,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,108,108,108,108,108,108,108,108,108,108, 108,108,108,108,108,108,107,107,107,107,107,107,107,107,107,106, 106,106,106,106,106,106,106,106,106,106,105,105,105,105,105,105, 105,105,105,105,105,104,104,104,104,104,104,104,104,104,103,103, 103,103,103,103,103,103,103,103,103,103,102,102,102,102,102,102, 102,102,102,102,102,102,102,102,102,102,102,101,101,101,101,101, 101,101,101,101,101,101,101,100,100,100,100,100,100,100,100,100, 100,99,99,99,99,99,99,99,99,99,99,99,99,99,99,98,98,98,98,98, 98,98,98,98,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,97, 97,96,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95, 95,95,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,93,93,93,93, 93,93,93,93,93,92,92,92,92,92,92,92,92,92,92,92,92,91,91,91,91, 91,91,91,91,91,91,90,90,90,90,90,90 }; const int n4w4b1r9[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 132,132,132,132,132,132,132,131,131,131,131,131,131,131,130,130, 130,130,130,130,130,130,129,129,129,129,129,129,129,128,128,128, 128,128,128,128,127,127,127,127,127,127,127,127,127,127,127,127, 127,126,126,126,126,126,126,126,126,126,126,126,126,126,125,125, 125,125,125,125,125,124,124,124,124,124,124,124,124,124,124,124, 124,124,124,123,123,123,123,123,123,123,123,123,123,123,123,122, 122,122,122,122,122,122,122,122,122,122,122,121,121,121,121,121, 121,121,121,121,121,120,120,120,120,120,120,120,120,120,120,120, 120,120,119,119,119,119,119,119,119,119,119,119,119,119,119,118, 118,118,118,118,118,118,118,118,118,117,117,117,117,117,117,117, 117,117,117,117,116,116,116,116,116,116,116,115,115,115,115,115, 115,115,115,115,115,115,115,115,114,114,114,114,114,114,114,114, 114,114,114,114,114,114,114,114,114,114,113,113,113,113,113,113, 113,113,113,113,113,112,112,112,112,112,112,112,112,112,112,112, 111,111,111,111,111,111,111,111,111,111,111,111,111,110,110,110, 110,110,110,110,110,110,110,110,109,109,109,109,109,109,109,109, 109,109,109,108,108,108,108,108,108,108,108,108,108,108,108,108, 108,107,107,107,107,107,107,107,107,107,107,107,107,106,106,106, 106,106,106,106,106,106,106,106,106,106,106,106,106,105,105,105, 105,105,105,105,105,105,105,105,105,105,105,104,104,104,104,104, 104,104,104,104,104,104,104,103,103,103,103,103,103,103,103,103, 103,103,102,102,102,102,102,102,102,102,102,102,102,102,102,102, 102,101,101,101,101,101,101,101,101,101,101,100,100,100,100,100, 100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,98, 98,98,98,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,96,96, 96,96,96,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95, 95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,94,94,94,94,94,93, 93,93,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,92,92,91, 91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,90,90,90,90,90, 90,90,90,90,90,90,90,90,90 }; const int n4w4b2r0[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 165,165,165,165,164,164,164,164,163,163,163,162,162,162,162,162, 162,162,162,161,161,161,161,160,160,160,160,159,159,159,159,159, 158,158,158,158,157,157,157,157,156,156,156,155,155,155,155,155, 154,154,154,154,153,153,153,153,152,152,152,151,151,151,151,150, 150,150,149,149,149,148,148,148,147,147,147,146,146,146,146,146, 146,145,145,145,145,145,144,144,144,144,144,144,144,144,144,143, 143,143,143,143,143,142,142,142,141,141,140,140,139,138,138,138, 138,138,137,137,137,136,136,136,135,135,135,135,135,134,134,134, 134,134,134,134,133,133,133,132,132,131,131,131,131,130,130,130, 130,130,129,129,129,129,128,128,128,128,128,128,127,127,127,127, 127,127,127,127,126,126,125,125,125,125,125,125,125,124,124,124, 124,124,124,124,123,123,123,123,123,122,122,122,122,122,122,121, 121,121,120,120,120,120,119,119,119,119,118,118,118,117,117,116, 116,116,116,116,116,115,115,115,115,114,114,114,114,114,114,114, 113,113,113,112,112,112,112,111,111,110,110,110,110,110,110,110, 110,109,109,109,109,109,109,109,109,109,107,107,107,106,106,106, 106,106,106,105,105,105,105,105,105,105,104,104,104,104,104,104, 103,103,103,102,102,102,102,102,101,101,101,101,101,101,100,100, 100,100,100,100,99,99,99,99,99,99,98,98,98,98,98,98,98,97,97, 97,96,96,96,95,95,95,94,94,94,94,94,94,94,94,94,94,94,94,94,94, 94,93,93,93,93,92,92,92,92,92,92,91,91,91,91,91,91,91,90,89,89, 88,88,88,87,86,86,86,86,85,85,84,84,84,84,84,84,84,84,83,83,83, 82,82,82,82,82,82,81,81,81,81,81,81,80,80,80,80,80,79,79,79,79, 79,78,78,78,78,77,77,77,77,77,77,77,77,77,77,76,76,76,76,76,75, 75,75,75,75,75,75,73,73,73,73,73,73,72,72,72,72,71,71,71,71,71, 71,70,70,70,70,70,69,69,69,69,69,69,69,68,68,68,68,68,68,68,67, 67,67,67,66,66,66,66,65,65,65,65,65,64,64,64,64,64,64,63,63,63, 62,62,62,62,61,61,61,61,60,60,60,60,60,60,59,59,59,59,58,57,57, 57,57,57,57 }; const int n4w4b2r1[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 165,165,165,165,165,165,165,164,164,164,164,164,163,163,163,163, 163,163,163,163,163,162,161,161,161,161,160,160,160,160,160,160, 160,160,159,159,159,159,159,159,159,158,158,158,157,157,156,156, 156,156,156,155,155,155,155,155,155,154,154,154,154,154,153,153, 152,152,151,151,151,151,151,151,150,150,150,149,149,149,149,149, 149,149,148,148,148,148,148,148,148,148,148,147,147,147,147,147, 147,147,146,146,146,146,146,145,145,145,145,145,145,144,144,144, 144,144,143,143,143,143,142,142,142,141,141,141,141,141,140,140, 140,140,140,139,139,139,139,139,139,138,138,138,138,138,137,137, 137,137,137,136,136,136,136,136,136,136,135,135,135,135,134,134, 134,134,134,133,133,133,132,132,132,132,132,131,131,131,131,131, 131,131,131,131,130,130,130,129,129,129,128,127,127,127,127,126, 126,126,126,126,126,126,126,125,125,124,124,124,124,124,123,123, 123,123,122,122,122,122,121,121,121,121,120,119,119,119,118,118, 118,117,117,117,116,116,116,116,116,116,116,116,116,116,116,116, 115,115,115,115,115,115,115,115,114,114,113,113,113,113,113,112, 112,112,112,111,111,111,111,110,110,110,110,110,109,109,108,108, 108,107,107,107,106,106,106,106,105,105,105,105,105,104,104,104, 104,104,104,104,103,103,103,103,103,102,102,102,101,101,101,101, 100,100,99,99,99,99,99,99,98,98,98,98,98,97,97,97,97,97,97,97, 96,96,96,96,95,95,95,94,94,94,94,94,94,93,93,93,93,93,93,92,92, 92,91,91,91,91,91,91,90,90,89,89,89,89,89,88,88,88,88,87,86,86, 86,86,86,86,85,85,84,84,84,84,84,83,83,82,82,82,82,82,81,81,81, 81,80,80,80,79,79,79,78,78,78,78,78,78,77,77,77,77,76,76,76,76, 75,75,75,75,74,74,74,74,74,74,73,73,73,73,72,72,72,71,71,71,71, 71,71,71,71,70,70,70,70,69,69,68,67,67,67,66,66,66,65,65,65,65, 65,65,65,65,65,64,64,64,64,64,64,64,63,63,63,63,63,63,62,62,62, 62,62,61,61,61,61,61,61,61,61,60,60,60,58,58,58,58,58,58,58,57, 57,57,57,57,57,57,57,57 }; const int n4w4b2r2[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 165,165,165,165,165,165,164,164,164,164,164,164,164,164,163,163, 163,163,163,162,162,162,162,162,161,161,161,160,160,160,159,159, 159,159,158,158,157,157,157,156,156,156,156,156,155,155,155,155, 155,155,154,154,154,154,154,154,154,153,153,153,153,153,153,153, 152,152,152,152,152,151,151,151,151,150,150,150,150,150,149,149, 149,149,149,149,148,148,148,148,148,148,148,148,147,147,147,146, 146,146,146,146,146,146,145,145,145,145,145,145,145,145,144,144, 144,144,144,144,144,144,143,143,143,143,143,143,142,142,142,142, 141,141,141,141,140,140,140,140,140,140,140,139,139,139,139,139, 139,139,138,138,138,138,137,137,137,137,137,137,136,136,136,136, 136,136,136,135,135,135,134,134,133,133,133,132,132,132,131,131, 131,130,130,130,130,130,130,129,129,129,129,129,129,128,128,127, 126,125,125,125,125,125,125,125,124,124,124,123,123,123,122,121, 121,121,121,121,121,120,120,120,120,119,119,119,119,119,119,118, 118,118,117,117,117,117,116,116,116,115,115,115,115,115,115,115, 115,114,114,114,114,113,113,113,113,113,112,112,112,111,111,111, 111,111,111,111,110,110,110,110,110,109,109,108,108,108,107,107, 107,107,106,106,106,105,105,105,105,105,105,104,104,104,104,103, 103,103,103,103,102,102,102,102,102,102,102,101,100,100,100,100, 100,100,100,100,100,99,99,99,99,99,98,98,97,97,97,97,97,96,96, 96,95,95,95,95,95,95,95,94,94,93,93,93,92,92,91,91,91,91,91,91, 91,90,90,90,90,89,89,89,89,89,88,88,88,88,88,87,87,87,87,86,85, 85,85,84,84,84,84,84,84,84,84,84,84,83,83,83,83,83,83,82,82,82, 82,82,81,81,81,81,81,81,81,80,80,80,80,80,80,80,80,79,79,79,78, 78,78,78,77,77,77,77,76,76,76,76,75,75,75,75,75,75,75,75,74,74, 74,74,74,74,73,73,73,72,72,72,71,71,71,71,70,70,69,69,69,69,68, 68,68,67,67,67,67,66,66,66,65,65,65,65,65,65,65,64,64,64,64,64, 64,64,63,63,63,63,62,62,62,62,61,61,61,61,59,59,59,59,58,58,58, 58,58,58,57,57,57,57,57,57 }; const int n4w4b2r3[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 165,164,164,164,163,163,163,163,163,163,163,162,162,162,162,162, 161,161,161,161,161,161,161,161,161,160,160,160,160,159,159,159, 159,159,159,159,159,158,158,158,158,158,158,157,157,157,157,157, 157,156,156,156,156,156,156,155,155,155,155,155,155,155,155,155, 154,154,154,154,154,154,153,153,153,153,152,152,151,151,151,151, 151,151,150,150,150,150,150,149,149,149,149,149,148,148,148,148, 148,147,147,147,147,147,146,146,146,146,146,146,145,145,145,145, 145,145,144,144,144,144,143,143,143,143,143,143,143,142,142,142, 142,141,141,140,140,140,140,140,140,140,139,138,138,137,137,137, 137,136,136,136,136,135,135,135,135,134,133,133,133,133,133,133, 132,132,132,132,131,131,131,131,131,131,130,130,130,130,130,130, 130,129,129,129,129,129,129,128,128,128,128,127,127,127,127,126, 126,126,126,125,125,125,125,125,125,125,125,125,124,124,123,123, 123,123,123,123,123,123,122,121,121,120,120,120,120,120,120,119, 119,119,118,118,118,118,118,117,117,117,117,117,117,117,116,116, 116,116,116,115,115,115,115,115,115,114,114,114,114,114,113,113, 113,113,113,112,112,112,112,111,111,111,111,111,110,110,110,110, 110,109,109,109,108,108,108,107,107,107,107,107,106,106,106,106, 105,105,105,104,104,103,103,103,103,103,103,102,101,101,101,101, 101,100,100,100,99,99,99,99,99,98,98,97,97,97,96,96,96,96,95, 95,95,95,94,94,94,94,94,94,93,93,93,93,93,93,93,93,93,92,92,92, 92,92,91,91,91,91,90,90,90,90,90,89,89,89,89,89,88,88,88,88,88, 87,87,87,87,86,86,86,85,85,84,84,84,84,84,83,82,82,81,81,80,80, 80,80,80,80,79,79,79,79,79,79,79,78,78,78,77,77,77,77,77,76,76, 76,76,76,75,75,75,74,74,74,74,73,73,73,72,72,72,72,72,72,71,71, 71,71,71,71,71,70,69,69,69,69,69,68,68,68,67,67,67,66,66,66,66, 66,66,65,65,65,65,64,64,64,64,64,63,63,63,63,63,63,63,62,62,62, 62,62,62,62,62,61,61,61,61,61,61,60,59,59,59,59,59,59,58,58,57, 57,57,57,57,57,57,57,57,57 }; const int n4w4b2r4[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 165,165,165,164,164,164,164,164,164,164,163,163,163,163,163,162, 162,162,162,161,161,161,160,160,160,160,160,160,160,159,159,159, 159,159,159,159,158,158,157,157,157,157,157,156,156,156,156,155, 155,155,155,154,154,154,154,154,153,153,153,153,152,152,152,152, 152,151,151,151,150,150,150,150,150,149,149,149,148,148,148,148, 148,148,147,147,147,146,146,146,146,146,146,146,145,145,145,145, 145,145,144,144,144,143,143,143,143,143,143,142,142,142,142,141, 141,141,141,141,141,140,140,140,140,139,139,139,139,139,138,138, 137,137,137,137,136,136,136,135,135,135,135,135,134,134,134,134, 134,134,134,133,133,133,132,132,132,132,132,132,132,131,131,131, 131,131,131,130,130,130,130,129,129,129,129,129,128,128,128,127, 127,127,127,127,127,126,126,126,125,125,125,125,124,124,124,124, 124,124,123,123,123,123,122,122,122,122,121,121,121,121,121,121, 121,121,121,120,119,119,118,118,118,117,117,117,117,117,116,116, 115,115,115,115,114,114,114,114,113,113,113,113,113,112,112,112, 112,112,112,111,111,110,110,110,109,109,109,109,109,108,108,107, 107,107,107,107,107,107,107,107,107,106,106,106,105,105,105,105, 105,105,104,104,104,104,103,103,103,102,102,102,102,102,102,101, 101,101,101,100,100,100,99,99,99,99,99,99,98,98,98,98,98,97,97, 97,96,96,96,96,95,95,95,95,95,95,95,95,94,93,93,93,92,92,92,92, 92,92,91,91,91,91,91,91,91,91,90,90,90,89,89,89,89,88,88,88,88, 88,88,88,88,88,87,86,86,86,86,86,86,86,86,86,86,85,85,85,85,84, 83,83,83,83,83,83,83,82,82,82,82,82,82,81,81,80,80,80,80,79,79, 79,79,78,78,78,78,78,78,78,78,78,77,77,77,77,77,76,76,76,76,75, 75,75,75,75,75,74,74,74,74,74,74,73,73,73,73,72,72,71,71,71,71, 70,70,70,70,70,70,69,69,69,69,68,68,68,68,68,68,68,68,67,67,67, 67,66,66,66,65,65,65,64,64,64,64,64,64,64,63,63,63,63,62,62,62, 61,61,61,61,61,61,61,60,60,60,60,59,59,58,58,57,57,57,57,57,57, 57,57,57,57 }; const int n4w4b2r5[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 165,165,165,164,164,164,164,164,164,163,163,163,163,163,162,162, 162,162,161,161,161,160,160,160,158,158,158,157,156,156,156,156, 156,156,155,155,155,155,154,154,154,153,153,153,152,152,152,151, 151,151,150,150,150,150,150,150,150,149,149,149,148,148,148,147, 147,147,147,147,146,146,146,146,146,146,145,145,145,145,144,144, 144,144,144,144,143,143,143,143,142,142,142,142,142,142,141,141, 141,141,141,140,140,139,139,139,139,139,138,137,137,137,137,137, 136,136,136,135,135,135,134,134,133,133,133,133,133,132,132,131, 131,131,131,131,131,131,131,131,131,130,130,130,130,130,130,129, 129,129,129,129,129,129,128,128,128,128,127,127,127,127,127,126, 126,126,126,126,126,126,125,125,125,125,125,125,124,124,124,124, 123,123,122,122,122,121,121,121,121,120,120,120,120,120,120,119, 119,119,119,119,119,119,119,119,119,119,119,118,118,118,118,117, 117,117,117,117,117,117,116,116,116,116,116,115,115,115,115,114, 114,114,114,114,113,113,113,113,113,113,112,112,112,112,112,111, 111,111,111,111,111,111,111,111,111,111,110,110,110,110,110,109, 109,109,108,108,108,107,106,106,106,106,106,106,105,105,105,104, 104,104,104,104,104,104,104,104,104,103,103,103,103,103,103,102, 102,102,102,101,101,101,101,101,101,101,101,101,100,100,100,100, 100,100,99,99,99,99,99,99,99,99,98,98,98,98,98,98,97,97,96,96, 96,95,95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,93,93,93,93, 92,92,92,92,92,92,92,92,91,90,90,90,90,90,90,89,89,89,89,88,88, 88,88,88,87,87,87,86,86,86,85,85,85,84,84,84,83,83,83,83,82,82, 82,82,81,81,81,81,80,80,80,80,79,79,79,79,79,79,78,78,78,78,78, 78,77,77,77,76,76,76,76,76,76,76,76,76,75,75,75,75,74,74,74,73, 73,73,73,72,72,72,72,72,72,72,71,71,71,71,71,70,70,70,70,70,70, 70,69,69,68,68,68,68,68,67,67,67,67,66,66,65,64,64,64,64,64,63, 63,63,63,62,62,62,62,61,61,61,61,60,60,60,60,60,59,59,58,58,58, 58,58,58,57,57,57,57,57 }; const int n4w4b2r6[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 165,165,165,165,165,165,164,164,164,164,164,164,163,163,163,162, 162,162,162,162,161,161,161,161,161,161,161,160,159,159,159,159, 158,158,157,157,157,156,156,156,155,155,155,155,155,154,154,154, 154,153,152,152,152,152,151,151,151,151,151,151,151,150,150,150, 150,150,149,149,149,149,149,148,148,147,147,147,147,147,147,147, 146,146,146,146,146,145,145,145,144,144,144,144,144,143,143,143, 143,142,142,142,142,141,141,140,140,140,140,140,140,139,139,139, 139,139,139,138,138,138,137,137,137,137,137,137,137,137,137,137, 137,137,136,136,136,135,135,135,135,134,134,134,134,134,134,133, 133,133,133,133,133,133,132,132,132,132,131,131,131,131,131,131, 131,130,130,129,128,128,128,128,128,127,127,127,126,126,126,126, 126,125,125,125,125,124,124,124,124,124,124,123,123,123,123,123, 123,123,123,123,122,122,122,121,121,121,120,120,120,120,119,119, 119,119,119,119,118,118,118,118,117,117,117,117,117,116,116,116, 116,116,116,116,115,115,114,114,113,113,113,113,112,112,112,112, 112,111,111,111,110,110,110,110,110,109,109,109,109,108,108,108, 107,107,107,106,106,106,106,106,106,105,105,105,105,105,105,104, 104,104,104,104,103,103,103,103,103,103,103,103,102,102,102,101, 101,101,100,100,100,99,99,99,98,98,98,98,97,97,97,97,97,97,97, 96,96,95,95,95,94,94,94,94,93,93,93,92,92,92,92,91,91,91,91,91, 91,90,90,90,90,90,90,90,90,89,89,89,89,89,89,88,87,87,87,87,87, 87,87,86,86,86,86,86,86,86,86,85,85,85,85,85,85,85,85,84,84,84, 84,84,83,83,83,83,83,82,82,82,82,82,82,82,81,81,81,81,81,81,81, 80,80,80,80,80,79,79,79,79,79,79,78,78,78,78,78,77,77,77,77,77, 76,76,76,76,76,76,76,76,75,75,75,74,74,74,73,73,73,73,73,72,72, 72,72,71,71,71,71,71,71,71,70,70,69,69,69,69,69,68,68,68,68,68, 68,68,67,67,67,67,67,66,66,66,65,65,65,65,65,65,65,65,65,64,63, 63,63,63,62,62,62,62,62,62,61,61,60,60,60,60,59,59,59,58,58,58, 58,58,57,57 }; const int n4w4b2r7[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 165,165,165,164,164,164,163,163,163,163,162,162,162,162,162,162, 161,161,161,161,161,161,161,160,160,160,159,159,159,159,159,159, 158,158,158,158,157,157,157,156,156,156,156,156,156,155,155,155, 155,155,155,154,154,153,153,153,153,153,153,152,152,152,152,152, 151,151,151,151,151,151,150,150,149,149,149,149,149,149,149,148, 148,147,147,147,147,147,147,147,147,147,147,147,146,146,146,146, 145,145,145,144,144,144,143,143,143,143,143,143,143,143,143,142, 142,142,142,142,142,141,141,141,141,141,140,140,140,140,139,139, 139,139,139,139,138,138,138,138,138,138,138,138,137,137,136,136, 136,136,135,135,135,134,134,134,134,134,134,133,133,133,133,132, 132,132,132,131,131,131,131,131,131,130,130,130,130,129,129,129, 129,129,129,128,128,127,126,126,126,126,126,126,125,125,125,125, 125,125,125,124,124,124,124,123,123,123,123,123,123,123,123,122, 122,122,121,121,121,121,121,121,120,120,120,120,120,120,119,118, 118,118,118,117,116,115,115,115,115,115,115,114,114,114,114,114, 113,113,113,113,113,113,113,113,112,111,111,111,111,111,110,110, 110,110,110,110,109,109,109,109,109,109,108,108,108,108,107,107, 107,106,106,106,106,106,106,106,106,106,106,106,106,105,105,104, 104,103,103,103,103,103,103,103,102,102,101,101,101,101,101,100, 100,100,100,98,98,98,98,98,98,98,97,97,97,97,97,97,96,96,96,96, 96,96,96,96,96,96,96,96,95,95,95,95,95,95,93,93,93,93,93,93,93, 92,92,92,92,92,92,92,91,91,90,90,90,89,89,89,89,89,89,88,88,88, 87,87,87,87,86,86,86,86,86,85,85,85,85,85,84,84,84,84,83,83,83, 82,82,82,82,82,82,82,82,82,81,81,81,81,81,80,80,80,80,80,79,79, 79,79,79,79,78,78,78,77,77,77,77,77,77,77,77,77,76,76,76,76,75, 75,74,74,74,74,74,74,74,73,73,73,72,72,72,72,72,71,71,70,70,70, 69,69,69,69,68,68,67,67,67,67,67,66,66,66,66,65,65,65,64,64,64, 63,63,62,62,62,62,61,61,61,61,61,60,60,60,60,59,59,59,58,58,58, 57,57,57,57,57,57,57,57 }; const int n4w4b2r8[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 165,165,164,164,164,164,164,164,163,163,163,163,163,162,162,162, 162,161,161,161,161,161,161,161,160,160,160,160,160,159,159,159, 159,158,158,158,158,158,158,157,157,157,156,156,156,156,156,155, 155,155,155,154,154,154,154,154,154,153,153,153,153,153,153,152, 152,152,152,151,151,150,150,150,150,149,149,149,149,149,148,148, 147,147,147,147,147,147,147,146,146,146,145,145,145,145,144,144, 144,143,142,142,142,142,141,141,141,141,141,140,140,140,140,139, 139,139,139,139,139,138,138,138,138,138,138,137,137,137,136,136, 136,136,135,135,135,135,135,134,134,134,134,134,134,134,133,133, 132,132,132,131,131,130,130,130,129,129,129,128,128,128,127,127, 127,127,127,126,126,126,126,126,126,125,125,125,125,125,125,125, 125,125,124,124,123,123,123,123,123,122,122,122,122,122,122,120, 120,120,120,119,119,119,119,119,119,119,119,119,119,119,119,119, 119,118,118,117,117,117,117,117,116,116,116,116,116,115,115,114, 114,114,113,113,113,113,112,112,112,112,112,111,111,111,111,111, 110,110,110,110,110,110,110,109,109,109,109,109,108,108,108,108, 108,107,107,107,107,107,107,107,107,107,107,106,106,106,105,105, 105,105,104,104,104,103,103,103,102,102,102,102,102,102,102,101, 101,101,101,100,100,100,100,100,100,100,100,98,98,98,98,98,98, 98,97,97,97,97,97,97,96,96,96,96,96,96,95,95,95,94,93,93,93,93, 93,93,92,92,92,92,91,91,91,90,90,90,90,90,90,89,89,89,89,89,89, 89,88,87,87,87,87,87,86,86,86,86,86,86,86,86,85,85,85,85,84,84, 83,83,83,83,83,81,81,81,80,80,80,80,80,79,79,79,79,79,78,78,77, 77,77,77,77,77,77,76,76,76,76,76,76,76,75,75,75,74,74,74,74,73, 73,72,72,72,72,72,72,71,71,71,71,71,71,70,70,70,70,70,69,69,69, 69,69,69,68,68,68,68,68,67,67,67,67,67,66,65,65,65,65,65,65,65, 64,64,64,64,64,64,64,64,63,63,63,63,62,62,62,62,61,61,61,61,61, 61,61,61,61,60,60,60,60,60,60,59,59,58,58,58,58,58,58,58,57,57, 57,57,57,57,57,57 }; const int n4w4b2r9[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 165,165,165,165,164,164,164,164,163,163,163,163,163,163,162,162, 161,161,161,161,161,161,161,160,160,160,160,159,159,159,159,159, 159,158,158,157,156,156,156,156,156,156,155,155,155,155,155,154, 154,153,153,153,153,153,153,153,153,152,152,152,152,152,151,151, 150,150,150,150,150,150,150,150,149,149,149,149,149,149,149,149, 148,148,148,148,148,147,147,147,147,147,147,147,146,146,145,144, 144,144,144,144,143,143,143,142,142,142,142,142,142,141,141,141, 140,140,139,139,139,139,139,138,138,138,138,137,137,137,136,136, 136,136,136,136,136,136,136,135,135,135,135,135,134,134,134,134, 134,133,133,133,133,133,132,132,132,132,132,132,132,131,131,131, 131,131,130,130,130,130,129,129,129,129,129,129,129,128,128,128, 128,127,127,127,126,126,125,125,125,125,125,125,124,124,124,124, 124,124,123,123,123,123,123,123,122,122,122,122,121,121,121,121, 121,121,120,120,120,119,119,119,119,119,119,118,118,118,118,118, 118,118,118,117,117,117,117,117,116,116,116,116,115,115,115,115, 115,114,114,114,113,113,113,113,112,112,112,111,111,110,110,110, 109,109,109,109,109,109,108,108,108,108,108,107,107,107,107,107, 107,106,106,106,106,106,106,105,105,105,104,104,104,104,104,103, 103,103,103,102,102,102,102,102,102,101,101,101,100,100,100,100, 99,98,98,98,97,97,96,96,95,94,94,94,94,94,94,94,93,92,92,92,92, 92,92,92,92,91,91,91,91,90,90,90,90,90,89,89,89,89,89,88,88,87, 86,86,86,86,85,85,85,85,85,85,85,84,84,84,84,83,83,83,83,82,82, 82,82,82,82,82,81,81,80,80,80,80,80,79,79,79,79,79,79,79,78,78, 78,78,78,78,78,77,77,77,77,77,77,76,76,76,75,75,75,74,74,74,74, 73,73,73,73,72,72,72,72,72,71,71,71,71,71,71,71,70,70,70,70,70, 70,70,70,69,69,69,69,69,69,69,68,68,68,68,68,67,67,67,67,67,67, 66,66,65,65,65,64,64,64,64,64,64,64,64,63,63,63,63,63,63,63,63, 62,62,62,62,62,61,61,61,61,61,60,60,60,60,60,59,59,59,59,59,59, 59,59,59,58,58,57,57 }; const int n4w4b3r0[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 209,209,209,207,207,206,206,206,205,205,204,204,203,203,201,201, 200,199,199,198,198,198,197,197,195,195,195,195,194,194,194,194, 194,194,194,193,193,193,193,192,192,192,191,191,190,190,190,189, 189,188,188,187,186,186,186,186,185,184,184,183,183,182,181,180, 180,179,177,177,176,175,175,174,174,173,173,173,173,173,173,172, 171,171,170,170,169,169,169,169,169,169,168,168,168,168,167,167, 167,166,166,166,165,165,165,165,165,165,164,163,163,163,162,162, 162,161,161,160,160,160,159,159,159,158,158,158,157,156,156,156, 156,156,155,155,154,154,154,154,154,154,153,152,151,151,151,150, 150,150,150,149,149,148,148,148,147,147,146,146,146,144,144,144, 143,143,143,143,142,142,142,141,140,139,139,138,138,138,138,137, 137,137,137,137,137,136,136,135,134,134,134,134,133,133,133,132, 132,131,131,129,129,129,129,128,127,127,127,126,125,125,124,123, 123,122,122,122,121,121,121,120,120,120,120,119,119,119,119,118, 118,117,117,117,117,116,116,115,115,114,114,114,113,112,112,111, 111,110,110,109,108,107,107,106,106,106,105,105,105,104,104,104, 104,103,103,103,103,102,102,101,101,101,101,101,99,99,98,97,97, 96,96,95,95,94,94,94,94,94,94,93,93,93,93,92,92,92,92,91,91,90, 90,89,89,88,88,87,86,86,86,86,86,86,85,85,85,84,83,83,83,82,82, 82,81,81,80,80,80,79,78,78,78,78,78,78,78,77,76,76,76,76,75,75, 74,73,73,73,73,73,72,72,71,71,71,71,70,70,68,67,67,66,66,66,65, 65,65,65,65,65,64,64,64,63,63,62,62,62,61,61,61,59,59,59,59,59, 58,58,58,57,57,56,56,56,56,55,54,54,54,54,54,54,53,51,51,51,51, 51,51,51,50,50,50,49,49,49,48,48,48,47,47,47,46,45,45,44,43,43, 43,42,42,42,41,41,38,37,37,36,36,36,36,36,36,36,35,35,35,34,34, 34,34,34,34,33,33,33,32,32,31,31,30,30,30,30,30,30,30,29,27,25, 25,25,24,24,24,24,24,23,23,22,22,22,20,20,20,20,19,19,18,18,18, 17,17,16,16,16,16,15,15,15,15,14,14,14,13,13,13,13 }; const int n4w4b3r1[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 209,208,208,208,208,208,208,207,205,203,203,203,202,201,201,201, 201,200,200,200,200,200,200,199,198,198,198,197,197,197,197,196, 196,196,195,195,194,194,194,193,192,192,192,191,191,191,191,190, 190,190,189,188,188,188,186,186,184,184,183,182,182,181,181,181, 181,180,179,179,178,178,177,177,176,175,174,174,174,174,173,173, 173,173,173,172,172,171,171,171,170,170,170,170,170,169,168,168, 168,167,167,165,165,164,164,164,163,163,163,163,162,162,161,161, 160,159,159,158,157,157,157,157,157,157,156,156,156,156,155,155, 152,152,152,152,151,150,150,150,149,149,147,147,147,146,145,144, 144,144,144,144,143,143,143,142,142,141,141,141,141,141,140,138, 138,138,136,135,135,135,135,135,135,133,133,133,133,133,132,132, 132,131,131,131,130,130,130,130,129,129,129,128,128,127,126,125, 125,125,125,124,124,124,124,124,124,124,123,123,123,122,122,122, 122,122,122,122,121,121,121,120,120,120,120,119,119,119,119,118, 117,117,117,117,116,116,116,116,115,114,114,114,114,113,113,113, 113,113,113,111,111,110,109,107,107,106,105,105,105,104,104,104, 103,103,102,102,102,101,101,100,99,99,98,98,98,98,97,97,97,97, 96,96,96,96,96,96,96,96,95,95,95,94,93,93,92,92,91,91,91,91,90, 89,89,88,88,87,87,87,87,86,86,86,86,85,84,84,84,83,83,83,81,81, 81,81,81,80,80,80,80,80,79,79,79,79,78,78,78,78,77,77,77,76,76, 76,75,74,74,74,73,73,73,73,73,73,70,70,70,70,70,70,68,68,67,67, 66,66,66,66,65,65,65,65,65,64,64,64,64,63,62,61,61,60,60,59,58, 57,57,56,56,56,55,54,54,53,53,52,52,52,52,52,51,51,50,50,49,49, 49,49,49,48,48,48,47,47,46,45,45,45,45,44,43,43,42,42,41,41,41, 41,41,41,40,40,40,40,39,39,39,38,37,37,36,36,36,36,36,35,34,34, 34,33,33,32,32,32,32,32,31,31,31,30,29,28,27,27,27,27,26,25,25, 25,24,23,23,23,22,22,22,21,21,21,20,19,19,19,19,18,18,18,18,17, 17,17,17,16,16,16,15,15,14,14,14,14,14,13,13,13 }; const int n4w4b3r2[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 209,209,208,208,206,205,205,204,204,204,204,203,203,203,202,202, 201,201,201,200,200,200,200,200,200,199,199,199,199,199,199,199, 198,198,197,197,196,196,196,195,195,195,195,194,194,193,193,193, 193,193,192,192,192,190,190,190,190,190,189,189,189,188,188,187, 186,186,185,184,184,184,183,183,182,182,182,182,181,181,181,181, 181,181,180,180,179,179,179,178,177,177,177,176,175,175,175,175, 174,174,174,173,173,173,172,172,171,171,171,171,171,169,169,168, 168,167,167,167,167,165,165,164,164,164,163,163,163,163,162,162, 162,162,162,162,160,160,160,160,159,159,158,158,158,158,157,157, 156,156,156,156,155,155,154,153,153,153,153,152,151,151,151,151, 149,149,148,148,147,147,147,146,145,144,143,142,142,141,141,141, 141,140,140,140,140,139,139,139,138,138,138,138,137,137,136,135, 135,135,134,134,134,134,133,133,133,132,132,132,132,131,130,130, 130,130,129,129,128,128,127,127,127,127,127,126,126,126,126,126, 125,125,125,124,124,123,123,122,122,122,122,121,121,121,121,120, 119,119,119,119,118,118,118,117,117,117,116,116,116,115,115,115, 115,114,114,114,113,113,112,112,112,112,112,111,109,108,108,107, 105,105,104,104,103,103,103,102,102,102,101,100,100,99,99,98, 98,98,98,98,97,96,96,96,96,96,95,94,94,93,92,92,92,91,91,90,90, 89,89,89,88,88,88,87,87,86,85,84,84,84,82,82,82,82,82,81,81,80, 80,80,80,80,79,79,79,79,78,78,78,78,78,77,77,76,76,75,75,75,74, 74,74,72,72,72,72,72,70,70,70,70,70,70,70,69,69,69,68,67,65,65, 65,65,65,65,64,64,63,63,62,62,61,59,59,58,57,57,56,56,56,56,55, 55,54,53,53,52,51,51,51,50,50,50,49,49,48,47,46,46,46,44,44,43, 43,43,43,41,40,40,40,40,39,39,39,39,38,38,38,38,37,37,37,37,36, 35,35,35,35,34,34,34,33,33,33,32,32,32,32,31,31,31,31,31,30,30, 30,30,29,29,29,28,28,28,28,27,26,26,26,25,25,24,24,24,24,24,23, 23,23,22,21,20,19,19,19,18,18,17,17,17,16,15,15,15,15,15,14,14, 14,13 }; const int n4w4b3r3[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 209,208,208,208,208,207,207,206,206,206,206,206,205,205,205,204, 203,202,202,201,201,200,200,200,199,199,199,198,197,197,197,196, 196,196,196,196,195,195,194,194,193,192,192,192,191,191,191,191, 191,190,190,189,189,188,187,187,187,187,187,186,186,186,186,186, 185,185,184,183,183,183,183,182,182,182,182,182,181,180,180,180, 180,179,179,179,178,178,178,178,178,177,177,177,176,176,175,175, 175,174,173,173,173,170,170,170,169,169,169,169,169,169,169,168, 168,168,168,167,166,165,164,164,164,163,163,163,161,161,161,161, 160,160,159,158,158,158,158,157,157,157,156,156,156,156,154,154, 153,153,153,152,152,151,151,150,150,150,149,149,149,148,148,148, 147,146,146,145,145,144,144,143,143,143,143,142,142,141,141,141, 140,139,137,137,137,137,136,135,135,134,134,134,134,133,133,133, 132,132,132,131,131,131,131,131,130,130,130,129,129,129,128,128, 127,127,126,126,126,125,124,124,124,124,122,122,121,121,121,121, 120,119,119,119,119,119,118,118,118,117,117,117,117,116,116,116, 116,116,115,115,115,114,114,114,114,113,113,112,112,111,111,111, 110,110,110,108,108,107,107,107,106,105,105,104,104,104,104,103, 103,103,101,101,101,100,100,99,99,99,99,97,97,96,96,96,95,95, 95,95,94,93,92,92,92,91,91,91,91,91,91,90,90,89,89,88,88,87,87, 87,87,87,86,86,84,83,83,81,81,81,80,80,80,79,79,78,78,77,76,76, 76,75,73,73,72,72,71,71,70,70,69,69,69,67,66,66,65,65,65,64,64, 64,64,64,64,64,64,64,63,63,63,63,63,62,62,62,62,62,62,61,60,60, 59,59,59,59,59,59,58,58,58,58,57,57,57,57,57,56,56,56,56,56,55, 55,55,55,54,54,53,53,53,53,51,51,51,50,49,48,47,47,47,46,46,45, 45,44,44,44,44,44,44,43,43,43,43,43,42,42,42,42,39,39,38,37,36, 36,36,35,35,35,34,34,34,34,33,33,33,32,32,32,31,31,31,31,31,30, 30,30,30,30,29,29,29,29,28,27,26,26,26,25,24,23,23,23,22,22,22, 21,20,19,19,18,18,17,17,17,17,16,15,15,15,15,14,14,14,14,13,13 }; const int n4w4b3r4[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 209,209,208,208,207,206,206,205,205,205,204,203,201,201,201,201, 201,201,200,200,200,200,200,200,199,199,198,198,197,197,196,196, 195,195,194,193,193,193,191,191,191,191,190,190,190,190,190,189, 189,188,188,187,187,186,186,186,185,184,184,184,183,183,182,182, 180,180,180,179,179,179,179,178,178,177,177,176,176,175,175,175, 174,174,173,173,173,172,172,172,172,171,170,170,168,168,168,168, 167,167,166,166,166,165,165,164,164,164,163,163,163,163,162,161, 161,161,160,160,160,159,159,159,158,157,157,156,156,156,156,155, 154,153,153,153,153,152,152,151,149,149,149,149,149,149,149,148, 148,147,147,147,146,145,145,145,144,143,143,143,143,143,143,143, 142,142,141,140,140,139,139,139,139,139,139,138,138,138,138,137, 136,135,135,135,135,134,134,134,132,132,132,132,131,131,131,130, 130,130,130,129,129,129,128,128,128,128,128,127,127,127,127,126, 125,125,125,124,123,123,123,123,123,123,123,122,121,120,120,120, 120,120,119,119,119,119,119,118,118,118,117,117,117,116,116,116, 116,116,116,115,115,115,115,115,115,115,114,114,114,113,113,113, 113,112,111,111,110,109,109,108,108,108,108,108,107,107,107,107, 106,104,104,103,103,102,102,102,102,101,101,100,100,100,100,100, 99,99,98,98,97,96,96,96,96,95,95,95,95,93,92,92,91,90,89,89,89, 89,88,87,87,85,85,84,84,84,83,83,82,82,82,81,81,81,80,79,79,78, 77,77,77,76,76,75,74,74,74,73,73,71,71,70,69,69,69,69,69,68,68, 68,67,67,66,66,66,65,64,64,64,63,63,63,63,61,60,60,59,59,58,58, 57,57,56,56,55,55,55,54,54,54,54,54,54,54,54,53,52,52,52,52,52, 51,50,50,49,49,48,47,47,47,47,47,46,46,46,45,45,45,43,43,43,43, 42,41,41,40,40,39,39,38,38,37,37,37,37,37,36,36,36,35,35,35,34, 34,34,34,34,33,33,33,32,32,32,31,31,31,30,30,29,29,28,28,28,28, 27,27,27,27,27,26,25,25,25,25,25,24,23,23,23,23,23,22,22,21,21, 21,21,21,20,20,19,19,18,18,18,18,17,17,17,17,16,16,16,15,14,14, 13,13 }; const int n4w4b3r5[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 209,209,208,207,207,206,206,206,206,205,205,205,205,205,205,205, 204,204,203,203,202,202,202,202,201,200,200,200,200,199,199,199, 198,198,198,198,198,198,197,197,196,196,195,195,194,194,194,194, 194,193,193,192,192,192,191,191,190,190,190,190,189,189,189,189, 188,188,188,187,187,186,186,186,185,185,184,184,183,183,183,182, 182,181,181,179,179,179,179,178,177,177,176,176,176,174,173,173, 172,172,172,172,171,171,171,171,171,170,170,169,169,169,169,169, 169,168,168,168,168,167,167,167,166,166,165,165,164,164,164,162, 161,161,161,160,160,160,159,159,159,159,158,158,158,157,157,157, 156,156,155,154,154,153,153,153,152,152,152,150,149,149,148,147, 147,147,147,144,144,144,144,142,142,141,141,141,140,140,139,139, 139,138,138,138,138,138,137,136,136,135,135,134,133,132,131,131, 131,130,129,129,129,128,128,127,127,126,125,124,124,124,123,123, 123,123,122,122,122,122,121,120,120,120,120,118,118,118,117,117, 117,116,115,115,115,115,114,112,112,112,112,111,111,111,110,110, 110,110,109,109,109,108,107,106,106,106,105,105,105,104,104,104, 103,103,102,102,102,102,101,101,101,101,100,100,100,99,99,98, 97,97,96,96,96,96,96,95,95,95,94,94,94,93,93,92,92,92,91,91,91, 91,91,90,90,90,89,88,88,87,87,87,85,84,83,83,82,82,81,81,81,81, 81,81,80,80,79,79,79,78,78,78,77,77,77,77,77,76,76,75,75,74,74, 72,71,71,70,70,70,70,69,69,69,69,69,68,68,67,67,67,67,66,66,66, 66,66,65,65,64,64,64,64,64,63,63,63,62,62,62,61,61,60,60,59,59, 58,57,56,56,56,56,55,55,55,54,54,53,53,53,53,52,52,52,49,48,48, 47,46,45,44,43,42,42,41,40,40,40,40,40,40,39,39,39,38,37,37,36, 36,36,35,34,33,33,33,33,32,32,32,32,32,32,32,32,31,31,31,30,30, 30,29,29,29,28,28,28,27,27,27,27,27,26,26,26,26,26,26,26,26,25, 25,24,24,24,24,24,24,23,23,23,22,22,21,21,21,21,20,20,19,19,19, 19,18,18,18,18,18,17,17,17,16,16,16,16,16,15,14,13,13 }; const int n4w4b3r6[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 209,209,209,208,208,208,207,206,206,206,205,205,204,204,203,202, 202,202,202,202,202,201,200,200,199,198,198,198,197,197,196,195, 194,194,193,193,193,193,192,192,191,191,190,190,190,190,190,190, 189,189,189,189,189,188,187,186,186,186,186,186,185,185,184,184, 183,183,183,183,183,183,183,182,182,181,181,181,179,179,179,178, 178,177,177,177,176,175,175,174,174,174,174,174,172,171,171,170, 169,169,169,169,169,168,168,168,168,167,167,167,166,166,166,166, 166,165,165,163,163,163,163,163,162,161,161,161,161,160,160,160, 159,159,159,159,159,158,158,158,158,158,157,157,157,156,156,155, 155,155,155,154,154,154,154,154,154,153,153,153,153,153,153,151, 151,151,151,151,150,150,150,149,149,149,149,149,149,149,148,148, 148,147,146,146,146,146,146,145,145,144,144,144,143,143,143,143, 142,142,141,141,141,140,139,139,137,137,137,137,136,136,135,135, 135,134,133,132,132,132,132,132,131,131,130,128,127,127,127,125, 125,125,125,125,124,124,123,123,123,123,122,122,122,122,121,121, 121,120,120,119,117,117,117,117,117,116,115,115,115,114,114,114, 113,113,113,113,111,111,110,110,110,110,110,110,109,109,109,108, 107,105,105,105,105,105,104,104,103,102,102,102,101,101,101,101, 101,101,100,100,99,99,98,98,98,97,96,96,96,95,95,95,95,95,94, 94,94,94,93,91,91,90,90,90,90,89,88,88,88,88,88,88,87,87,86,86, 86,85,85,85,85,85,84,84,83,83,83,83,82,82,82,82,82,80,79,79,78, 78,77,77,77,76,76,76,76,75,75,74,74,74,73,73,73,72,72,72,72,71, 71,70,70,70,68,68,68,67,66,66,65,65,65,63,63,62,62,61,60,60,60, 60,59,59,59,59,58,57,57,57,57,55,55,54,54,54,53,53,53,53,53,52, 52,52,51,51,51,51,51,51,50,50,50,49,49,49,48,48,48,47,47,47,47, 46,46,46,45,44,44,42,42,41,41,41,41,40,40,40,39,39,38,38,38,37, 37,37,36,35,35,34,34,34,33,32,31,31,31,31,30,30,29,29,28,27,26, 25,24,24,24,24,23,22,22,22,21,20,20,20,20,19,18,17,17,17,16,16, 15,15,15,14 }; const int n4w4b3r7[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 209,209,209,208,208,207,207,207,207,207,206,206,205,205,205,204, 204,204,204,203,203,203,203,202,202,202,201,201,201,201,200,200, 200,200,200,200,200,199,199,198,198,198,197,197,197,196,195,195, 195,195,194,193,193,193,192,192,192,191,191,190,190,190,190,190, 190,189,189,188,188,188,187,187,187,187,187,186,186,185,184,184, 184,184,184,183,183,183,182,182,181,181,180,180,179,179,178,178, 178,177,177,176,176,176,175,175,175,174,174,173,173,172,172,172, 172,171,171,171,171,171,170,170,170,170,169,169,169,169,169,168, 168,167,167,167,167,167,166,166,165,165,165,164,163,163,163,162, 162,161,160,160,159,158,157,157,156,155,155,155,155,154,152,152, 151,150,150,150,150,149,147,146,146,145,145,145,144,143,143,142, 142,141,141,141,141,140,139,139,139,138,138,137,137,137,136,135, 135,135,134,133,131,131,131,130,129,129,129,129,128,128,128,127, 127,126,126,126,125,125,125,125,124,124,124,123,123,123,122,122, 122,121,121,121,121,120,120,120,119,119,118,118,117,117,116,116, 116,116,115,115,115,115,114,114,113,111,111,111,111,110,110,109, 109,108,108,108,108,107,107,106,105,105,105,103,103,103,102,102, 102,102,101,101,100,100,100,99,99,99,98,98,98,98,98,97,97,97, 96,95,95,95,94,94,93,93,93,93,93,92,92,92,91,91,91,91,91,90,90, 90,89,88,88,88,88,87,87,87,87,86,86,86,85,85,84,84,83,83,83,82, 81,81,81,81,80,79,79,78,77,77,76,76,75,75,74,74,73,73,72,71,70, 70,70,70,68,68,68,67,67,67,66,65,65,65,65,64,64,63,62,61,61,61, 61,60,60,59,59,59,59,58,58,58,58,58,58,58,58,57,56,56,56,56,55, 55,55,54,54,54,54,54,54,53,53,52,52,52,51,51,50,50,50,49,49,48, 48,48,47,46,45,45,45,44,44,43,43,42,41,41,41,40,38,38,38,38,38, 37,36,36,36,35,35,33,32,32,32,30,30,30,30,30,29,29,29,29,28,28, 27,27,27,26,26,25,25,25,24,24,24,23,23,23,22,22,22,22,21,21,21, 20,19,18,18,18,18,18,18,17,17,17,17,17,16,16,15,15,14,14,14,13 }; const int n4w4b3r8[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 209,209,208,208,207,206,206,206,205,205,205,204,204,204,204,203, 203,203,203,203,202,202,202,202,202,202,202,201,201,201,200,200, 199,199,199,199,198,198,197,196,195,195,195,195,195,195,195,194, 194,194,193,193,191,191,191,191,191,191,190,190,189,189,188,187, 187,187,186,186,186,186,185,185,185,185,184,184,183,183,183,183, 182,182,182,182,182,181,181,181,180,180,179,178,178,178,176,175, 175,175,175,174,174,174,173,173,172,171,170,169,168,167,167,167, 167,167,166,166,165,165,164,164,164,164,164,164,163,163,163,163, 163,162,162,162,162,161,160,160,159,159,158,158,157,157,157,156, 155,155,155,153,153,153,152,152,152,152,151,150,149,149,148,148, 148,148,148,148,147,147,146,146,146,146,145,144,143,143,143,142, 141,141,140,140,139,138,138,138,138,137,137,137,137,136,135,135, 134,134,133,133,133,133,133,133,132,131,131,131,131,130,130,130, 130,130,130,129,129,128,128,127,126,126,126,125,125,124,123,122, 122,122,121,121,121,121,121,120,120,120,118,118,118,118,115,115, 115,115,115,113,112,111,111,111,111,111,111,111,111,111,110,109, 109,109,108,108,108,108,107,107,107,107,106,106,106,105,105,105, 104,104,104,104,104,104,104,104,103,103,103,103,102,102,101,101, 100,100,99,98,97,97,96,96,96,96,96,93,93,93,92,92,92,92,91,91, 91,91,90,90,90,90,90,90,89,89,89,89,87,87,86,86,86,85,84,84,83, 83,83,83,83,83,83,82,82,82,82,82,82,81,81,80,79,79,78,77,77,76, 75,75,75,75,74,73,73,73,73,72,72,71,71,71,71,70,70,69,69,69,68, 68,67,66,66,66,66,65,65,64,64,64,64,64,63,62,62,61,61,61,60,60, 60,59,59,59,59,59,58,58,57,57,56,55,54,54,54,52,52,51,50,50,50, 50,50,49,49,49,49,47,47,47,47,46,46,45,45,45,45,43,43,42,42,40, 40,40,39,39,39,39,38,38,38,38,37,37,37,36,36,36,36,35,35,34,33, 33,33,32,31,31,31,29,28,27,27,27,27,26,26,26,26,26,25,25,25,24, 24,21,21,20,20,19,19,19,18,17,17,16,16,16,16,16,15,14,14,13,13, 13,13,13 }; const int n4w4b3r9[] = { 1000, // Capacity 500, // Number of items // Size of items (sorted) 208,208,208,207,207,206,206,205,205,205,205,204,203,203,202,202, 201,201,201,201,200,199,199,199,199,197,197,196,196,196,195,195, 195,195,195,194,194,193,193,193,193,192,191,190,190,189,189,189, 188,188,188,187,187,187,186,186,185,185,185,184,184,183,183,182, 182,181,181,181,181,181,181,180,180,179,179,179,177,177,177,176, 176,175,175,175,175,175,174,173,173,173,172,171,171,171,171,171, 170,170,170,170,169,169,169,169,169,168,168,167,166,166,166,165, 165,164,163,162,162,162,162,161,161,160,159,159,159,158,158,158, 158,157,157,157,155,155,155,154,154,154,153,153,152,152,151,150, 150,148,148,147,147,147,147,146,145,144,144,144,144,144,143,143, 143,143,143,143,143,142,142,142,142,141,140,140,139,139,139,139, 139,139,139,138,138,138,138,138,137,137,136,136,135,134,134,134, 133,133,133,132,131,131,130,130,130,129,129,129,128,127,127,127, 126,126,126,126,126,126,126,125,125,125,125,124,123,123,123,123, 123,123,121,121,121,121,120,120,120,120,120,119,119,119,118,118, 118,118,118,118,117,116,116,116,116,115,115,114,114,113,113,113, 112,112,110,109,109,109,109,108,107,107,106,106,106,106,105,105, 105,105,105,104,103,102,101,101,101,101,100,100,98,98,98,97,97, 97,97,97,96,95,95,94,94,93,93,92,92,91,91,91,90,90,89,89,89,89, 89,89,88,88,87,87,87,86,86,85,85,84,84,83,83,81,81,81,80,80,79, 78,78,78,78,77,77,77,77,76,76,76,75,75,74,74,73,73,72,72,72,72, 72,71,70,69,67,67,67,67,67,66,64,64,64,64,64,63,63,62,62,62,62, 61,61,61,60,60,60,60,59,59,58,58,58,57,57,57,57,56,55,55,55,55, 55,55,54,54,54,54,54,53,53,53,52,50,48,47,47,47,46,46,46,45,45, 45,45,45,44,43,42,42,40,40,39,39,38,38,38,38,38,37,37,36,36,36, 34,34,34,34,33,33,33,33,33,33,32,32,32,31,31,31,31,30,30,30,29, 29,29,28,28,28,27,26,26,26,25,25,25,24,24,23,23,23,23,22,22,22, 21,21,20,19,18,18,18,18,18,17,17,17,17,16,16,15,15,14,14,14,14, 13 }; /* * Data set 3 * */ const int hard0[] = { 100000, // Capacity 200, // Number of items // Size of items (sorted) 34978,34849,34703,34608,34598,34524,34356,34308,34069,34049,33895, 33842,33806,33738,33716,33590,33546,33507,33468,33465,33383,33190, 33075,32976,32897,32762,32696,32638,32553,32398,32230,32176,31967, 31954,31903,31782,31724,31686,31597,31561,31532,31499,31346,30943, 30915,30869,30766,30683,30678,30644,30559,30448,30315,30238,30125, 29974,29947,29890,29886,29858,29856,29783,29697,29438,29427,29301, 29174,29173,29123,29117,29116,29095,29094,29063,29041,29038,28977, 28946,28921,28910,28842,28703,28360,28350,28305,28302,28225,28160, 28094,28040,28020,27901,27775,27765,27688,27439,27425,27394,27365, 27349,27284,27180,26935,26881,26867,26795,26703,26651,26550,26432, 26375,26368,26244,26204,26192,26181,26158,26133,26067,25945,25906, 25759,25698,25688,25652,25615,25530,25528,25366,25324,25273,25142, 24852,24846,24658,24592,24564,24463,24457,24374,24359,24332,23987, 23956,23952,23932,23895,23837,23795,23774,23663,23621,23502,23453, 23430,23366,23178,23090,22991,22942,22743,22442,22432,22415,22338, 22134,22081,22014,21950,21948,21796,21784,21727,21722,21557,21498, 21480,21315,21193,21127,21060,20997,20837,20813,20693,20693,20686, 20677,20676,20664,20663,20634,20616,20570,20566,20496,20441,20307, 20226,20114 }; const int hard1[] = { 100000, // Capacity 200, // Number of items // Size of items (sorted) 34991,34949,34847,34577,34461,34343,34318,34316,34302,34290,34282, 34279,34046,33944,33814,33813,33753,33653,33620,33584,33554,33544, 33426,33414,33376,33273,33270,33170,33034,33007,32957,32897,32784, 32773,32528,32499,32423,32400,32356,32302,32090,31863,31850,31841, 31840,31775,31773,31655,31613,31608,31587,31535,31378,31197,31194, 31179,30992,30899,30780,30742,30685,30645,30641,30610,30498,30336, 30327,30271,30105,29975,29957,29924,29870,29815,29777,29754,29658, 29648,29553,29481,29416,29415,29410,29408,29361,29316,29002,28987, 28947,28897,28801,28636,28538,28507,28435,28360,28330,28063,28007, 27983,27937,27879,27760,27715,27517,27230,27146,27072,27028,26985, 26894,26840,26799,26797,26717,26582,26511,26472,26469,26386,26301, 26117,26110,26031,26030,25705,25532,25524,25499,25441,25421,25356, 25310,25227,25118,25073,24989,24955,24844,24792,24625,24562,24526, 24451,24299,24290,23927,23885,23873,23850,23795,23583,23473,23438, 23408,23354,23328,23260,23145,23128,22994,22744,22687,22596,22581, 22516,22467,22412,22337,22253,22226,22206,22177,22036,21997,21933, 21807,21749,21669,21656,21585,21525,21506,21437,21415,21316,21222, 21214,21098,20944,20819,20718,20709,20488,20458,20422,20324,20233, 20137,20008 }; const int hard2[] = { 100000, // Capacity 200, // Number of items // Size of items (sorted) 34953,34942,34849,34732,34683,34640,34590,34446,34315,34314,34236, 34088,34060,33942,33861,33858,33811,33800,33764,33725,33709,33475, 33415,33402,33367,33286,33280,33093,33083,33047,33005,32966,32931, 32906,32787,32731,32716,32708,32670,32651,32621,32560,32555,32544, 32387,32363,32186,32143,32094,32072,31982,31912,31830,31759,31646, 31641,31548,31505,31411,31408,31383,31192,31155,31153,31083,30955, 30726,30648,30531,30528,30369,30250,30226,30165,30111,29999,29973, 29899,29787,29512,29509,29501,29429,28933,28887,28882,28849,28841, 28823,28595,28497,28486,28399,28269,28099,28021,28006,27873,27850, 27672,27670,27607,27402,27317,27290,27211,27163,27104,27052,27012, 26866,26786,26656,26598,26477,26474,26470,26411,26397,26352,26176, 26155,26076,26019,25983,25932,25802,25702,25474,25412,25279,25253, 25192,25058,25039,24864,24654,24595,24508,24497,24496,24376,24345, 24324,24250,24202,24093,24069,23977,23833,23793,23758,23407,23207, 23152,23080,23023,22961,22772,22764,22743,22739,22695,22660,22655, 22649,22587,22582,22579,22579,22576,22572,22467,22412,22346,22284, 22190,21694,21671,21599,21567,21546,21502,21499,21459,21338,21299, 21148,21132,21004,20926,20822,20818,20701,20654,20643,20633,20474, 20396,20009 }; const int hard3[] = { 100000, // Capacity 200, // Number of items // Size of items (sorted) 34746,34740,34738,34679,34566,34566,34437,34404,34037,33786,33749, 33609,33606,33587,33508,33490,33363,33346,33279,33269,33211,33145, 33032,33000,32818,32811,32703,32481,32478,32414,32307,32032,32009, 31971,31940,31937,31851,31751,31678,31598,31575,31503,31491,31462, 31449,31414,31299,31232,31037,31025,30940,30934,30865,30720,30704, 30677,30499,30394,30265,30264,30249,30188,29896,29750,29750,29623, 29553,29435,29404,29376,29288,29280,29216,29162,29068,29036,29022, 28885,28758,28746,28566,28462,28308,28077,27961,27896,27800,27680, 27509,27509,27504,27482,27474,27402,27327,27302,27299,27237,27205, 27169,27019,27008,26993,26946,26737,26667,26663,26635,26506,26375, 26310,26229,26132,26075,26036,26011,25993,25726,25604,25579,25501, 25466,25454,25349,25296,25225,25143,25050,25028,24838,24796,24724, 24688,24585,24518,24458,24451,24312,24256,24239,24212,24175,23857, 23791,23680,23452,23406,23405,23369,23367,23346,23336,23290,23174, 23096,23070,23057,22950,22917,22896,22893,22823,22781,22678,22352, 22351,22308,22268,22220,22217,22195,22097,22063,22036,21965,21856, 21751,21615,21613,21585,21415,21346,21328,21310,21299,21269,21267, 21117,20919,20903,20847,20778,20773,20740,20664,20633,20600,20530, 20423,20033 }; const int hard4[] = { 100000, // Capacity 200, // Number of items // Size of items (sorted) 35000,34970,34839,34733,34369,34328,34237,34229,34225,34197,34154, 34002,33988,33977,33958,33934,33891,33839,33471,33218,33149,32979, 32940,32936,32912,32902,32900,32885,32802,32802,32802,32708,32637, 32415,32403,32200,32110,32068,32067,32058,31950,31946,31923,31919, 31690,31624,31562,31482,31475,31450,31432,31405,31363,31187,31107, 31088,30940,30873,30866,30750,30538,30527,30497,30370,30347,30290, 30156,30140,30118,30051,29845,29750,29654,29646,29552,29512,29415, 29403,29382,29300,29271,29151,29131,28998,28951,28937,28867,28821, 28820,28724,28696,28489,28380,28267,28252,28225,28223,28105,28104, 28044,27900,27864,27699,27668,27661,27593,27589,27570,27497,27416, 27322,27287,27271,27221,26975,26881,26813,26692,26591,26520,26432, 26337,26290,26289,26219,25966,25822,25563,25546,25461,25442,25361, 25356,25281,25259,25122,25078,25024,24793,24790,24789,24721,24714, 24424,24413,24341,24325,24234,24198,24149,24092,23920,23907,23864, 23811,23799,23781,23671,23662,23493,23299,23206,23162,23139,23119, 23013,22984,22983,22872,22846,22771,22533,22467,22246,22237,22217, 22166,22143,22140,22095,22045,21930,21774,21753,21744,21500,21369, 21289,20986,20971,20920,20899,20897,20892,20788,20774,20738,20368, 20299,20139 }; const int hard5[] = { 100000, // Capacity 200, // Number of items // Size of items (sorted) 34955,34773,34641,34529,34478,34453,34441,34399,34131,34102,33996, 33978,33732,33523,33445,33437,33428,33386,33338,33183,33140,33108, 33076,33005,32986,32984,32859,32819,32749,32681,32620,32582,32504, 32425,32417,31766,31717,31699,31648,31566,31505,31373,31355,31273, 31264,31216,31064,31008,30918,30905,30751,30724,30707,30689,30617, 30592,30519,30459,30315,30297,30279,30246,30246,30148,30138,30069, 29962,29899,29898,29737,29735,29626,29590,29495,29434,29159,29063, 28917,28862,28709,28678,28524,28426,28296,28231,28213,28210,28198, 27960,27628,27622,27502,27473,27345,27330,27323,27301,27240,27120, 27090,27015,26845,26839,26828,26636,26607,26570,26554,26311,26308, 26270,26225,26219,26211,26088,26067,26060,25994,25942,25920,25916, 25866,25827,25735,25600,25561,25504,25443,25437,25380,25097,25077, 25071,25054,25037,24941,24933,24871,24843,24788,24751,24720,24594, 24565,24361,24312,24168,24153,24152,24145,24109,24088,23852,23829, 23766,23654,23630,23572,23482,23379,23172,23012,22937,22936,22897, 22887,22886,22876,22689,22673,22670,22542,22345,22262,22199,22131, 22109,22095,21958,21712,21642,21440,21345,21296,21156,21147,21122, 21048,21036,21031,21021,20960,20812,20646,20500,20443,20409,20385, 20382,20000 }; const int hard6[] = { 100000, // Capacity 200, // Number of items // Size of items (sorted) 34973,34910,34885,34807,34720,34655,34630,34613,34536,34230,34226, 34172,34069,34069,34066,33902,33843,33761,33637,33632,33429,33351, 33343,33303,33300,33259,33070,33045,33022,32986,32881,32785,32759, 32649,32583,32560,32558,32545,32380,32332,32297,32113,32077,31943, 31916,31787,31770,31719,31718,31701,31652,31641,31470,31269,31227, 31138,31006,30831,30828,30814,30582,30580,30561,30379,30371,30339, 30150,30125,30104,30098,30075,30039,29907,29860,29627,29547,29532, 29516,29404,29313,29268,29186,29179,29139,29051,28932,28820,28716, 28692,28436,28360,28321,28298,28086,27954,27911,27758,27642,27627, 27616,27464,27393,27334,27321,27202,27080,27032,26978,26794,26705, 26671,26630,26449,26409,26354,26345,26307,26278,26192,26188,26112, 26014,25959,25808,25806,25741,25655,25640,25611,25609,25491,25344, 25233,25134,25028,24967,24931,24870,24584,24512,24507,24476,24424, 24413,24382,24363,24356,24200,24129,24089,24064,24043,23991,23866, 23765,23632,23595,23547,23483,23378,23335,23324,23302,23232,23224, 23147,23088,22948,22922,22886,22778,22618,22513,22487,22450,22433, 22345,22237,22232,22149,22041,21753,21720,21711,21649,21634,21577, 21473,21472,20895,20817,20619,20613,20598,20565,20433,20395,20348, 20081,20050 }; const int hard7[] = { 100000, // Capacity 200, // Number of items // Size of items (sorted) 34808,34689,34603,34583,34336,34297,34244,34192,34092,34045,34030, 33976,33959,33872,33820,33736,33641,33592,33405,33362,33333,33299, 33253,33242,33223,33120,33093,33067,32733,32256,32193,32094,32003, 31894,31788,31746,31734,31720,31675,31651,31648,31618,31611,31599, 31598,31312,31095,31062,30853,30793,30691,30599,30567,30537,30462, 30436,30264,30246,30218,30053,30037,29942,29941,29879,29779,29746, 29688,29682,29641,29633,29563,29462,29461,29450,29356,29299,29288, 29280,29235,29169,29129,28955,28954,28671,28437,28336,28269,28200, 28000,27973,27968,27914,27885,27759,27741,27653,27567,27563,26904, 26550,26402,26366,26361,26348,26225,26139,26108,25991,25718,25683, 25639,25462,25290,25228,25136,25043,25038,24962,24892,24823,24803, 24768,24621,24559,24441,24419,24381,24250,24235,24093,24083,24065, 24060,23974,23868,23833,23636,23633,23581,23523,23445,23413,23317, 23202,23160,23150,23117,22977,22959,22955,22947,22915,22833,22755, 22739,22603,22592,22557,22554,22530,22354,22313,22306,22095,22092, 22021,21948,21934,21913,21855,21594,21564,21543,21518,21440,21389, 21370,21205,21174,21027,20984,20969,20932,20900,20844,20816,20721, 20694,20584,20533,20490,20476,20343,20332,20260,20173,20162,20157, 20131,20017 }; const int hard8[] = { 100000, // Capacity 200, // Number of items // Size of items (sorted) 34992,34948,34868,34591,34582,34127,34077,34055,34007,34004,33990, 33918,33813,33780,33756,33744,33700,33659,33496,33484,33443,33428, 33369,33354,33347,33191,33185,33162,33110,32988,32968,32879,32846, 32797,32708,32656,32584,32486,32466,32456,32440,32390,32373,32353, 32352,32282,32187,32111,32097,32084,32017,31990,31917,31880,31817, 31752,31540,31528,31471,31309,31267,31232,31204,30773,30703,30552, 30549,30515,30305,30221,30162,30115,30107,30072,30010,29972,29704, 29550,29547,29547,29457,29418,29325,29226,29155,29034,28859,28837, 28652,28535,28502,28423,28421,28388,28386,28348,27930,27919,27793, 27703,27669,27365,27266,27096,26928,26868,26848,26677,26676,26673, 26658,26559,26507,26476,26424,26421,26320,26251,26224,26214,26128, 25943,25900,25879,25852,25821,25720,25655,25625,25495,25455,25174, 25150,25104,25028,24917,24898,24860,24813,24682,24659,24475,24370, 24301,24283,24273,24251,24230,24199,24088,24086,24084,24023,23947, 23872,23736,23725,23609,23562,23515,23453,23414,23235,23078,23036, 22937,22932,22897,22826,22680,22664,22646,22523,22404,22287,22240, 22151,21978,21963,21921,21866,21747,21655,21560,21464,21403,21046, 21041,21020,20796,20778,20774,20622,20603,20410,20371,20248,20236, 20146,20091 }; const int hard9[] = { 100000, // Capacity 200, // Number of items // Size of items (sorted) 34991,34941,34922,34866,34849,34771,34768,34748,34544,34358,34254, 34155,34098,34076,34055,34048,34029,33990,33871,33780,33750,33654, 33612,33581,33430,33260,33197,33155,33115,33007,32989,32795,32708, 32394,32384,32309,32193,32039,32038,32008,31995,31961,31946,31865, 31839,31829,31692,31633,31354,31169,31141,31006,30929,30843,30842, 30807,30741,30514,30395,30387,30341,30296,30287,30284,30140,30135, 30063,29975,29933,29859,29735,29730,29703,29525,29518,29423,29378, 29234,29218,29178,29092,29089,28947,28647,28574,28550,28547,28471, 28461,28299,28267,28252,28251,28159,28009,28003,27967,27852,27811, 27664,27508,27413,27409,27184,27162,27113,27099,27048,27041,26733, 26506,26362,26183,25997,25976,25897,25856,25784,25700,25668,25641, 25522,25490,25433,25408,25322,25299,25237,25091,25057,25015,24990, 24974,24939,24834,24777,24743,24625,24555,24449,24367,24340,24329, 24126,24085,24050,24020,23999,23989,23974,23928,23837,23836,23565, 23491,23422,23417,23205,23195,23156,23092,22712,22644,22417,22392, 22281,22239,22212,22067,22045,22042,22003,21866,21851,21849,21713, 21674,21608,21607,21594,21401,21296,21239,21180,21128,21059,20954, 20948,20947,20813,20755,20725,20693,20585,20513,20431,20338,20310, 20296,20081 }; /* * Instances taken from: * E. Falkenauer. A hybrid grouping genetic algorithm fir bin packing. * Journal of Heuristics, 2:5-30, 1996. * * The item size have been sorted for simplicty and fractional capacities * have been converted to integers. * */ const int t60_00[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 495,474,473,472,466,450,445,444,439,430,419,414,410,395,372,370, 366,366,366,363,361,357,355,351,350,350,347,320,315,307,303,299, 298,298,292,288,287,283,275,275,274,273,273,272,272,271,269,269, 268,263,262,261,259,258,255,254,252,252,252,251 }; const int t60_01[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 475,473,468,465,462,447,444,426,423,412,411,409,403,402,399,396, 396,382,376,369,366,361,347,340,339,334,333,319,314,313,308,307, 305,304,302,300,297,289,282,280,277,275,270,269,267,265,264,262, 261,260,260,258,258,257,256,255,254,252,251,251 }; const int t60_02[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 498,498,494,482,482,479,476,464,459,436,430,429,401,400,398,390, 378,369,367,362,354,352,350,350,345,339,328,326,308,305,288,288, 284,281,280,279,277,276,271,268,267,267,267,266,263,262,261,261, 260,260,259,256,254,252,252,251,251,250,250,250 }; const int t60_03[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 495,493,485,478,477,462,461,459,456,451,429,426,414,405,391,378, 375,371,369,368,367,361,357,354,347,345,332,316,298,297,293,293, 281,281,278,278,277,277,275,273,270,268,265,265,263,263,262,261, 261,258,258,257,256,255,255,254,254,252,250,250 }; const int t60_04[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 498,496,494,491,478,470,455,434,428,425,418,414,411,409,403,402, 401,379,379,378,357,346,336,328,326,319,315,314,310,304,296,296, 293,291,287,286,284,284,283,282,281,281,279,276,264,264,264,258, 256,256,254,253,253,253,252,252,252,251,251,250 }; const int t60_05[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 496,489,484,483,469,463,462,433,432,422,416,396,389,388,380,380, 372,372,361,360,358,355,352,347,340,335,334,328,327,305,302,301, 296,290,286,285,283,282,282,281,281,281,278,276,276,270,269,268, 265,264,262,262,261,259,254,252,252,252,252,250 }; const int t60_06[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 498,485,471,464,451,450,449,427,424,405,403,400,394,388,380,375, 374,374,369,368,365,357,355,344,339,337,328,322,322,321,317,310, 304,300,297,292,287,284,284,281,279,278,276,276,276,275,275,274, 273,269,265,262,261,259,253,252,252,250,250,250 }; const int t60_07[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 487,480,478,476,465,454,432,422,412,410,410,407,406,392,380,378, 373,370,370,366,365,365,362,353,330,329,327,326,324,322,318,314, 307,303,297,296,293,286,281,281,279,279,273,268,267,266,265,264, 264,263,261,260,260,260,256,256,255,255,252,250 }; const int t60_08[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 498,491,485,468,462,454,453,453,451,439,398,391,383,381,378,370, 368,368,363,361,361,357,356,354,353,352,346,343,341,335,312,295, 293,293,292,286,284,283,282,280,278,275,275,272,269,263,259,259, 258,256,256,255,254,252,252,252,251,251,250,250 }; const int t60_09[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 483,468,453,451,445,443,442,429,426,417,412,397,391,382,380,377, 376,373,369,369,364,363,359,359,351,343,337,332,319,319,316,308, 307,304,304,304,298,294,289,288,280,276,276,275,273,266,263,263, 262,261,261,259,259,258,258,256,254,254,253,252 }; const int t60_10[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 491,478,472,464,448,441,440,439,428,424,423,419,417,403,400,398, 388,383,366,360,357,355,351,347,335,332,323,322,320,318,310,301, 299,294,292,291,285,284,280,280,278,277,274,271,270,268,266,266, 265,265,260,257,257,257,256,253,251,251,250,250 }; const int t60_11[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 495,493,492,492,481,470,450,447,409,399,398,396,395,392,391,389, 385,381,378,372,370,369,352,352,336,331,331,327,323,313,313,307, 296,295,288,284,284,283,280,278,278,270,268,268,267,266,266,258, 257,256,256,255,253,253,253,253,252,252,251,251 }; const int t60_12[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 495,472,470,462,450,442,440,438,436,435,433,424,420,405,395,393, 391,389,373,372,367,352,341,339,337,329,321,314,312,309,304,304, 302,301,299,286,286,281,279,276,274,272,271,270,268,268,267,266, 266,261,260,256,256,255,255,254,254,252,251,250 }; const int t60_13[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 495,493,492,488,485,480,459,456,452,448,444,434,429,421,419,386, 381,369,361,356,353,350,340,327,323,317,317,299,297,296,296,296, 293,291,288,287,286,281,280,278,278,267,264,262,261,260,259,258, 258,257,256,256,255,254,254,253,253,251,251,250 }; const int t60_14[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 492,491,484,474,470,464,460,450,448,429,415,415,412,400,399,389, 367,367,366,365,361,360,353,340,336,336,334,327,311,311,309,303, 300,282,282,281,279,278,277,274,273,272,270,270,269,266,264,262, 260,260,259,258,257,257,254,254,252,251,251,250 }; const int t60_15[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 491,487,485,481,472,471,463,454,451,451,448,442,431,426,413,409, 392,389,383,360,347,336,329,328,323,312,300,299,299,296,296,292, 291,291,288,288,281,279,274,274,273,271,267,266,264,263,262,261, 261,258,257,256,255,254,253,252,252,252,251,250 }; const int t60_16[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 498,497,492,482,481,480,478,455,450,444,439,436,432,432,429,412, 408,402,402,382,354,334,329,315,314,314,308,300,296,284,282,282, 280,279,279,275,274,274,270,269,268,267,266,264,264,264,263,263, 258,256,255,255,253,253,253,252,252,251,250,250 }; const int t60_17[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 496,495,492,489,478,469,467,459,459,455,453,437,436,428,425,422, 411,406,403,394,355,342,333,309,306,302,294,294,292,290,285,285, 281,279,279,278,278,270,269,268,267,266,264,264,262,260,258,258, 257,256,255,255,255,254,253,251,251,251,250,250 }; const int t60_18[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 495,493,492,479,471,466,453,443,439,434,424,420,399,385,380,377, 377,373,370,366,364,361,358,352,347,337,331,324,319,315,304,296, 295,291,290,290,281,278,277,276,275,275,273,271,270,261,261,256, 256,255,255,254,254,253,253,252,252,251,251,250 }; const int t60_19[] = { // Capacity 1000, // Number of items 60, // Size of items (sorted) 499,493,488,470,460,460,459,459,427,423,415,407,405,395,391,384, 382,368,367,366,363,361,358,350,343,342,342,329,324,316,305,303, 298,292,288,287,286,282,279,276,273,270,267,263,261,261,259,259, 258,257,257,255,254,254,253,253,252,251,251,250 }; const int u120_00[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 98,98,98,96,96,94,93,93,92,91,91,90,87,86,85,85,84,84,84,84,84, 83,83,82,82,81,80,80,80,79,79,78,78,78,78,76,74,74,73,73,73,73, 72,71,70,70,70,69,69,69,67,66,64,62,62,60,60,59,58,58,58,57,57, 57,57,55,55,55,50,49,49,49,47,46,46,45,45,44,44,43,43,43,43,42, 42,42,42,42,41,41,41,39,39,38,38,38,37,36,36,36,35,33,33,33,32, 32,30,30,30,29,28,27,27,26,25,25,24,23,23,20 }; const int u120_01[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 100,100,99,99,98,98,98,98,98,97,97,97,95,95,95,94,92,90,90,88, 88,85,82,81,81,81,80,80,80,79,79,78,78,76,75,75,74,72,72,71,70, 70,70,68,67,67,67,67,66,66,65,65,64,62,61,61,60,60,60,59,58,57, 57,57,55,55,53,53,53,53,53,53,52,52,50,49,49,48,48,47,47,47,46, 46,45,45,45,44,43,43,43,41,39,39,39,38,38,37,36,36,36,35,33,32, 30,30,29,29,27,27,27,25,24,23,23,22,22,22,20,20 }; const int u120_02[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 100,100,98,97,97,96,94,92,92,91,91,90,90,90,88,85,84,84,84,83, 81,81,80,80,80,80,79,79,79,76,76,75,75,74,73,70,69,69,68,68,67, 67,67,67,66,66,66,65,64,64,64,64,64,62,62,61,61,60,59,59,57,53, 53,51,51,50,50,48,48,48,47,46,46,46,45,45,44,42,42,41,41,40,38, 38,38,37,37,37,37,36,36,35,35,34,34,33,32,32,32,31,31,30,29,29, 29,29,28,28,27,26,26,25,24,24,23,23,22,21,21,20 }; const int u120_03[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 100,100,99,97,97,97,96,96,95,95,95,95,94,92,92,91,91,90,90,90, 89,88,87,87,86,86,85,84,84,84,83,82,82,81,80,80,80,79,78,76,75, 74,74,73,73,73,71,71,70,70,68,67,66,65,63,63,63,62,61,60,60,59, 58,58,57,56,56,54,54,54,53,52,49,48,47,47,46,46,46,45,45,45,44, 43,43,42,42,42,40,40,40,39,37,37,35,35,35,35,34,34,33,32,32,31, 30,29,29,28,27,27,26,26,26,25,25,25,24,22,21,20 }; const int u120_04[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 99,99,98,98,97,97,96,95,92,92,92,92,91,91,91,90,89,89,88,87,87, 87,86,85,84,84,84,84,82,82,81,79,78,78,77,77,76,76,75,75,75,74, 73,73,73,73,72,71,71,71,71,70,69,69,69,69,69,68,68,67,66,65,65, 61,60,60,59,57,57,57,57,57,56,55,53,52,52,50,50,49,48,45,45,43, 43,42,42,42,42,42,41,40,40,39,39,37,37,37,36,35,34,32,32,31,31, 30,28,27,25,24,24,23,21,21,21,21,21,20,20,20 }; const int u120_05[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 100,100,99,98,97,97,97,97,95,94,92,92,91,91,91,90,88,88,88,87, 87,85,84,84,84,83,82,82,82,81,80,80,79,79,78,78,78,78,78,77,75, 72,72,72,70,70,69,68,67,67,67,66,64,62,60,60,60,58,58,56,56,56, 56,55,55,54,53,53,53,52,51,50,48,48,48,47,47,46,46,45,45,44,44, 44,42,42,41,41,40,39,39,38,37,37,36,36,34,34,34,32,32,32,32,31, 31,30,27,27,27,26,26,25,24,24,23,21,21,21,20,20 }; const int u120_06[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 100,100,100,99,98,97,96,96,95,95,95,92,91,90,90,89,89,88,88,88, 88,86,85,85,84,83,83,83,83,82,81,81,81,80,78,76,75,72,72,72,72, 71,69,69,66,66,65,64,63,62,62,62,61,60,60,59,59,59,58,57,55,55, 55,55,54,54,53,53,53,52,52,51,51,50,50,49,49,48,48,48,48,48,46, 45,44,44,44,43,43,43,43,42,41,38,37,37,36,35,34,33,32,31,31,30, 29,29,28,27,27,27,27,27,27,25,24,23,22,22,20,20 }; const int u120_07[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 100,99,99,99,98,98,96,96,95,94,94,94,93,92,91,89,89,88,87,87, 86,85,84,83,82,82,81,79,77,77,76,75,74,74,71,71,70,70,70,69,69, 69,68,66,66,66,66,65,64,64,64,63,63,62,62,62,61,61,61,61,60,60, 60,60,59,57,57,56,56,55,55,54,54,53,53,53,53,52,51,50,50,50,49, 48,47,47,47,46,45,45,44,44,44,43,41,41,40,40,40,38,37,37,37,36, 35,35,34,34,34,32,32,27,26,26,25,24,24,23,23,20 }; const int u120_08[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 100,100,100,98,98,98,97,97,97,96,95,95,94,94,92,92,91,91,91,91, 89,89,89,88,88,87,86,85,85,85,84,82,82,81,81,80,79,79,77,76,75, 75,74,73,72,71,70,70,69,69,69,67,67,67,65,65,64,64,63,62,61,60, 60,59,58,58,58,58,57,57,57,57,54,54,53,52,52,52,51,51,49,49,49, 48,47,46,45,45,45,44,43,42,40,40,39,39,38,37,37,36,35,34,34,33, 33,32,30,29,29,29,27,26,26,25,23,23,22,21,20,20 }; const int u120_09[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 100,100,98,95,94,94,93,92,92,92,91,91,90,90,90,89,89,87,86,86, 83,83,83,82,82,81,80,80,79,77,76,76,75,75,74,74,74,74,74,72,72, 70,68,67,66,66,66,66,66,65,65,64,63,62,62,62,62,61,60,59,58,58, 57,56,55,54,54,52,52,52,50,48,46,46,45,45,44,43,42,41,40,40,40, 40,40,39,39,38,38,37,37,37,36,33,33,33,32,31,31,30,29,28,28,27, 26,26,25,23,22,22,22,21,21,21,21,21,20,20,20,20 }; const int u120_10[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 100,99,99,99,99,98,98,97,97,97,97,97,96,93,92,92,92,92,91,90, 90,90,90,89,88,88,88,87,86,86,84,84,83,82,82,81,81,80,79,79,78, 78,78,77,76,76,74,73,72,71,69,69,68,67,67,66,66,65,65,64,63,63, 63,62,60,60,59,59,59,58,56,56,55,55,54,54,52,52,52,52,52,51,51, 51,50,50,50,48,46,45,45,45,44,44,43,42,40,39,39,38,38,37,35,34, 34,34,34,32,30,30,30,29,29,28,26,26,23,22,21,20 }; const int u120_11[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 100,99,99,98,98,98,97,97,95,94,94,93,91,91,91,91,90,90,90,89, 89,88,85,84,83,83,81,80,79,79,79,79,78,78,78,78,78,78,77,77,76, 76,75,75,73,70,69,68,67,66,65,65,65,64,64,63,62,62,61,61,61,60, 60,59,59,59,58,58,57,57,57,55,54,54,52,52,51,50,50,50,49,47,45, 41,41,41,40,40,38,38,38,37,36,36,35,35,35,35,35,35,33,31,30,28, 28,28,27,27,27,27,26,24,24,23,23,22,22,22,21,21 }; const int u120_12[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 99,96,95,93,91,91,91,90,88,88,87,87,87,86,86,84,84,84,82,82,82, 81,81,80,79,79,78,78,78,78,78,77,77,76,76,76,74,74,73,72,72,71, 71,71,69,69,69,69,68,66,66,66,66,65,64,64,64,63,62,62,60,59,59, 58,58,57,57,57,56,56,56,55,54,54,54,52,52,51,51,50,49,49,48,47, 46,46,45,45,45,44,43,42,42,41,41,38,37,37,37,36,36,35,34,33,33, 32,32,30,29,28,27,26,26,26,24,23,23,22,22,20 }; const int u120_13[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 100,100,99,99,98,98,97,97,96,96,95,95,95,92,91,91,91,90,90,90, 89,88,88,84,84,84,84,83,82,81,81,81,81,80,78,77,77,76,74,74,73, 73,72,71,71,69,69,66,66,66,65,64,63,63,62,61,61,61,60,60,59,57, 56,56,55,55,55,54,53,53,53,52,52,51,51,51,50,50,47,47,45,45,44, 43,42,41,41,40,40,39,39,39,38,38,38,37,36,33,33,32,32,32,31,30, 30,29,29,28,28,28,26,25,24,22,22,22,22,20,20,20 }; const int u120_14[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 100,100,100,99,99,97,97,96,96,93,93,93,93,92,90,90,89,89,87,87, 86,86,85,85,84,84,83,82,82,81,80,79,78,78,78,76,75,74,74,74,74, 73,73,72,72,71,71,70,69,68,68,68,68,66,66,65,65,65,64,64,64,63, 63,63,62,61,61,59,57,54,54,54,53,51,51,50,49,49,49,48,48,47,47, 46,46,46,46,45,45,44,44,43,42,41,40,39,39,39,35,35,34,34,33,31, 31,31,31,28,28,27,27,25,25,24,24,24,23,22,22,21 }; const int u120_15[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 100,100,99,99,99,98,98,98,97,97,96,95,93,93,93,91,91,90,90,89, 89,88,88,86,86,85,83,82,82,81,81,80,80,78,77,77,76,76,75,74,74, 73,73,72,71,71,70,69,69,68,67,64,64,63,61,61,61,61,61,60,58,56, 56,55,55,54,54,53,53,49,48,47,46,44,44,43,43,43,42,42,41,41,41, 40,40,39,39,38,38,38,37,37,36,36,36,36,34,34,33,32,31,31,30,30, 30,28,28,27,27,24,24,24,23,23,23,22,22,21,20,20 }; const int u120_16[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 100,100,100,99,99,99,99,98,96,95,95,94,94,94,94,93,92,92,92,91, 90,90,90,89,88,87,87,85,84,84,84,84,83,83,82,81,79,79,78,78,76, 76,76,75,75,75,75,73,72,72,71,70,70,70,69,68,67,66,66,65,64,64, 63,62,62,61,61,61,60,59,59,59,58,58,58,56,56,55,54,53,52,51,50, 49,49,48,48,47,47,45,45,44,44,44,42,40,40,38,38,38,35,35,34,34, 33,33,32,32,30,30,28,27,27,27,27,25,23,23,22,21 }; const int u120_17[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 100,100,100,99,98,95,95,94,94,93,92,92,91,91,90,90,89,89,88,88, 87,86,86,86,86,86,85,85,85,84,84,83,82,80,80,80,79,79,79,79,78, 77,77,77,76,74,74,73,72,72,72,72,71,70,69,69,68,68,65,64,63,63, 62,62,61,61,60,60,59,58,58,56,56,56,55,55,55,54,53,53,53,53,51, 51,51,51,50,49,49,48,47,47,46,45,44,44,43,43,42,42,41,40,39,38, 37,37,34,31,30,30,30,30,30,29,28,27,26,26,22,22 }; const int u120_18[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 100,100,100,100,98,98,97,97,96,95,95,95,94,92,92,89,89,89,88, 87,86,85,85,84,83,82,81,81,80,79,76,76,75,75,74,73,73,73,73,73, 73,72,72,71,70,69,68,68,67,67,66,65,64,64,64,63,63,62,62,61,59, 59,58,58,57,56,56,55,55,54,54,52,51,51,51,51,50,50,50,48,47,46, 46,46,45,45,45,44,43,42,41,41,40,40,39,39,37,36,36,36,35,35,35, 34,34,34,33,32,28,27,26,26,24,23,23,22,22,22,21,21 }; const int u120_19[] = { // Capacity 150, // Number of items 120, // Size of items (sorted) 100,100,99,99,99,97,97,97,97,97,96,96,95,95,95,95,94,94,93,92, 90,90,90,90,89,88,86,86,85,85,84,83,80,79,78,77,77,77,76,75,74, 74,73,72,72,69,68,67,66,66,65,65,64,63,63,62,62,62,60,60,59,58, 58,58,57,55,54,54,54,52,51,50,50,50,50,50,50,49,49,48,48,47,46, 44,44,44,43,43,42,41,40,39,39,38,38,37,36,35,34,33,33,33,32,32, 31,31,29,28,28,27,26,25,24,24,23,23,23,22,21,21 }; const int u250_00[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,100,100,99,99,98,98,98,98,98,98,98,98,97,97,97,96,96,95,95, 95,94,94,93,93,92,92,92,91,91,90,90,90,88,88,87,86,85,85,85,84, 84,84,84,84,83,83,82,82,82,81,81,81,81,80,80,80,80,80,80,79,79, 79,79,78,78,78,78,78,78,76,76,75,75,74,74,74,73,73,73,73,72,72, 72,71,71,70,70,70,70,70,70,69,69,69,69,68,67,67,67,67,67,66,66, 66,65,65,64,64,62,62,62,61,61,60,60,60,60,60,60,59,59,58,58,58, 58,57,57,57,57,57,57,57,55,55,55,55,55,53,53,53,53,53,53,52,52, 50,50,49,49,49,49,49,48,48,47,47,47,47,46,46,46,46,45,45,45,45, 45,44,44,44,43,43,43,43,43,43,43,42,42,42,42,42,42,41,41,41,41, 39,39,39,39,39,38,38,38,38,38,38,37,37,36,36,36,36,36,36,35,35, 33,33,33,33,32,32,32,32,30,30,30,30,30,29,29,29,28,27,27,27,27, 27,26,25,25,25,24,24,24,23,23,23,23,23,22,22,22,20,20,20,20 }; const int u250_01[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,100,100,99,98,98,97,97,97,97,97,97,96,96,96,96,95,95,95,95, 94,94,92,92,92,91,91,91,91,91,90,90,90,90,90,90,89,89,88,88,87, 87,86,86,86,85,85,84,84,84,84,84,84,84,83,83,82,82,81,81,81,80, 80,80,80,80,80,80,79,79,79,79,78,78,77,76,76,76,76,75,75,75,74, 74,74,73,73,73,73,71,71,71,71,70,70,70,69,68,68,68,67,67,67,67, 67,66,66,66,66,65,65,64,64,64,64,64,63,63,63,62,62,62,61,61,61, 60,60,59,59,59,58,58,57,57,57,56,56,54,54,54,53,53,53,52,51,51, 50,50,49,48,48,48,48,47,47,47,46,46,46,46,46,46,45,45,45,45,45, 44,44,43,43,42,42,42,42,42,41,41,40,40,40,40,39,38,38,37,37,37, 37,37,37,36,36,35,35,35,35,35,35,35,34,34,34,34,33,33,32,32,32, 32,31,31,31,30,30,30,29,29,29,29,29,29,28,28,28,27,27,27,27,26, 26,26,26,26,25,25,25,25,25,24,24,24,23,22,22,21,21,21,21,20 }; const int u250_02[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,100,100,99,99,99,98,98,98,97,97,97,97,97,97,95,95,95,94,92, 92,92,92,92,92,91,91,91,91,91,91,90,90,90,89,88,88,88,88,88,88, 88,87,87,87,87,87,86,85,85,85,84,84,84,84,84,84,83,83,82,82,82, 82,82,81,81,81,81,80,80,79,79,79,78,78,78,78,78,78,77,77,76,75, 75,75,75,74,73,73,73,73,72,72,72,72,72,71,71,70,70,70,69,69,69, 69,69,69,68,68,68,67,67,67,67,66,66,66,65,65,64,62,62,61,60,60, 60,60,60,60,59,59,58,58,57,57,57,57,56,56,56,56,56,55,55,55,55, 54,53,53,53,53,52,52,52,52,51,50,50,50,49,48,48,48,48,48,48,48, 47,47,46,46,45,45,45,45,44,44,44,43,43,43,42,42,42,42,42,42,41, 41,41,40,40,40,39,39,39,39,38,37,37,37,37,37,37,36,36,36,35,34, 34,34,34,32,32,32,32,32,32,31,31,31,31,30,29,28,27,27,27,27,26, 26,25,24,24,24,23,23,21,21,21,21,21,21,21,20,20,20,20,20,20 }; const int u250_03[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,98,98,98,97,97,96,96,96,96, 95,95,95,95,94,94,94,94,93,92,92,92,91,91,90,89,89,89,89,89,88, 88,87,87,86,86,85,85,85,84,84,83,83,83,83,82,82,82,81,81,81,80, 80,79,79,78,77,77,76,76,75,75,74,74,72,72,72,71,71,71,71,70,70, 70,70,69,69,69,69,69,68,67,66,66,66,66,66,65,65,65,64,64,64,64, 64,63,63,63,63,62,62,62,62,62,61,61,61,61,61,60,60,60,60,60,59, 59,59,58,58,58,57,57,57,56,56,55,55,55,55,55,54,54,54,54,53,53, 53,53,53,53,53,53,52,52,51,51,51,51,50,50,50,50,50,49,49,49,48, 48,48,47,47,47,47,46,46,45,45,45,44,44,44,44,44,44,43,43,43,43, 42,41,41,41,40,40,40,40,38,38,37,37,37,37,37,36,36,35,35,34,34, 34,34,34,33,33,32,32,32,31,31,30,30,29,29,28,27,27,27,27,27,27, 26,26,26,25,25,25,24,24,24,23,23,23,23,23,22,22,22,21,20,20,20 }; const int u250_04[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,100,99,98,98,98,97,97,97,96,95,95,94,94,94,93,92,92,92,92, 92,92,92,91,91,91,91,91,90,90,90,90,90,90,89,89,89,89,88,88,88, 88,88,87,87,86,86,86,85,85,84,83,83,83,82,82,82,82,82,81,81,81, 80,80,79,79,79,77,77,76,76,76,76,76,75,75,75,75,74,74,74,74,74, 74,74,73,73,72,72,72,70,70,69,69,69,69,68,68,67,67,67,66,66,66, 66,66,66,65,65,65,65,65,64,64,64,63,62,62,62,62,62,62,61,61,60, 60,60,60,59,59,59,59,59,58,58,58,58,58,57,57,57,57,57,56,55,55, 54,54,54,54,54,52,52,52,52,52,52,52,51,51,51,50,50,50,49,49,49, 48,48,46,46,46,46,45,45,45,45,45,45,44,44,44,43,43,42,42,41,40, 40,40,40,40,40,40,39,39,39,39,39,38,38,38,37,37,37,37,36,36,35, 34,34,34,34,33,33,33,33,32,32,31,31,30,30,29,29,29,28,28,27,27, 26,26,26,25,23,23,22,22,22,22,21,21,21,21,21,20,20,20,20,20 }; const int u250_05[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,100,99,99,99,99,99,99,98,98,98,98,98,97,97,97,97,97,96,95, 94,94,93,93,92,91,91,91,91,91,91,90,90,90,90,89,89,89,88,88,87, 87,87,86,86,85,84,84,84,84,83,83,83,82,82,82,81,81,81,80,80,80, 79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77, 76,76,75,75,73,72,72,71,71,70,69,69,69,69,68,67,67,67,66,66,66, 66,66,65,65,65,64,64,64,64,63,63,63,63,63,62,62,62,61,61,61,60, 60,60,59,59,59,59,58,58,58,57,57,57,57,57,56,56,56,56,55,55,54, 54,54,54,54,54,52,52,52,52,52,52,52,51,51,51,50,50,50,50,49,49, 49,48,48,47,46,45,45,45,45,45,44,43,43,42,42,41,41,41,41,40,40, 39,38,38,38,38,38,37,37,37,37,37,36,36,36,36,35,35,35,35,35,35, 35,34,33,33,32,32,31,30,30,30,30,29,29,28,28,28,28,28,27,27,27, 27,26,26,26,26,26,24,24,24,23,23,23,23,22,22,22,21,21,21,20 }; const int u250_06[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,100,100,100,99,99,99,98,98,97,97,97,96,96,96,96,95,95,95, 95,93,93,93,92,92,91,91,91,91,91,90,90,90,90,90,89,88,88,88,87, 87,86,86,85,84,84,84,84,84,84,84,84,83,82,82,82,82,81,81,81,81, 81,81,80,79,79,78,78,78,78,78,77,77,77,76,76,76,76,76,74,74,74, 74,74,74,74,73,73,73,73,72,72,72,72,71,71,71,71,71,70,69,69,69, 69,68,68,68,66,66,66,66,66,66,65,65,65,64,64,63,63,63,62,62,62, 61,61,61,61,61,60,60,60,59,59,59,58,57,57,56,56,56,55,55,55,55, 54,54,54,53,53,53,53,52,52,52,51,51,51,51,51,50,50,50,50,49,49, 48,48,47,47,47,47,46,46,45,45,45,45,44,44,44,43,43,42,42,42,41, 41,41,40,40,40,39,39,39,39,39,38,38,38,38,37,36,35,35,34,34,33, 33,33,33,32,32,32,32,31,31,31,30,30,29,29,29,28,28,28,28,27,27, 27,26,26,25,25,24,24,23,22,22,22,22,22,22,22,22,21,20,20,20,20 }; const int u250_07[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,99,99,99,98,98,98,97,97, 97,96,96,96,95,94,94,94,93,93,93,93,93,93,92,91,91,91,90,90,90, 90,90,89,89,89,89,89,88,88,88,87,87,86,86,86,85,85,85,84,84,84, 84,83,83,83,83,82,82,82,81,81,80,80,80,78,78,78,78,78,77,77,76, 76,76,76,75,75,75,75,74,74,74,73,73,73,73,72,71,71,71,71,70,70, 69,69,69,69,68,68,68,67,65,65,64,64,64,64,64,64,64,63,63,63,63, 62,61,61,61,61,61,61,61,61,60,60,59,59,58,58,58,58,57,56,56,56, 55,55,55,54,54,54,54,53,53,52,51,50,49,49,49,48,48,48,47,47,47, 46,46,46,46,45,45,45,44,44,44,44,44,43,43,43,42,42,42,41,41,41, 41,40,40,39,39,39,38,38,38,38,38,37,37,36,36,36,36,35,35,35,34, 34,34,34,33,33,32,32,31,31,31,31,30,30,30,30,30,28,28,28,28,27, 27,27,27,25,25,24,24,24,24,24,23,23,23,23,23,22,22,21,21,20,20 }; const int u250_08[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,100,100,100,100,99,98,98,98,97,97,95,95,95,95,95,95,94,94, 94,94,93,92,92,92,92,92,91,91,90,90,90,89,89,89,89,89,88,88,87, 87,87,86,86,86,86,86,85,85,85,85,85,84,84,83,83,82,82,81,81,80, 80,80,80,79,79,79,79,79,79,79,78,77,77,77,76,76,76,76,75,75,75, 75,74,74,74,73,73,73,73,73,73,73,72,72,72,72,72,72,72,72,71,71, 70,70,70,70,69,69,68,68,68,68,68,67,67,66,66,66,65,65,65,64,64, 64,64,63,63,63,63,62,62,62,62,62,61,61,61,60,60,59,59,59,58,58, 58,58,57,56,56,56,56,56,55,55,55,55,55,54,54,54,53,53,53,53,53, 52,51,51,51,51,51,51,51,51,50,50,50,50,49,49,49,48,48,47,47,47, 47,46,46,45,45,45,44,44,44,44,43,43,42,42,42,41,40,40,40,40,40, 39,38,38,37,37,37,36,36,36,35,35,34,34,34,34,33,33,32,31,30,30, 30,30,30,29,28,28,27,27,27,26,26,26,24,23,23,22,22,22,22,22,21 }; const int u250_09[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,98,97,97,97,97,97,97,96,96, 96,95,95,95,95,95,94,94,93,93,93,93,92,92,92,91,91,90,90,90,90, 89,88,88,88,88,88,87,87,87,86,86,86,86,86,86,85,85,85,85,85,84, 84,84,84,84,84,83,83,82,81,80,79,79,79,78,78,77,77,77,77,77,76, 76,75,75,74,74,73,73,72,72,72,71,70,70,70,69,69,69,69,69,68,68, 67,67,67,66,66,65,65,65,65,64,63,63,62,62,62,62,62,62,61,61,60, 60,60,59,59,59,59,58,58,58,58,57,56,55,54,54,54,54,53,52,51,51, 50,50,50,50,50,50,50,49,49,49,49,48,48,48,47,46,46,46,46,45,44, 44,44,44,43,43,43,43,43,42,42,41,41,41,41,40,40,39,39,39,39,39, 38,38,38,37,37,36,36,35,35,35,35,35,34,34,34,34,33,33,33,32,32, 32,32,32,31,31,31,31,30,29,29,28,28,28,28,27,27,27,27,27,26,26, 26,26,25,24,24,24,24,24,24,23,23,23,22,22,21,21,21,21,21,21,21 }; const int u250_10[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,97,97,96,96,95,95,94,94, 94,94,94,94,94,94,93,93,93,92,92,92,92,91,91,91,91,91,91,90,89, 89,89,88,88,88,88,87,87,87,87,86,86,86,85,85,85,85,84,83,83,83, 83,83,83,83,82,81,81,81,81,81,80,80,80,80,80,79,79,78,78,78,78, 78,77,76,76,75,74,74,74,74,74,73,73,73,72,72,72,72,71,71,71,70, 70,70,70,69,69,68,68,67,67,66,66,66,66,65,65,65,64,63,63,62,62, 62,61,61,61,61,60,60,59,59,59,59,59,59,58,58,58,58,57,57,57,57, 56,56,56,56,56,55,55,55,55,55,54,54,54,54,54,53,53,53,52,52,52, 52,51,51,51,51,49,49,48,48,48,48,47,46,46,46,45,44,44,44,44,44, 43,43,43,43,43,42,42,42,41,41,41,41,41,40,40,40,40,39,39,38,38, 38,37,37,37,37,35,35,35,34,34,34,34,33,32,31,31,30,29,29,29,29, 28,28,26,26,25,25,25,25,24,24,24,23,22,22,22,22,22,21,21,20,20 }; const int u250_11[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,100,100,100,100,99,99,99,98,97,97,97,97,97,96,96,96,96,95, 95,95,95,95,95,95,94,93,92,92,92,92,92,92,91,91,90,90,90,90,90, 90,90,89,88,87,87,87,87,87,87,86,86,85,84,84,84,83,83,83,83,82, 82,82,82,82,81,81,80,80,80,80,80,79,78,78,78,78,77,77,76,75,75, 75,74,73,73,73,73,72,72,72,71,71,70,70,70,69,69,68,68,68,68,67, 67,67,66,66,66,66,65,65,64,64,63,63,63,62,62,62,61,61,61,61,61, 61,60,60,60,59,59,58,57,57,56,56,56,56,56,56,55,55,55,54,54,54, 54,53,53,52,52,52,51,51,51,51,50,49,49,49,48,47,46,46,45,45,45, 45,45,44,44,44,44,43,43,42,42,42,42,42,42,41,41,41,41,41,40,40, 40,40,39,39,39,38,38,37,37,37,36,36,36,35,35,35,35,35,35,34,34, 33,33,33,33,32,32,32,32,32,31,30,30,29,29,29,29,29,27,27,27,27, 26,26,26,26,26,25,25,25,25,25,25,24,23,23,22,21,21,20,20,20,20 }; const int u250_12[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,100,100,100,100,99,99,99,99,98,98,98,98,98,98,98,97,97,97, 97,97,97,96,96,96,95,95,95,95,95,95,95,95,94,94,94,94,93,93,92, 91,91,91,90,90,90,89,89,89,89,88,88,88,87,87,87,87,86,85,85,85, 84,84,84,84,82,82,82,82,82,81,81,81,81,80,80,79,79,78,78,77,76, 76,75,75,75,74,74,74,73,72,72,71,71,71,71,70,70,70,70,69,68,68, 68,68,67,67,67,67,67,66,66,66,66,65,65,65,64,64,64,63,63,63,63, 62,62,62,62,61,61,61,60,60,59,59,59,58,58,58,58,58,57,57,57,57, 57,57,57,56,56,55,55,55,55,54,54,54,54,53,52,51,51,51,51,50,50, 50,50,49,49,49,49,48,48,47,47,47,47,47,46,46,46,46,45,45,45,44, 44,44,44,43,43,43,43,43,43,42,42,42,42,41,41,40,40,38,38,38,37, 37,36,36,34,34,33,33,33,33,33,32,32,32,31,31,31,30,30,29,29,29, 29,29,28,28,27,27,27,27,27,26,26,26,26,24,23,22,22,22,22,20,20 }; const int u250_13[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,99,97,97,96,96,96,96,96,95,95,95,95,94,94,93,93,93,93,93, 93,92,92,92,91,91,90,90,90,90,89,88,88,88,87,87,87,87,87,86,86, 86,86,85,85,85,84,83,83,83,82,82,82,82,81,81,80,80,80,80,80,80, 80,79,79,79,78,78,77,77,77,77,77,77,77,76,76,76,76,76,76,75,74, 74,74,74,73,73,73,73,71,71,71,71,71,71,70,70,70,70,69,69,69,69, 69,69,68,68,68,68,68,68,66,66,66,66,66,65,65,64,64,63,63,63,63, 61,61,61,61,61,60,60,60,60,60,60,59,59,58,57,57,56,56,56,56,55, 53,53,53,53,53,53,52,52,52,51,51,50,50,49,49,49,49,48,48,48,48, 47,47,47,47,47,46,46,46,46,46,46,45,45,45,45,44,44,44,43,43,43, 43,43,42,42,42,42,42,41,41,41,41,41,41,40,40,40,40,40,39,38,38, 37,37,37,37,36,36,35,35,35,34,34,34,34,32,32,31,31,30,29,29,29, 28,28,27,27,27,26,26,25,25,24,24,23,22,22,22,21,20,20,20,20 }; const int u250_14[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,100,100,100,99,98,98,98,98,97,97,96,96,95,95,95,95,94,94, 94,94,94,93,93,93,93,93,93,92,92,91,90,90,90,89,88,88,88,88,88, 87,87,87,86,85,84,84,83,83,83,83,82,82,82,82,82,81,81,80,80,79, 79,79,79,79,79,79,78,78,78,78,77,77,77,77,77,77,76,76,76,75,75, 75,75,75,75,74,74,74,74,74,73,73,73,73,72,71,71,70,70,70,69,68, 68,68,68,67,65,65,65,65,64,64,63,63,63,63,62,62,61,61,61,60,60, 59,59,59,59,59,58,56,56,56,56,56,55,54,54,54,53,53,53,52,52,51, 51,51,51,51,50,50,49,49,49,49,49,48,48,48,47,47,47,47,47,47,46, 46,45,45,45,44,44,44,44,44,43,43,43,43,43,42,42,42,41,41,41,40, 40,39,38,38,38,37,37,37,37,36,36,36,36,36,35,35,34,34,33,33,32, 32,31,31,31,30,29,29,28,28,28,28,27,26,26,26,25,25,25,25,25,25, 24,23,23,23,23,23,23,22,22,22,22,22,22,21,21,21,21,21,20,20,20 }; const int u250_15[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,100,100,100,100,99,99,99,98,98,97,97,97,97,97,97,96,96,96, 96,96,95,95,94,94,94,93,93,92,92,92,92,92,91,91,91,91,91,90,90, 89,89,89,89,89,88,88,88,88,88,88,87,87,87,87,87,87,86,86,85,85, 85,84,83,83,83,83,82,82,82,82,82,82,81,81,81,80,80,79,79,78,77, 76,76,75,75,75,75,74,74,74,74,74,74,73,73,73,73,72,72,72,71,71, 71,71,70,70,70,70,69,69,68,67,67,65,65,65,65,64,64,64,64,63,63, 63,63,63,63,63,62,62,62,61,61,61,60,59,58,58,57,57,56,56,56,56, 56,55,55,55,55,55,54,54,54,54,53,53,53,53,52,52,52,51,51,50,50, 50,50,50,49,49,49,49,49,49,49,49,48,48,48,48,48,47,46,46,45,44, 44,44,44,44,44,43,43,43,42,41,41,41,40,40,39,37,37,37,37,36,36, 36,35,35,35,34,34,33,33,33,32,32,32,31,31,31,30,30,29,29,29,28, 28,27,26,26,26,26,26,25,25,25,25,24,24,24,24,23,23,21,21,20,20 }; const int u250_16[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,99,98,97,97,97,96,96,96,95,95,95,95,95,95,95,94,94,94,93, 91,89,89,89,88,88,88,88,87,87,86,86,86,86,86,86,86,85,85,85,85, 84,84,84,83,83,83,83,83,83,82,82,82,82,81,81,81,81,81,81,81,80, 80,80,80,79,79,79,79,78,78,77,77,77,77,76,75,75,74,74,74,74,74, 74,73,73,73,73,73,73,72,72,72,70,70,70,69,69,69,68,68,67,66,66, 65,65,65,64,63,63,63,63,63,62,62,60,60,60,59,59,59,59,57,57,57, 57,56,56,55,55,55,54,54,54,53,53,53,53,52,51,50,50,49,49,49,49, 48,48,48,48,48,48,47,47,47,46,46,46,46,45,44,44,43,42,42,42,42, 42,41,41,41,40,40,40,40,40,39,39,39,38,38,38,38,38,38,37,37,37, 36,36,36,36,36,35,35,34,33,33,33,32,32,32,32,32,31,31,31,31,31, 31,30,30,30,30,29,29,29,29,28,28,28,28,27,27,27,27,27,27,26,26, 26,25,25,25,25,24,24,24,23,22,22,22,22,21,21,21,21,20,20,20 }; const int u250_17[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,100,100,100,100,99,99,98,98,98,97,97,97,97,96,96,96,96,94, 94,93,93,93,93,92,92,91,90,90,89,89,89,88,86,86,85,85,84,84,84, 83,83,82,82,82,82,82,81,81,80,80,80,80,79,79,79,79,78,78,77,77, 77,77,76,76,76,75,75,75,75,75,74,74,74,74,74,73,73,72,72,72,72, 72,72,72,71,71,71,70,68,68,68,68,68,68,68,68,68,68,67,67,67,67, 67,67,67,67,67,66,65,64,64,64,64,63,63,63,63,63,62,62,61,61,59, 58,58,57,57,57,57,57,57,56,56,56,56,56,56,55,55,55,55,55,55,54, 53,53,53,52,52,51,51,51,51,50,50,50,50,50,50,49,49,49,49,48,48, 47,47,47,47,47,46,45,44,43,43,43,43,43,42,42,42,42,42,42,41,41, 40,40,40,40,40,40,39,39,39,39,38,38,38,38,37,37,37,36,36,36,35, 35,35,35,34,33,33,32,32,32,32,31,31,31,31,31,31,30,30,30,30,28, 27,27,27,26,25,25,24,24,24,24,23,23,22,21,21,21,21,21,21,21,20 }; const int u250_18[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,100,100,99,99,99,99,99,99,98,98,97,97,97,97,97,96,96,96,96, 95,95,95,95,95,94,94,94,94,94,93,93,92,91,90,90,90,90,90,90,90, 89,89,88,88,87,87,87,85,85,84,84,84,84,83,83,82,82,81,81,81,80, 80,80,79,79,79,78,78,78,77,77,77,77,77,77,77,75,75,75,75,74,74, 74,73,73,73,73,72,72,72,71,71,70,70,70,70,68,68,67,67,67,67,66, 66,66,66,65,65,64,63,62,62,62,61,61,61,60,60,60,59,59,59,59,59, 59,58,58,58,58,58,58,58,57,57,57,56,56,56,55,55,55,55,55,55,54, 54,53,52,52,50,50,50,50,49,49,49,49,49,49,48,48,48,48,48,48,47, 47,46,46,46,46,46,45,45,44,44,42,42,41,40,40,40,39,39,39,38,37, 37,37,36,35,35,35,35,34,34,34,34,33,33,33,33,33,33,32,32,31,31, 31,31,31,31,31,30,30,30,29,29,28,28,28,28,28,27,27,27,27,26,26, 25,25,25,24,24,24,24,24,23,23,23,22,22,22,21,21,21,21,20,20 }; const int u250_19[] = { // Capacity 150, // Number of items 250, // Size of items (sorted) 100,100,100,99,99,98,98,97,97,97,97,97,96,96,96,96,95,95,95,95, 94,94,94,94,94,93,93,92,92,91,90,89,89,89,89,89,89,88,88,87,87, 86,86,85,85,84,83,82,82,82,81,81,81,81,80,80,80,80,80,79,79,79, 78,78,77,77,77,77,77,76,76,76,75,75,74,74,74,74,74,74,74,74,73, 73,73,72,72,72,72,72,71,71,71,71,71,70,70,69,69,68,68,67,67,67, 66,65,65,65,65,65,64,64,64,63,63,63,63,63,63,62,62,62,62,61,61, 61,60,60,60,59,59,59,59,58,57,57,57,56,56,55,55,55,55,55,54,54, 54,54,53,53,53,53,52,52,52,52,52,52,52,52,51,51,51,50,50,50,50, 49,49,48,48,48,48,47,47,47,46,46,46,46,45,45,45,44,44,43,43,42, 42,42,42,41,41,41,41,40,40,40,40,39,39,39,39,38,38,37,37,37,37, 36,36,36,36,36,36,35,35,34,33,32,31,31,30,30,30,30,30,30,29,29, 28,27,27,26,26,25,25,25,24,24,23,23,23,23,23,22,22,21,21,20 }; const int u500_00[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,100,100,99,99,99,98,98,98,98,98,98,98,98,98,98, 97,97,97,97,97,97,97,97,97,96,96,96,96,96,96,95,95,95,95,95,95, 95,94,94,94,94,93,93,92,92,92,92,92,92,91,91,91,91,91,91,91,90, 90,90,90,90,90,90,90,90,89,89,88,88,88,88,87,87,87,86,86,86,86, 85,85,85,85,85,84,84,84,84,84,84,84,84,84,84,84,84,83,83,83,83, 82,82,82,82,82,81,81,81,81,81,81,81,80,80,80,80,80,80,80,80,80, 80,80,80,80,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78,78,77, 76,76,76,76,76,76,75,75,75,75,75,74,74,74,74,74,74,73,73,73,73, 73,73,73,73,72,72,72,71,71,71,71,71,71,70,70,70,70,70,70,70,70, 70,69,69,69,69,69,68,68,68,68,67,67,67,67,67,67,67,67,67,67,66, 66,66,66,66,66,66,65,65,65,65,64,64,64,64,64,64,64,63,63,63,62, 62,62,62,62,62,61,61,61,61,61,60,60,60,60,60,60,60,60,59,59,59, 59,59,58,58,58,58,58,58,57,57,57,57,57,57,57,57,57,57,56,56,55, 55,55,55,55,54,54,54,53,53,53,53,53,53,53,53,53,52,52,52,51,51, 50,50,50,50,49,49,49,49,49,49,48,48,48,48,48,48,47,47,47,47,47, 47,47,46,46,46,46,46,46,46,46,46,46,45,45,45,45,45,45,45,45,45, 45,44,44,44,44,44,43,43,43,43,43,43,43,43,43,42,42,42,42,42,42, 42,42,42,42,42,41,41,41,41,41,41,40,40,40,40,39,39,39,39,39,39, 38,38,38,38,38,38,38,38,37,37,37,37,37,37,37,37,36,36,36,36,36, 36,36,36,35,35,35,35,35,35,35,35,35,34,34,34,34,33,33,33,33,33, 33,32,32,32,32,32,32,32,32,31,31,31,30,30,30,30,30,30,30,30,29, 29,29,29,29,29,29,29,29,28,28,28,28,27,27,27,27,27,27,27,27,27, 26,26,26,26,26,26,25,25,25,25,25,25,25,25,24,24,24,24,24,24,23, 23,23,23,23,23,22,22,22,22,22,21,21,21,21,20,20,20,20,20 }; const int u500_01[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,98,98, 98,98,98,98,97,97,97,97,97,97,97,97,96,96,96,96,95,95,95,95,95, 95,95,94,94,94,94,94,93,92,92,92,92,92,92,92,92,92,91,91,91,91, 91,91,91,91,90,90,90,90,89,89,89,89,89,89,88,88,88,88,88,88,88, 88,88,87,87,87,87,87,87,87,86,86,86,85,85,85,85,85,85,84,84,84, 84,84,84,84,84,83,83,83,83,83,83,82,82,82,82,82,82,82,82,81,81, 81,81,81,81,81,80,80,80,80,79,79,79,79,79,78,78,78,78,78,78,78, 77,77,77,77,76,76,76,75,75,75,75,75,75,74,74,74,73,73,73,73,72, 72,72,72,72,72,72,72,71,71,71,71,71,71,70,70,70,70,70,70,70,69, 69,69,69,69,69,69,69,69,69,69,68,68,68,68,67,67,67,67,67,66,66, 66,66,66,66,66,66,65,65,65,65,65,64,64,64,64,64,64,63,63,63,63, 62,62,62,62,62,62,62,61,61,61,61,61,61,60,60,60,60,60,60,60,60, 60,60,60,59,59,59,59,59,58,58,58,58,58,57,57,57,57,57,57,57,56, 56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,54,54,54,54,54,53, 53,53,53,53,53,53,53,53,53,53,53,52,52,52,52,52,52,51,51,51,51, 51,50,50,50,50,50,50,50,50,49,49,49,49,48,48,48,48,48,48,48,48, 48,48,47,47,47,47,47,47,46,46,46,46,45,45,45,45,45,45,45,44,44, 44,44,44,44,44,44,44,43,43,43,43,43,43,43,42,42,42,42,42,42,42, 41,41,41,41,41,41,40,40,40,40,40,40,40,39,39,39,39,38,38,38,37, 37,37,37,37,37,37,37,37,37,37,36,36,36,36,36,35,35,35,34,34,34, 34,34,34,34,34,34,33,33,32,32,32,32,32,32,32,32,32,31,31,31,31, 31,31,30,30,30,29,29,29,28,28,27,27,27,27,27,27,27,27,27,27,26, 26,26,26,26,25,25,25,25,24,24,24,24,24,24,23,23,23,23,23,23,23, 22,22,22,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20,20,20 }; const int u500_02[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,99,99,99,99,99,99,99,98,98,98,98,98,98,98,98, 97,97,97,97,97,97,97,97,96,96,95,95,95,94,94,94,94,94,93,93,93, 92,92,92,92,92,92,92,92,91,91,91,91,91,91,91,91,91,91,91,90,90, 90,90,90,90,90,90,90,90,89,89,89,89,89,89,89,88,88,88,88,88,88, 88,87,87,87,87,87,86,86,86,86,86,85,85,85,84,84,84,84,84,83,83, 83,83,83,83,82,82,82,82,82,82,82,82,81,81,81,81,81,81,80,80,80, 80,80,79,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,78, 78,77,77,77,77,77,77,76,76,76,76,76,76,76,75,75,75,75,75,75,74, 74,74,74,74,74,74,73,73,73,72,72,72,72,72,71,71,70,70,70,69,69, 69,69,69,69,69,69,68,68,68,67,67,67,67,67,67,66,66,66,66,66,66, 66,66,66,66,66,65,65,65,65,65,65,65,65,64,64,64,64,64,64,64,63, 63,63,63,63,63,62,62,62,62,62,62,62,62,62,61,61,61,61,61,60,60, 60,60,60,60,60,59,59,59,59,59,59,59,59,59,58,58,58,58,58,58,58, 58,57,57,57,57,57,57,57,57,57,57,56,56,56,56,56,55,55,55,55,54, 54,54,54,54,54,54,54,54,54,54,52,52,52,52,52,52,52,52,52,52,52, 52,52,52,51,51,51,51,51,51,50,50,50,50,50,50,50,49,49,49,49,49, 49,48,48,48,48,47,46,46,46,46,46,45,45,45,45,45,45,45,45,45,45, 45,44,44,44,44,43,43,43,43,42,42,42,42,41,41,41,41,41,40,40,40, 40,40,40,40,40,40,39,39,39,39,39,39,38,38,38,38,38,38,38,38,37, 37,37,37,37,37,37,37,37,36,36,36,36,36,36,35,35,35,35,35,35,35, 35,34,34,34,34,34,33,33,33,33,33,33,32,32,32,32,31,31,31,30,30, 30,30,30,30,29,29,29,29,29,28,28,28,28,28,28,28,27,27,27,27,27, 27,26,26,26,26,26,26,26,26,25,24,24,24,23,23,23,23,23,23,22,22, 22,22,22,22,22,21,21,21,21,21,21,21,21,20,20,20,20,20,20 }; const int u500_03[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,99, 99,99,99,99,98,98,98,98,98,97,97,97,97,97,97,96,96,96,96,96,96, 96,95,95,95,95,95,94,94,94,93,93,93,93,93,93,93,93,93,92,92,92, 91,91,91,91,91,91,91,91,90,90,90,90,90,90,90,90,90,90,89,89,89, 89,89,89,88,88,88,88,88,88,87,87,87,87,86,86,86,86,86,85,85,85, 85,84,84,84,84,84,84,84,84,84,84,84,84,83,83,83,83,83,82,82,82, 82,82,82,82,81,81,81,81,81,81,81,81,80,80,80,80,79,79,78,78,78, 78,78,78,78,78,78,78,77,77,77,77,77,76,76,76,76,76,76,76,76,76, 75,75,75,75,74,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73,73, 73,72,72,72,72,72,71,71,71,71,71,71,71,71,71,70,70,70,69,69,69, 69,69,69,69,69,68,68,68,68,68,68,67,66,66,66,66,66,66,65,65,65, 65,65,64,64,64,64,64,64,64,64,64,63,63,63,63,63,63,63,62,62,62, 62,61,61,61,61,61,61,61,61,61,61,61,61,61,60,60,60,60,60,59,59, 59,59,59,58,58,58,58,58,57,57,57,56,56,56,56,56,56,55,55,55,55, 55,55,55,54,54,54,54,54,54,54,53,53,53,53,53,53,52,52,52,52,51, 51,51,51,51,51,50,50,50,50,50,49,49,49,49,49,48,48,48,48,48,47, 47,47,47,47,47,47,46,46,46,46,46,46,45,45,45,45,45,45,45,44,44, 44,44,44,44,44,44,43,43,43,43,43,42,42,42,42,42,42,41,41,41,41, 41,41,41,40,40,40,40,40,39,39,39,39,39,39,39,39,38,38,38,38,38, 38,38,38,38,37,37,37,36,36,36,36,36,35,35,35,35,35,34,34,34,34, 34,34,33,33,33,33,33,33,32,32,32,32,32,32,31,31,31,31,31,31,31, 30,30,30,30,30,30,30,29,29,29,28,28,28,28,28,28,28,28,27,27,27, 27,27,27,27,26,26,25,25,25,25,24,24,24,24,24,24,24,23,23,23,23, 23,23,22,22,22,22,22,22,22,22,22,22,21,21,21,20,20,20,20,20,20 }; const int u500_04[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,98, 98,98,98,97,97,97,97,97,97,97,97,96,96,96,95,95,95,95,95,95,95, 95,95,95,95,94,94,94,94,94,94,93,93,93,93,93,92,92,92,92,92,92, 92,92,91,91,91,91,90,90,90,90,90,90,90,89,89,89,89,89,89,88,88, 88,88,88,88,88,87,87,87,87,87,87,86,86,86,86,86,86,86,86,86,86, 86,85,85,85,85,85,85,85,85,85,85,84,84,84,84,84,84,84,84,83,83, 83,83,82,82,82,81,81,81,80,80,80,80,80,79,79,79,79,79,79,79,79, 79,79,78,78,78,77,77,77,77,77,77,77,77,76,76,76,76,76,76,75,75, 75,75,75,75,74,74,74,74,74,73,73,73,73,73,73,73,73,73,72,72,72, 72,72,72,72,72,72,72,72,71,71,71,70,70,70,70,70,70,70,69,69,69, 69,69,69,69,68,68,68,68,68,68,68,67,67,67,67,67,66,66,66,66,66, 65,65,65,65,65,65,65,64,64,64,64,64,63,63,63,63,63,63,62,62,62, 62,62,62,62,62,62,62,62,61,61,61,61,61,60,60,60,60,60,59,59,59, 59,59,59,59,58,58,58,58,58,58,58,58,57,57,56,56,56,56,56,56,55, 55,55,55,55,55,54,54,54,54,54,54,54,53,53,53,53,53,53,52,52,51, 51,51,51,51,51,51,51,51,51,50,50,50,50,50,50,50,50,50,50,50,49, 49,49,49,49,49,49,48,48,48,48,48,47,47,47,47,47,46,46,46,46,46, 46,45,45,45,45,44,44,44,44,44,44,44,44,43,43,43,43,43,43,43,42, 42,42,42,42,41,41,41,41,41,40,40,40,40,40,40,40,39,39,39,39,39, 39,38,38,38,38,38,37,37,37,37,37,36,36,36,36,36,35,35,35,35,35, 35,35,34,34,34,34,34,34,34,34,33,33,33,33,33,32,32,32,32,32,32, 31,31,31,31,31,30,30,30,30,30,30,29,29,29,28,28,28,28,28,28,27, 27,27,27,27,27,27,27,26,26,26,26,26,26,26,25,24,24,24,24,24,24, 24,23,23,23,23,23,22,22,22,22,22,22,22,21,21,21,21,21,21,21,21 }; const int u500_05[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,99, 99,99,98,97,97,97,97,97,97,97,96,96,96,96,96,96,95,95,95,95,95, 95,95,95,95,94,94,94,94,94,94,94,94,94,93,93,93,93,92,92,92,92, 92,92,92,92,92,92,91,91,91,91,91,91,91,91,90,90,90,90,90,90,90, 90,89,89,89,89,88,88,88,88,88,87,87,87,87,87,87,87,87,87,87,86, 86,86,86,86,85,85,85,85,85,84,84,84,84,83,83,83,83,83,83,83,83, 83,83,83,82,82,82,82,82,82,81,81,81,81,81,81,81,80,80,80,80,80, 80,80,80,80,80,79,79,79,78,78,78,78,78,78,78,78,78,77,77,77,76, 76,76,75,75,75,75,74,74,74,74,74,74,73,73,73,73,73,73,73,72,72, 72,72,72,72,72,71,71,71,71,71,70,70,70,70,70,70,70,69,69,69,69, 68,68,68,68,68,68,67,67,67,67,67,66,66,66,66,66,66,66,66,65,65, 65,65,65,64,64,64,63,63,63,63,63,62,62,62,62,62,62,61,61,61,61, 61,61,61,61,61,61,60,60,60,60,60,59,59,59,59,59,59,59,59,58,58, 58,58,58,57,57,57,57,57,57,56,56,56,56,56,56,56,56,56,56,56,55, 55,55,55,55,55,55,55,54,54,54,54,54,54,54,54,54,53,53,53,53,53, 52,52,52,52,52,52,52,51,51,51,51,51,51,51,51,50,49,49,49,49,49, 48,48,48,48,48,47,47,46,46,46,46,46,45,45,45,45,45,45,44,44,44, 44,44,44,44,44,44,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42, 42,41,41,41,41,41,41,41,41,41,41,40,40,40,40,40,40,40,40,39,39, 39,39,39,38,38,38,38,38,37,37,37,37,37,37,37,36,36,36,35,35,35, 35,35,35,35,35,35,34,34,34,34,34,34,33,33,33,33,33,32,32,32,32, 32,32,31,31,31,30,30,30,29,29,29,29,29,29,29,29,29,28,28,27,27, 27,27,26,26,26,26,26,26,26,25,25,25,25,25,25,25,25,25,25,24,24, 24,24,23,23,23,22,22,22,22,22,22,21,21,21,21,20,20,20,20,20,20 }; const int u500_06[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,98,98,98,98,98,98,98,97, 97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,95,95,95,95,95,95, 95,95,95,95,95,95,94,94,94,94,94,94,93,93,93,93,93,93,93,93,92, 92,92,92,91,91,91,91,91,90,90,90,90,90,90,90,89,89,89,89,89,88, 88,88,88,88,88,87,87,87,87,87,87,87,87,87,86,86,86,86,86,85,85, 85,85,85,85,84,84,84,84,84,83,83,83,82,82,82,82,82,82,82,82,82, 81,81,81,81,81,81,80,80,80,80,80,80,80,80,80,79,79,79,79,79,78, 78,78,78,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,76,75,75, 75,75,74,74,74,74,74,74,74,73,73,73,73,73,72,72,71,71,71,71,71, 71,71,71,71,71,70,70,70,70,70,70,70,70,69,69,69,69,69,69,69,68, 68,68,68,68,68,68,68,68,68,67,67,67,67,67,66,66,66,66,66,66,66, 66,66,65,65,65,65,65,64,64,64,64,64,63,63,63,63,63,63,63,63,62, 62,62,62,61,61,61,61,61,61,61,61,60,60,60,60,60,60,60,60,59,59, 59,59,59,58,58,58,58,58,58,57,57,57,57,57,57,57,57,57,56,56,56, 56,56,56,55,55,55,55,55,54,54,54,54,53,53,53,53,53,53,53,52,52, 52,52,51,51,51,51,51,51,50,50,50,50,50,50,49,49,49,49,49,49,49, 49,48,48,48,48,48,48,47,47,47,47,47,47,47,47,47,47,46,46,46,46, 46,46,46,46,46,46,45,45,45,45,45,45,45,44,44,44,44,44,44,44,43, 43,43,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42,42,41,41, 41,41,41,41,41,41,40,40,40,40,40,40,40,39,38,38,38,38,38,37,37, 37,37,37,37,36,36,36,36,35,35,35,34,34,34,34,34,34,33,33,33,33, 33,32,32,32,32,32,31,31,31,31,31,30,30,30,29,29,29,29,29,29,29, 29,28,28,28,28,27,27,27,27,27,27,27,27,26,26,26,26,26,26,25,25, 24,24,24,23,23,22,22,22,22,22,22,22,21,20,20,20,20,20,20 }; const int u500_07[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,99,99,99,99,98,98,98,98,98, 98,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,95,95,95,95,95, 95,94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,92,92,92,92, 92,92,92,91,91,91,91,91,91,90,90,90,90,90,89,89,89,89,89,89,88, 88,88,88,88,88,88,88,88,88,88,87,87,87,87,87,87,87,87,87,86,86, 86,85,85,85,85,84,84,84,83,83,83,83,83,83,83,83,82,82,82,82,82, 82,82,82,82,82,82,81,81,81,81,81,80,80,80,80,79,79,79,79,79,79, 79,79,79,78,78,78,78,78,77,77,77,77,77,77,77,76,76,76,76,76,75, 75,75,75,75,75,75,75,75,75,74,74,74,74,74,74,74,74,74,74,74,73, 73,73,73,73,73,73,73,72,72,72,72,71,71,71,71,71,71,70,70,70,70, 70,70,70,69,69,69,68,68,68,68,68,67,67,67,65,65,65,65,65,65,65, 65,64,64,64,64,64,64,63,63,63,63,63,63,63,63,63,63,63,62,62,62, 62,62,61,61,61,61,61,61,60,60,60,59,59,59,59,59,59,58,58,58,57, 57,56,56,56,56,56,56,56,56,56,56,55,55,55,55,55,55,54,54,54,54, 54,54,54,53,53,53,53,53,53,53,52,52,52,52,52,51,51,51,51,51,51, 51,50,50,50,50,50,50,50,49,49,49,49,49,49,49,49,49,49,49,49,49, 48,48,48,48,48,48,48,48,47,47,47,47,47,47,47,46,46,46,46,45,45, 45,45,44,44,44,44,44,44,44,44,44,44,44,43,43,43,43,43,43,43,43, 42,42,42,42,41,41,41,41,41,41,40,40,40,40,39,39,38,38,38,37,37, 37,37,37,37,37,37,36,36,36,36,36,36,36,36,35,35,35,35,35,34,34, 34,34,33,33,33,33,33,32,32,32,32,32,31,31,31,31,31,31,30,30,30, 29,29,29,29,29,28,28,28,28,28,28,27,27,26,26,26,26,26,26,26,26, 25,25,25,25,25,25,25,25,25,25,24,24,24,24,24,23,23,23,23,23,23, 23,23,22,22,22,22,22,22,21,21,21,21,21,21,21,20,20,20,20,20 }; const int u500_08[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,100,100,99,99,99,98,98,98,98,97,97,97,97,97,97, 97,96,96,96,96,96,96,96,95,95,95,95,95,95,95,94,94,94,94,94,93, 93,93,93,93,92,92,91,91,90,90,89,89,89,89,89,89,88,88,88,88,88, 87,87,86,86,86,86,86,86,86,86,86,85,85,85,85,85,85,84,84,84,84, 84,84,83,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,82,81,81, 81,81,81,81,81,81,81,80,80,80,80,80,80,80,80,79,79,79,79,79,79, 79,79,78,78,78,78,77,77,77,77,77,77,77,77,76,76,76,76,75,75,75, 75,75,75,75,74,74,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73, 73,73,72,72,72,72,72,72,72,72,72,72,71,71,71,70,70,70,70,69,69, 69,68,68,68,68,68,68,68,68,68,68,68,68,67,67,67,67,67,67,67,67, 67,67,66,66,66,65,65,65,65,64,64,64,64,64,63,63,63,63,63,63,63, 63,63,63,62,62,62,62,61,61,60,60,60,59,59,59,59,59,58,58,57,57, 57,57,57,57,57,57,57,57,56,56,56,56,56,56,56,56,55,55,55,55,55, 55,55,55,55,54,54,54,54,53,53,53,53,53,53,53,52,52,52,51,51,51, 51,51,50,50,50,50,50,50,50,50,49,49,49,49,49,49,49,49,48,48,48, 48,48,48,48,48,47,47,47,47,47,47,47,47,46,46,46,46,46,45,45,44, 44,44,43,43,43,43,43,43,42,42,42,42,42,42,42,42,42,42,42,41,41, 41,41,41,40,40,40,40,40,40,40,40,40,40,40,39,39,39,39,39,39,39, 38,38,38,38,38,38,38,38,38,38,37,37,37,37,37,37,36,36,36,36,36, 36,36,36,35,35,35,35,35,35,34,34,33,33,33,33,33,32,32,32,32,32, 32,32,32,32,31,31,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30, 30,30,30,29,29,29,29,28,28,28,28,28,27,27,27,27,27,27,27,27,27, 26,26,26,26,25,25,25,25,25,25,24,24,24,24,24,24,24,23,23,23,22, 22,22,22,22,21,21,21,21,21,21,21,21,21,21,21,20,20,20,20 }; const int u500_09[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,99,99,99,98,98,98,98,97, 97,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,95,95,95,95, 95,95,95,95,95,94,94,94,94,94,94,94,94,94,94,93,93,93,93,92,92, 92,91,91,90,90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,88,88, 88,88,87,87,87,87,87,86,86,85,85,85,85,84,84,84,84,84,83,83,83, 82,82,82,82,82,81,81,81,81,81,81,81,80,80,80,80,80,80,80,80,79, 79,79,79,79,79,78,78,78,78,78,77,77,77,77,77,77,77,77,77,77,77, 77,76,76,76,75,75,75,75,75,75,74,74,74,74,74,74,74,74,74,74,74, 73,73,73,73,73,73,73,72,72,72,72,72,72,72,72,71,71,71,71,71,71, 71,70,70,70,70,70,70,69,69,68,68,68,68,67,67,67,67,67,67,67,66, 66,66,66,66,65,65,65,65,65,65,65,64,64,64,64,63,63,63,63,63,63, 63,62,62,62,62,62,62,62,61,61,61,61,61,61,60,60,60,60,60,60,59, 59,59,59,59,59,59,59,59,59,58,58,58,58,58,58,58,58,57,57,57,57, 57,57,56,56,56,56,56,55,55,55,55,55,55,55,55,55,55,55,54,54,54, 54,54,54,53,53,53,53,53,52,52,52,52,52,52,52,52,52,52,51,51,51, 50,50,50,50,50,50,50,50,49,49,49,49,49,49,49,49,48,48,48,48,48, 48,48,48,48,48,47,47,47,47,47,46,46,46,46,46,46,46,46,46,45,45, 45,45,45,44,44,44,44,43,43,42,42,42,42,42,42,41,41,41,41,41,40, 40,40,40,40,40,40,39,39,39,39,39,39,39,38,38,38,37,37,37,37,37, 37,37,36,36,36,36,36,36,36,35,35,35,35,35,35,34,34,34,34,34,33, 33,33,33,33,33,33,32,32,32,31,31,31,31,31,31,31,31,31,30,30,30, 30,30,30,30,30,30,29,29,29,29,28,28,28,28,28,28,27,27,27,27,27, 27,26,26,26,26,25,25,25,25,25,25,24,24,24,24,24,24,24,23,23,23, 23,23,23,23,23,22,22,22,22,22,21,21,21,21,21,21,20,20,20 }; const int u500_10[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,98,98,98,98,98,98,98,97, 97,97,97,96,96,96,96,96,95,95,95,94,94,94,94,93,93,93,93,93,93, 93,92,92,92,91,91,91,91,91,91,91,91,91,91,90,90,90,90,90,90,89, 89,89,89,89,89,89,89,89,88,88,88,88,88,87,87,87,87,87,87,87,86, 86,86,86,85,85,85,85,85,84,84,84,84,84,84,84,84,83,83,83,83,83, 83,82,82,82,82,82,82,82,82,82,82,82,81,81,81,81,81,80,80,80,80, 80,79,79,79,79,79,78,78,78,77,77,77,77,77,77,77,77,77,76,76,76, 76,76,76,76,76,76,75,75,75,75,74,74,74,74,74,74,74,74,74,74,74, 73,73,73,73,73,73,72,72,72,72,72,72,72,72,72,72,71,71,71,71,71, 71,71,71,70,70,70,70,70,70,69,69,69,69,69,68,68,68,68,68,68,68, 68,67,67,67,67,67,67,67,67,67,67,66,66,66,66,66,65,65,64,64,64, 64,63,63,63,63,63,63,63,63,63,62,62,62,62,62,61,61,61,61,61,61, 60,60,60,59,58,58,58,58,58,58,57,57,57,57,57,57,57,56,56,56,56, 56,56,56,55,55,55,55,55,54,54,54,54,54,54,54,54,53,53,53,53,52, 52,52,52,52,52,52,52,51,51,51,51,51,50,50,50,50,50,49,49,49,49, 49,49,49,49,49,48,48,48,48,48,48,47,47,47,47,47,47,46,46,46,46, 46,46,46,46,46,45,45,45,45,45,45,45,44,44,44,44,43,43,43,43,42, 42,42,42,42,42,42,41,41,41,41,41,40,40,40,40,40,40,40,40,40,40, 39,39,39,39,39,39,39,39,38,38,38,38,38,38,38,38,38,37,37,37,37, 37,37,37,37,36,36,36,35,35,35,35,35,35,35,35,34,34,34,34,34,33, 33,33,33,33,32,32,32,32,32,32,31,31,31,31,31,31,31,31,31,30,30, 29,29,28,28,28,28,28,28,28,28,28,27,27,27,27,27,27,26,26,26,26, 26,25,25,25,25,25,25,25,24,24,24,24,24,24,24,24,23,23,23,23,23, 23,23,22,22,22,22,22,21,21,21,21,20,20,20,20,20,20,20,20 }; const int u500_11[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,99,98,98,98,98,98,98,97, 97,97,97,96,96,96,95,95,95,95,95,95,95,94,94,94,94,94,94,93,93, 93,93,93,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,92,91, 91,91,91,91,91,90,90,90,90,90,89,89,89,89,89,89,89,88,88,88,88, 88,88,88,87,87,87,87,87,87,87,87,87,87,87,86,86,86,86,86,86,85, 85,85,85,85,84,84,84,84,84,84,84,83,83,83,83,83,82,82,82,82,82, 82,81,81,81,81,81,80,80,80,79,79,79,79,79,79,79,79,79,78,78,78, 78,78,78,77,77,76,76,76,76,76,75,75,75,75,74,74,74,73,73,73,73, 72,72,72,72,72,72,72,72,72,72,71,71,71,71,71,71,71,70,70,70,70, 70,70,70,69,69,69,69,69,69,68,68,68,68,68,68,67,67,67,67,67,66, 66,66,66,66,66,66,66,66,66,65,65,64,64,64,64,64,64,64,64,64,64, 64,63,63,63,63,63,63,63,62,62,62,61,61,61,61,61,61,61,61,61,61, 60,60,60,60,60,59,59,59,59,59,59,59,59,59,58,58,58,58,58,57,57, 57,57,57,57,56,56,56,55,55,55,55,55,55,55,54,54,54,54,53,53,53, 53,52,52,52,52,52,52,51,51,51,51,51,50,50,50,50,49,49,48,48,48, 48,47,47,47,47,47,47,46,46,46,46,46,46,46,46,45,45,45,45,45,44, 44,44,44,44,44,43,43,43,43,43,43,42,42,42,42,42,42,42,42,42,42, 41,41,41,41,41,41,40,40,40,40,40,40,40,40,40,39,38,38,38,38,38, 38,38,38,38,38,38,38,38,38,38,37,37,37,37,37,36,36,36,36,36,36, 36,36,36,36,36,35,35,35,35,35,35,34,34,34,34,34,33,33,33,32,32, 32,32,32,32,32,32,32,32,32,31,31,31,31,31,31,31,31,30,30,30,30, 30,29,29,29,28,28,28,28,28,28,27,27,27,27,27,27,26,26,26,26,26, 26,26,25,25,25,25,25,25,25,25,24,24,24,23,23,23,23,23,22,22,22, 22,22,22,22,22,22,21,21,21,21,21,21,21,21,21,20,20,20,20 }; const int u500_12[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,99,98,98,98,98,98, 97,97,97,97,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,94, 94,94,94,94,94,94,94,93,93,93,93,93,92,92,92,92,92,92,92,91,91, 91,91,91,91,91,91,91,90,90,90,90,90,90,90,89,89,89,89,89,89,88, 88,88,87,87,87,87,86,86,85,85,85,85,85,85,84,84,84,83,83,82,82, 82,82,82,82,82,81,81,81,81,81,81,81,81,80,80,80,79,79,79,79,79, 78,78,78,78,78,78,78,78,78,78,78,77,77,77,76,76,76,76,75,75,75, 75,75,75,75,75,75,75,75,74,74,74,74,74,74,74,74,73,73,73,73,73, 73,73,73,73,73,73,72,72,72,72,72,72,71,71,71,71,71,71,71,70,70, 70,70,70,70,70,70,70,70,70,69,69,69,69,69,69,68,68,68,68,67,67, 67,67,67,67,67,66,66,66,66,66,66,66,65,65,65,64,64,64,64,64,64, 64,64,63,63,63,63,63,63,63,62,62,62,62,62,62,62,62,61,61,61,61, 61,61,60,60,60,60,60,60,60,59,59,59,58,58,58,57,57,57,57,57,56, 56,56,56,55,55,55,55,55,55,55,54,54,54,54,54,54,53,53,53,53,52, 52,52,52,52,52,52,52,51,51,51,51,51,51,51,51,51,51,51,51,50,50, 50,50,50,49,49,49,49,49,48,48,48,48,48,48,48,48,47,47,47,47,47, 46,46,46,46,45,45,45,45,45,45,44,44,44,44,44,44,44,43,43,43,43, 43,43,43,43,42,42,42,42,41,41,41,41,41,41,41,41,40,40,40,40,39, 39,39,39,39,38,38,38,38,38,37,37,37,37,36,36,36,36,36,36,35,35, 35,35,35,35,35,35,35,34,34,34,33,33,33,33,33,32,32,32,32,32,32, 32,32,31,31,31,31,31,31,31,31,31,31,30,30,30,30,29,29,29,28,28, 28,28,28,27,27,27,27,27,27,27,27,26,26,26,26,26,26,26,26,26,25, 25,25,25,25,25,25,24,24,24,24,24,24,23,23,23,23,23,23,23,23,22, 22,22,22,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20,20 }; const int u500_13[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,99,99,99,99,98,98,97,97,97, 97,96,96,96,96,96,96,96,95,95,95,95,94,94,94,94,94,94,94,93,93, 93,93,93,93,93,93,93,92,92,92,92,92,91,91,91,91,91,91,91,90,90, 90,90,89,89,89,89,89,89,89,88,88,88,88,87,87,87,87,87,87,86,86, 86,86,85,85,85,85,85,85,85,85,84,84,84,84,84,84,84,84,84,84,83, 83,83,83,82,82,82,81,81,80,80,80,80,80,80,80,80,80,79,79,79,79, 79,79,79,79,78,78,78,78,78,77,77,77,77,77,77,77,76,76,76,76,76, 76,76,75,75,75,75,75,75,74,74,74,74,73,73,73,73,73,73,72,72,72, 72,72,72,71,71,71,71,71,70,70,70,70,70,69,69,69,69,69,68,68,68, 68,68,68,68,68,68,67,67,67,66,66,66,66,66,66,66,65,65,65,65,65, 65,64,64,64,64,64,64,64,64,64,64,64,64,64,63,63,63,63,63,63,63, 63,62,62,62,62,62,62,62,61,61,61,61,61,61,61,61,60,60,60,60,59, 59,59,59,59,59,59,59,58,58,58,58,58,58,58,58,57,57,57,57,57,56, 56,56,56,56,56,56,55,55,55,55,55,55,55,54,54,54,54,54,54,53,53, 53,53,53,53,52,52,52,52,52,52,52,51,50,50,50,50,50,50,50,50,49, 49,49,49,49,49,48,48,48,48,47,47,47,47,47,46,46,45,45,45,45,45, 45,45,45,45,44,44,44,44,43,43,43,43,42,41,41,41,41,40,40,40,40, 40,40,40,40,39,39,39,39,39,39,39,39,38,38,38,38,38,38,38,37,37, 37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,36,36,36,35,35, 35,35,35,35,35,35,34,34,34,34,33,32,32,32,32,32,32,31,31,31,31, 30,30,30,30,30,30,30,30,30,30,30,29,29,29,29,28,28,28,28,28,28, 28,28,27,27,27,27,27,27,27,27,26,26,26,26,25,25,25,25,25,25,25, 24,24,24,24,24,24,24,24,23,23,22,22,22,22,22,22,22,22,22,22,22, 22,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20,20,20,20 }; const int u500_14[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,100,100,100,99,99, 99,99,98,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,96,96,96, 96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,95,94,94,93, 93,93,93,93,93,93,93,92,92,92,92,92,92,91,91,91,91,90,90,90,90, 90,89,89,89,89,88,88,88,88,88,87,87,87,87,87,86,86,86,86,86,86, 85,85,85,85,85,85,84,84,84,83,83,83,83,83,83,83,82,82,82,82,82, 81,81,81,81,81,81,81,80,80,80,80,79,79,79,79,79,78,78,78,78,78, 78,78,78,77,77,77,77,77,77,76,76,76,76,76,76,76,76,76,75,75,75, 75,75,75,75,75,74,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73, 73,73,72,72,72,72,71,71,71,71,71,71,71,71,71,70,70,70,70,70,69, 69,69,69,69,69,69,69,69,69,68,68,68,68,67,67,67,67,66,66,66,66, 65,65,65,64,64,64,64,64,64,63,63,63,62,62,62,62,62,62,62,62,62, 62,61,61,61,61,61,61,61,60,60,60,60,60,59,59,59,59,59,58,58,58, 58,58,57,57,57,57,56,56,56,56,56,56,56,56,56,56,55,55,55,55,55, 54,54,54,53,53,52,52,52,52,52,52,52,52,52,52,52,52,51,51,51,51, 51,51,50,50,50,49,49,49,49,49,49,49,49,49,48,48,48,48,48,48,48, 48,47,47,47,47,47,47,47,47,47,47,47,46,46,46,46,46,45,45,45,45, 45,45,45,45,44,44,44,44,44,44,44,44,44,43,43,43,42,42,42,42,42, 41,41,41,41,41,41,40,40,40,40,39,39,39,39,39,38,38,38,38,38,38, 37,37,36,36,36,36,36,36,36,35,35,35,35,35,35,34,34,34,34,34,34, 34,34,33,33,33,33,32,32,32,32,32,31,31,31,31,31,31,30,30,30,30, 30,30,29,29,29,28,28,28,27,27,27,27,27,27,27,27,26,26,26,26,26, 26,26,25,25,25,25,25,25,25,24,24,24,24,24,23,23,23,23,22,22,22, 22,22,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20,20,20,20, 20 }; const int u500_15[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,98,98,98,98,98,98,98,98,97, 96,96,96,95,95,93,93,93,93,93,93,93,93,93,92,92,91,91,91,91,91, 91,91,90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,89,89,89,89, 88,88,88,88,88,88,88,88,88,88,88,88,88,87,87,87,87,87,87,87,87, 87,86,86,85,85,85,85,85,85,85,85,85,84,84,83,83,83,83,83,83,82, 82,82,82,82,82,81,81,81,81,81,80,80,80,80,80,80,79,79,79,79,79, 79,78,78,78,78,78,78,78,77,77,77,77,77,77,77,77,76,76,76,76,76, 75,75,75,75,75,75,75,75,75,74,74,74,74,74,74,74,74,74,73,73,73, 73,72,72,72,72,71,71,71,71,71,71,71,71,71,70,70,70,70,70,70,69, 69,69,69,69,69,69,69,69,68,68,68,68,68,68,68,67,67,67,67,67,67, 66,66,66,66,66,66,66,65,65,65,65,65,65,65,65,65,65,64,64,64,64, 64,63,63,63,63,63,63,63,63,63,63,63,62,62,62,62,61,61,61,61,61, 61,61,61,60,60,59,59,59,59,58,58,58,58,57,57,57,57,57,57,57,56, 56,56,56,56,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,55,54, 54,54,54,53,53,53,53,53,52,52,52,52,52,52,52,52,51,51,51,51,51, 51,51,51,51,50,50,50,50,50,50,50,50,49,49,49,49,49,49,48,48,48, 48,48,48,48,48,47,47,47,47,46,46,46,46,46,46,46,45,45,45,45,45, 45,45,44,44,44,44,44,44,43,43,43,43,43,43,42,42,42,42,42,42,42, 42,42,42,42,42,41,40,40,40,39,39,39,39,38,38,38,38,38,37,37,37, 37,37,37,36,36,36,36,36,35,35,35,35,35,35,35,35,34,34,34,34,34, 34,34,34,34,33,33,33,33,33,33,32,32,32,32,32,32,32,32,32,32,31, 31,31,31,31,30,30,30,30,30,30,30,30,29,29,29,29,29,29,28,28,28, 28,28,27,27,27,27,26,26,26,26,26,26,26,25,25,25,24,24,24,24,24, 23,23,22,22,22,22,21,21,21,21,21,21,21,21,20,20,20,20,20 }; const int u500_16[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,100,99,99,99,99,99,99,99,98,98,98,98,97,97,96, 96,96,96,96,96,96,96,95,95,95,95,95,94,94,94,94,94,94,93,93,93, 93,93,93,93,93,93,93,92,92,92,92,91,91,91,90,90,90,90,90,90,90, 90,90,89,89,89,89,89,88,88,88,88,88,88,87,87,87,87,87,87,87,87, 87,86,86,86,86,86,86,86,85,85,84,84,84,84,84,83,83,83,83,83,83, 83,83,83,82,82,82,82,82,81,81,81,81,81,81,81,81,81,81,80,80,80, 80,79,79,79,79,79,79,79,78,78,78,78,78,78,78,78,77,77,77,77,77, 77,77,77,77,77,77,77,77,76,76,76,76,76,75,75,75,75,75,75,75,75, 75,74,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73,72,72,72,72, 72,72,72,71,71,71,70,70,70,70,70,70,69,69,69,69,69,69,69,69,69, 69,68,68,68,68,67,67,67,67,67,66,66,66,66,66,66,66,66,65,65,65, 65,65,65,65,65,64,64,64,64,64,64,64,64,64,64,63,63,63,63,63,63, 62,62,62,62,62,62,62,62,61,61,61,61,61,61,60,60,60,60,60,60,60, 60,60,59,59,59,59,59,59,58,58,58,58,57,57,56,56,56,56,55,55,55, 55,54,54,54,54,53,52,52,52,52,52,52,52,52,52,51,51,51,51,50,50, 50,50,50,50,50,50,50,50,49,49,49,49,49,49,48,48,48,48,48,48,48, 48,47,46,46,46,46,46,46,46,46,45,45,45,45,45,44,44,44,44,44,44, 44,43,43,43,43,43,43,43,42,42,42,41,41,41,41,41,41,40,40,40,40, 39,39,39,38,38,38,38,38,38,38,38,38,38,37,37,37,37,37,37,36,36, 36,36,36,36,36,36,36,36,35,35,35,35,35,35,34,34,34,33,33,33,32, 32,32,31,31,31,31,31,31,30,30,30,30,30,29,29,29,29,29,29,29,29, 28,28,28,28,28,27,27,27,27,26,26,26,26,26,26,25,25,25,25,25,25, 25,25,25,24,24,24,24,24,24,24,23,23,23,23,23,23,23,22,22,22,22, 22,22,22,21,21,21,21,21,21,20,20,20,20,20,20,20,20,20,20 }; const int u500_17[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,99,99,99,99,99,99,99,98,98,98,98,98,98,98,98,98,98, 97,97,96,96,96,96,96,96,96,96,96,95,95,95,95,95,94,94,94,94,94, 94,94,93,93,93,93,93,92,92,92,92,92,91,91,91,91,91,91,91,91,91, 90,90,90,90,90,90,89,89,89,89,89,88,88,88,88,87,87,87,87,87,87, 86,86,86,86,86,85,85,85,85,85,85,85,85,85,84,84,84,84,83,83,83, 83,83,83,83,83,82,82,82,82,82,82,82,82,82,82,82,81,81,81,80,80, 80,80,80,80,79,79,79,79,79,78,78,78,78,78,78,77,77,77,77,77,77, 77,77,77,76,76,75,75,74,74,74,74,74,74,74,74,73,73,73,73,73,73, 73,72,72,72,72,72,71,71,71,71,71,71,71,71,71,71,70,70,70,70,70, 70,70,70,69,69,69,69,69,69,68,68,68,68,68,67,67,67,67,67,67,67, 67,67,67,67,67,67,67,66,66,66,66,66,66,66,65,65,64,64,64,64,64, 64,64,63,63,62,62,62,62,62,61,61,61,61,61,60,60,60,60,60,59,59, 59,59,59,58,58,58,57,57,57,57,57,57,57,57,57,57,57,57,57,56,56, 56,56,55,55,54,54,54,54,54,54,54,54,53,53,53,53,53,52,52,52,52, 52,52,52,52,51,51,51,51,50,50,49,49,49,49,49,49,49,48,48,48,48, 48,48,48,48,47,47,47,46,46,46,46,45,45,45,44,44,44,44,44,44,44, 44,44,43,43,43,43,43,43,43,42,42,42,42,42,42,41,41,41,41,40,40, 40,40,40,40,40,40,40,40,39,39,39,39,39,39,39,38,38,38,38,38,38, 37,37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,35,35,35,35, 35,34,34,34,34,34,34,34,33,33,33,33,33,32,32,32,32,32,32,31,31, 31,31,31,31,31,31,30,30,30,30,30,29,29,29,29,29,29,28,28,28,28, 28,28,28,28,27,27,27,27,27,27,27,26,26,26,25,25,25,25,25,25,25, 25,25,25,25,25,24,24,24,24,24,24,23,23,23,23,23,23,23,23,23,22, 22,22,22,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20 }; const int u500_18[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,99,99,99,99,99,98,98,98,97,97,97,97,97,97,96, 96,96,95,95,95,95,95,95,95,95,95,95,95,94,94,94,94,94,93,93,93, 93,93,93,93,93,93,93,92,92,92,92,91,91,91,91,91,91,91,91,90,90, 90,90,90,90,90,89,89,89,89,89,89,88,88,88,88,88,88,88,88,87,87, 87,87,87,87,86,86,86,86,86,86,86,86,86,86,85,85,85,85,85,85,85, 85,85,85,84,84,84,84,84,84,84,84,83,83,83,83,83,83,83,83,82,82, 82,82,82,82,81,81,81,81,80,80,80,79,79,79,79,79,79,78,78,78,78, 77,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,76,76,76,76,75, 75,75,75,74,74,74,74,74,74,74,73,73,73,73,72,72,71,71,71,71,70, 70,70,70,70,70,69,69,69,69,69,69,68,68,68,68,68,67,67,67,67,67, 67,67,66,66,66,66,66,66,66,66,66,66,65,65,65,65,65,65,65,64,64, 64,64,64,63,63,63,63,62,62,62,61,61,61,61,61,60,60,60,60,60,59, 59,59,59,59,59,59,58,58,58,58,58,58,57,57,57,57,57,57,57,57,56, 56,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,55,54,54,54,54, 54,54,54,53,53,53,53,53,53,52,52,52,52,52,52,52,52,52,52,51,51, 51,51,51,51,51,50,50,50,50,50,50,50,49,49,49,49,48,48,48,48,48, 48,47,47,47,47,46,46,46,46,46,46,46,45,45,45,45,45,45,45,45,45, 44,44,44,44,44,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,41, 41,41,40,40,40,40,40,40,40,40,39,39,39,39,39,39,39,38,38,38,38, 38,38,37,37,36,36,36,35,35,35,34,34,34,34,34,34,33,33,33,33,33, 33,32,32,32,32,32,32,31,31,31,31,31,30,30,30,30,30,29,29,29,29, 29,29,28,28,28,28,28,28,28,28,28,27,27,27,27,27,27,27,27,26,26, 26,26,26,26,25,25,25,25,24,24,24,24,24,23,23,23,23,23,23,22,22, 22,22,22,22,22,22,22,22,21,21,21,21,21,21,21,20,20,20,20 }; const int u500_19[] = { // Capacity 150, // Number of items 500, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,98, 98,98,97,97,97,97,97,97,97,97,97,96,96,96,96,96,95,95,95,95,95, 95,95,94,94,94,94,94,94,94,93,93,93,93,93,93,93,92,92,92,92,92, 92,92,91,91,91,91,91,91,90,90,90,90,90,90,90,90,89,89,89,89,89, 89,88,88,88,88,88,88,87,87,87,87,87,87,86,86,86,86,86,85,85,85, 85,85,85,84,84,84,84,84,83,83,83,83,83,83,83,83,82,82,82,82,81, 81,81,81,81,80,80,80,80,80,80,79,79,79,78,78,78,78,78,78,78,78, 77,77,77,77,77,77,77,76,76,76,76,76,75,75,75,75,74,74,74,74,74, 74,73,73,73,72,72,72,72,72,72,72,72,71,71,71,71,71,71,71,70,70, 70,70,70,69,69,69,68,68,68,68,68,68,67,67,67,67,67,67,67,66,66, 66,66,65,65,65,65,65,64,64,64,64,64,63,63,63,62,62,62,62,62,61, 61,61,60,60,60,60,60,59,59,58,58,58,58,58,58,58,57,57,57,57,57, 57,56,56,56,56,56,55,55,55,55,55,55,55,54,54,54,53,53,53,53,52, 52,52,52,52,52,51,51,51,51,51,51,51,50,50,50,50,50,50,50,49,49, 49,49,49,49,49,48,48,48,48,48,48,48,47,46,46,46,46,46,46,46,46, 46,46,45,45,45,45,45,45,45,45,45,45,44,44,44,44,44,44,44,44,43, 43,43,43,43,43,43,43,42,42,42,42,42,41,41,41,41,41,40,40,40,39, 39,39,39,39,38,38,38,38,38,38,38,38,37,37,37,37,37,37,37,37,37, 37,36,36,36,36,36,36,36,36,36,36,36,35,35,35,35,35,35,35,34,34, 34,34,34,34,34,34,33,33,33,33,33,33,32,32,32,32,32,32,32,32,31, 31,31,31,31,31,31,30,30,30,30,29,29,29,29,29,28,28,28,28,28,28, 28,28,28,28,28,27,27,27,27,27,27,27,27,26,26,26,26,26,26,26,25, 25,25,25,25,25,24,24,24,24,24,24,24,23,23,23,23,23,23,23,23,23, 22,22,22,22,21,21,21,21,21,21,21,21,21,21,21,21,20,20,20,20 }; const int u1000_00[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,99, 99,99,99,99,99,99,99,99,99,98,98,98,98,98,98,98,98,98,98,98,98, 98,98,98,98,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97, 96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,95,95, 95,95,95,94,94,94,94,94,94,94,94,94,93,93,93,92,92,92,92,92,92, 92,92,92,92,92,92,92,92,92,91,91,91,91,91,91,91,91,91,91,91,91, 91,91,91,90,90,90,90,90,90,90,90,90,90,90,90,90,89,89,89,89,89, 89,89,89,88,88,88,88,88,88,88,88,88,88,88,88,88,87,87,87,87,87, 87,87,87,87,87,86,86,86,86,86,86,86,85,85,85,85,85,85,85,85,85, 85,85,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84, 84,83,83,83,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,82,82, 82,82,82,81,81,81,81,81,81,81,81,81,81,81,81,81,81,80,80,80,80, 80,80,80,80,80,80,80,80,80,80,80,80,80,79,79,79,79,79,79,79,79, 79,79,79,79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77, 77,77,77,77,76,76,76,76,76,76,76,76,76,75,75,75,75,75,75,75,75, 75,75,75,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73,73,73,73, 73,73,73,72,72,72,72,72,72,72,72,72,72,72,71,71,71,71,71,71,71, 71,71,71,71,71,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70, 69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,68,68,68,68,68, 68,68,68,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,66,66,66, 66,66,66,66,66,66,66,66,66,66,66,66,65,65,65,65,65,65,65,65,65, 64,64,64,64,64,64,64,64,64,64,64,64,64,63,63,63,63,63,63,63,62, 62,62,62,62,62,62,62,62,62,62,62,62,61,61,61,61,61,61,61,61,61, 61,61,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60, 59,59,59,59,59,59,59,59,59,59,58,58,58,58,58,58,58,58,58,58,58, 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,56,56,56,56, 56,56,56,56,56,55,55,55,55,55,55,55,55,55,55,55,55,55,55,54,54, 54,54,54,54,54,54,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53, 53,53,53,53,53,53,52,52,52,52,52,52,52,52,52,51,51,51,51,51,51, 51,50,50,50,50,50,50,50,50,50,50,50,50,49,49,49,49,49,49,49,49, 49,49,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,47,47,47, 47,47,47,47,47,47,47,47,47,47,46,46,46,46,46,46,46,46,46,46,46, 46,46,46,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,44, 44,44,44,44,44,44,44,44,44,44,44,44,44,43,43,43,43,43,43,43,43, 43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42,42,42,42,42,42, 42,42,42,42,42,41,41,41,41,41,41,41,41,41,41,41,41,40,40,40,40, 40,40,40,40,40,40,40,39,39,39,39,39,39,39,39,39,39,38,38,38,38, 38,38,38,38,38,38,38,37,37,37,37,37,37,37,37,37,37,37,37,37,37, 37,37,37,37,37,36,36,36,36,36,36,36,36,36,36,36,36,36,35,35,35, 35,35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,34,34,34,34,34, 34,33,33,33,33,33,33,33,33,32,32,32,32,32,32,32,32,32,32,32,32, 32,32,32,32,32,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30, 30,30,30,30,29,29,29,29,29,29,29,29,29,29,29,29,28,28,28,28,28, 28,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,26, 26,26,26,26,26,26,26,26,26,26,25,25,25,25,25,25,25,25,25,25,25, 25,24,24,24,24,24,24,24,24,24,24,24,24,23,23,23,23,23,23,23,23, 23,23,23,23,23,22,22,22,22,22,22,22,22,21,21,21,21,21,21,21,21, 21,21,21,21,20,20,20,20,20,20,20,20,20,20,20,20,20,20 }; const int u1000_01[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,100,100,100,99,99, 99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,98,98,98,98,98, 98,98,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,97,97,97, 97,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,94,94,94, 94,94,94,94,94,93,93,93,93,93,93,93,93,93,93,93,93,92,92,92,92, 92,92,92,92,92,92,92,91,91,91,91,91,91,91,91,91,91,91,91,91,91, 91,91,91,91,91,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90, 90,90,90,90,89,89,89,89,89,89,89,89,89,89,89,89,89,88,88,88,88, 88,88,88,88,88,88,88,88,88,87,87,87,87,87,87,87,87,87,86,86,86, 86,86,86,86,86,86,86,85,85,85,85,85,85,85,84,84,84,84,84,84,84, 84,84,84,84,84,84,84,84,84,84,83,83,83,83,83,83,83,83,83,83,83, 82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,81,81,81,81,81,81, 81,81,81,81,81,81,81,81,80,80,80,80,80,80,80,80,80,79,79,79,79, 79,79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78, 78,78,78,78,78,78,78,77,77,77,77,77,77,77,77,77,77,77,76,76,76, 76,76,76,76,76,76,76,76,76,76,76,76,76,75,75,75,75,75,75,75,75, 75,75,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,73,73, 73,73,73,73,73,73,73,73,73,72,72,72,72,72,72,72,72,72,72,71,71, 71,71,71,71,71,71,71,71,71,70,70,70,70,70,70,69,69,69,69,69,69, 69,69,69,69,69,69,69,69,69,69,68,68,68,68,68,68,68,68,68,67,67, 67,67,67,67,67,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66, 66,65,65,65,65,65,65,65,65,65,65,65,65,65,64,64,64,64,64,64,64, 64,64,64,64,64,64,64,64,64,63,63,63,63,63,63,63,63,63,63,63,63, 63,62,62,62,62,62,62,62,62,62,62,62,62,62,61,61,61,61,61,61,61, 61,61,61,61,61,61,61,61,61,61,61,60,60,60,60,60,60,60,60,60,60, 60,60,59,59,59,59,59,59,59,59,59,59,59,59,59,59,58,58,58,58,58, 58,58,58,58,58,58,58,58,57,57,57,57,57,57,57,57,57,57,57,57,57, 56,56,56,56,56,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,55, 55,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,53,53, 53,53,53,53,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52, 52,51,51,51,51,51,51,51,51,51,51,51,51,50,50,50,50,50,50,50,50, 50,50,50,50,49,49,49,49,49,49,49,49,49,49,49,48,48,48,48,48,48, 48,48,48,47,47,47,47,47,47,47,47,46,46,46,46,46,46,46,46,46,46, 46,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,44,44, 44,44,44,44,44,44,44,44,44,44,43,43,43,43,43,43,43,43,43,42,42, 42,42,42,42,42,42,42,42,41,41,41,41,41,41,41,41,41,41,41,41,40, 40,40,40,40,40,40,40,40,40,40,40,40,40,39,39,39,39,39,39,39,39, 39,39,39,39,39,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38, 38,38,37,37,37,37,37,37,37,37,37,37,37,37,36,36,36,36,36,36,36, 36,36,36,36,35,35,35,35,35,35,35,35,35,35,35,35,35,34,34,34,34, 34,34,34,34,34,34,34,33,33,33,33,33,33,33,33,33,33,33,33,32,32, 32,32,32,32,32,32,32,32,31,31,31,31,31,31,31,31,31,31,30,30,30, 30,30,30,30,30,30,30,30,30,30,29,29,29,29,29,29,29,29,28,28,28, 28,28,28,28,28,28,28,28,28,28,28,28,27,27,27,27,27,27,27,27,27, 27,27,27,27,26,26,26,26,26,26,26,26,26,26,25,25,25,25,25,24,24, 24,24,24,24,24,24,24,24,23,23,23,23,23,23,23,23,23,23,23,23,22, 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,21,21,21,21,21, 21,21,21,21,21,21,20,20,20,20,20,20,20,20,20,20,20,20 }; const int u1000_02[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, 100,100,100,100,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99, 98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,96, 96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,95,95,95,95, 95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,94,94,94,94,94,94, 94,93,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,92,92,92, 92,92,92,92,92,92,92,91,91,91,91,91,91,91,91,91,91,91,91,90,90, 90,90,90,90,90,90,90,90,90,90,90,90,90,89,89,89,89,89,89,89,89, 89,89,88,88,88,88,88,88,88,88,88,88,88,88,87,87,87,87,87,87,87, 87,87,87,87,87,87,87,87,87,86,86,86,86,86,86,86,86,86,86,86,86, 86,86,86,86,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,84,84, 84,84,84,84,84,84,84,84,84,84,83,83,83,83,83,83,83,83,83,83,83, 83,83,83,83,82,82,82,82,82,82,82,82,82,81,81,81,81,81,81,81,81, 81,81,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,79,79,79,79, 79,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,78,78,78, 77,77,77,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,76,76,75, 75,75,75,75,75,75,75,75,75,74,74,74,74,74,74,74,74,74,74,74,73, 73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,72,72,72,72,72,72, 72,72,72,72,72,72,72,72,72,72,72,72,71,71,71,71,71,71,71,71,70, 70,70,70,70,70,70,70,70,70,70,70,70,70,69,69,69,69,69,69,69,69, 69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,68,67,67,67,67,67, 67,67,67,67,67,66,66,66,66,66,66,66,66,66,66,66,66,66,65,65,65, 65,65,65,65,65,65,65,65,65,64,64,64,64,64,64,64,64,63,63,63,63, 63,63,63,63,63,63,63,62,62,62,62,62,62,62,62,62,62,62,62,62,62, 62,62,62,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,60,60,60, 60,60,60,60,60,60,60,59,59,59,59,59,59,59,59,59,59,59,59,59,59, 59,58,58,58,58,58,58,58,58,58,58,58,58,58,57,57,57,57,57,57,57, 57,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,55,55,55, 55,55,55,55,55,55,55,55,55,55,55,54,54,54,54,54,54,54,54,54,54, 54,54,54,54,54,54,53,53,53,53,53,53,53,53,53,53,53,52,52,52,52, 52,52,52,52,52,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51, 51,51,50,50,50,50,50,50,50,50,50,50,50,50,49,49,49,49,49,49,49, 49,49,49,49,49,48,48,48,48,48,48,48,48,48,48,47,47,47,47,47,47, 47,46,46,46,46,46,46,46,46,46,46,46,45,45,45,45,45,45,45,45,45, 45,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,43,43,43, 43,43,43,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42,42,42, 42,42,42,42,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,40,40, 40,40,40,40,40,40,40,40,40,40,40,40,40,39,39,39,39,39,39,39,39, 39,39,39,38,38,38,38,38,38,38,38,38,38,37,37,37,37,37,37,37,37, 37,37,37,37,36,36,36,36,36,36,36,36,35,35,35,35,35,35,35,35,35, 35,35,35,35,35,35,35,34,34,34,34,34,34,34,34,34,34,34,34,34,34, 33,33,33,33,33,33,33,33,33,33,32,32,32,32,32,32,32,32,32,32,32, 32,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30,29,29,29, 29,29,29,29,29,29,29,29,29,28,28,28,28,28,28,28,28,27,27,27,27, 27,27,27,27,27,27,27,27,26,26,26,26,26,26,26,26,26,26,26,26,26, 26,25,25,25,25,25,25,25,25,25,25,25,24,24,24,24,24,24,24,24,24, 24,24,23,23,23,23,23,23,23,23,22,22,22,22,22,22,22,22,22,22,22, 22,22,21,21,21,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20 }; const int u1000_03[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,99, 99,99,99,99,99,99,99,99,98,98,98,98,98,98,98,98,98,98,98,98,98, 97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,96,96,96,96,96, 96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,95,95, 95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,94,94,94,94,94,94, 93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,92,92,92,92,92, 92,92,92,92,92,92,91,91,91,91,91,91,91,91,91,91,91,90,90,90,90, 90,90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,89,89,89,88,88, 88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,87,87,87,87,87,87, 87,87,87,87,87,87,87,87,87,87,87,87,86,86,86,86,86,86,86,86,85, 85,85,85,85,85,85,85,85,85,84,84,84,84,84,84,84,84,83,83,83,83, 83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,82,82,82,82,82,82, 82,82,82,82,82,82,81,81,81,81,81,81,81,81,81,81,81,80,80,80,80, 80,80,80,80,80,80,80,80,80,79,79,79,79,79,79,79,79,79,79,79,79, 79,79,78,78,78,78,78,78,78,78,78,77,77,77,77,77,77,77,77,77,77, 77,77,77,77,77,76,76,76,76,76,76,76,76,76,76,76,76,76,75,75,75, 75,75,75,75,75,75,75,75,75,75,75,74,74,74,74,74,74,74,74,74,74, 74,74,74,74,74,74,74,74,73,73,73,73,73,73,73,73,73,73,73,73,73, 72,72,72,72,72,72,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71, 71,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,69,69,69,69,69, 69,69,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,67, 67,67,67,67,67,67,67,66,66,66,66,66,66,66,66,66,65,65,65,65,65, 65,65,65,65,65,65,65,65,64,64,64,64,64,64,64,64,64,64,64,63,63, 63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,62,62,62,62, 62,62,62,62,62,61,61,61,61,61,61,61,61,61,61,61,61,61,61,60,60, 60,60,60,60,60,60,60,60,60,59,59,59,59,59,59,59,59,59,59,59,58, 58,58,58,58,58,58,58,58,57,57,57,57,57,57,57,57,57,57,57,56,56, 56,56,56,56,56,56,56,56,56,56,56,56,56,56,55,55,55,55,55,55,55, 55,55,55,55,54,54,54,54,54,54,54,54,54,54,54,53,53,53,53,53,53, 53,53,53,53,53,53,53,53,52,52,52,52,52,52,52,52,52,51,51,51,51, 51,51,51,51,51,51,51,51,51,50,50,50,50,50,50,50,50,50,50,50,50, 50,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49, 49,48,48,48,48,48,48,48,48,48,48,48,48,48,48,47,47,47,47,47,47, 47,47,47,47,47,47,47,47,47,47,47,46,46,46,46,46,46,46,46,46,46, 46,46,46,46,45,45,45,45,45,45,45,45,45,45,45,44,44,44,44,44,44, 44,44,44,44,44,44,44,44,44,44,44,44,43,43,43,43,43,43,43,43,43, 43,43,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42,42,42,42, 42,42,41,41,41,41,41,41,41,41,41,41,41,41,41,41,40,40,40,40,40, 40,40,40,40,40,40,39,39,39,38,38,38,38,38,38,38,38,37,37,37,37, 37,37,37,37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,36,36, 36,35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,34,34,34,33,33, 33,33,33,33,33,33,33,33,32,32,32,32,32,32,32,32,32,32,31,31,31, 31,31,31,31,31,31,31,31,30,30,30,30,30,30,29,29,29,29,29,29,29, 29,29,29,29,29,29,28,28,28,28,28,28,28,28,28,28,27,27,27,27,27, 27,27,27,27,27,26,26,26,26,26,26,26,26,26,26,26,26,26,26,25,25, 25,25,25,25,25,25,25,25,25,25,24,24,24,24,24,24,24,24,23,23,23, 23,23,23,23,23,23,23,22,22,22,22,22,22,22,22,22,22,22,22,22,21, 21,21,21,21,21,21,21,20,20,20,20,20,20,20,20,20,20,20 }; const int u1000_04[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,100,99,99,99,99,99, 99,99,99,99,99,99,98,98,98,98,98,98,98,98,97,97,97,97,97,97,97, 97,97,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,96,96, 96,96,96,96,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,94, 94,94,94,94,94,94,94,94,94,94,94,94,94,94,93,93,93,93,93,93,93, 93,93,92,92,92,92,92,91,91,91,91,90,90,90,90,90,90,90,90,90,90, 89,89,89,89,89,89,89,89,89,89,89,89,89,89,88,88,88,88,88,88,88, 88,88,87,87,87,87,87,87,87,86,86,86,86,86,86,86,86,86,86,86,85, 85,85,85,85,85,85,85,85,85,84,84,84,84,84,84,84,84,84,84,84,83, 83,83,83,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,82,82,82, 82,82,82,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,80,80, 80,80,80,80,80,80,80,80,80,80,80,80,80,80,79,79,79,79,79,79,79, 79,79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,77,77,77,77,77, 77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,76,76,76,76,76,76, 76,75,75,75,75,75,75,75,75,75,75,75,75,75,74,74,74,74,74,74,74, 74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73, 73,73,73,73,73,73,73,73,73,72,72,72,72,72,72,72,72,72,72,72,72, 72,72,72,72,72,72,71,71,71,71,71,71,71,71,71,71,70,70,70,70,70, 70,70,70,70,70,69,69,69,69,69,68,68,68,68,68,68,68,68,68,68,68, 68,68,68,68,68,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67, 67,66,66,66,66,66,66,66,66,65,65,65,65,65,65,65,65,65,65,65,64, 64,64,64,64,64,64,64,64,63,63,63,63,63,63,63,63,63,63,63,63,63, 63,63,63,63,62,62,62,62,62,62,62,62,62,62,62,61,61,61,61,61,61, 61,61,60,60,60,60,60,60,60,60,60,59,59,59,59,59,59,59,59,59,59, 59,59,59,59,59,58,58,58,58,58,58,58,58,58,58,57,57,57,57,57,57, 57,57,57,57,57,57,57,57,57,57,56,56,56,56,56,56,56,56,56,56,56, 56,56,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55, 55,54,54,54,54,54,54,54,54,54,54,53,53,53,53,53,53,53,53,53,53, 53,53,52,52,52,52,52,52,52,52,52,52,52,52,52,51,51,51,51,51,51, 51,51,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,49,49,49, 49,49,49,49,49,49,49,49,49,49,49,49,49,48,48,48,48,48,48,48,48, 48,48,48,48,48,48,48,48,48,48,47,47,47,47,47,47,47,47,47,47,47, 47,47,46,46,46,46,46,46,46,46,46,46,46,46,46,46,45,45,45,45,45, 45,45,44,44,44,44,44,44,44,43,43,43,43,43,43,43,43,42,42,42,42, 42,42,42,42,42,42,42,42,42,42,42,42,42,41,41,41,41,41,41,41,41, 41,41,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,39, 39,39,39,39,39,39,39,39,39,39,39,39,39,38,38,38,38,38,38,38,38, 38,38,38,38,38,37,37,37,37,37,37,37,37,37,37,37,37,37,36,36,36, 36,36,36,36,36,36,36,36,36,36,36,36,35,35,35,35,35,35,35,35,35, 35,35,35,34,34,34,34,34,34,34,33,33,33,33,33,33,33,33,33,33,33, 33,32,32,32,32,32,32,32,32,32,32,32,32,31,31,31,31,31,31,31,31, 31,31,31,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30, 30,30,30,30,30,30,30,30,30,29,29,29,29,29,29,29,29,28,28,28,28, 28,28,28,28,28,28,28,27,27,27,27,27,27,27,27,27,27,27,27,27,27, 27,26,26,26,26,26,26,26,26,25,25,25,25,25,25,25,25,25,25,25,25, 24,24,24,24,24,24,24,24,24,24,24,24,24,24,23,23,23,23,23,23,23, 23,23,23,23,22,22,22,22,22,22,22,22,22,22,21,21,21,21,21,21,21, 21,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20 }; const int u1000_05[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,99, 99,99,99,99,99,99,98,98,98,98,98,98,98,98,98,98,98,98,98,97,97, 97,97,97,97,97,97,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95, 95,95,95,94,94,94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93, 93,93,93,93,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,92, 92,92,92,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,90,90, 90,90,90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,89,89,89,89, 89,89,89,89,88,88,88,88,88,88,88,88,88,88,88,88,87,87,87,87,87, 87,87,87,87,87,87,87,87,87,87,87,87,87,86,86,86,86,86,86,86,86, 86,86,85,85,85,85,85,85,85,85,85,85,84,84,84,84,84,84,84,84,84, 84,84,84,84,84,84,83,83,83,83,83,83,83,83,83,83,83,82,82,82,82, 82,82,82,82,82,82,82,82,82,82,82,82,82,81,81,81,81,81,81,81,81, 81,81,80,80,80,80,80,80,80,80,79,79,79,79,79,79,79,79,79,79,79, 79,79,79,78,78,78,78,78,78,78,78,78,77,77,77,77,77,77,77,77,77, 77,77,76,76,76,76,76,76,76,76,76,76,76,76,76,76,75,75,75,75,75, 75,75,75,74,74,74,74,74,74,74,74,74,74,74,74,74,74,73,73,73,73, 73,73,73,73,73,73,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72, 72,72,72,72,72,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,70, 70,70,70,70,70,70,70,70,70,70,70,70,69,69,69,69,69,69,69,69,69, 69,69,68,68,68,68,68,68,68,68,68,68,68,68,68,68,67,67,67,67,67, 67,67,67,67,67,67,67,67,67,67,66,66,66,66,66,66,66,66,66,66,66, 66,66,66,66,65,65,65,65,64,64,64,64,64,64,64,64,64,64,64,64,64, 64,64,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,62,62,62, 62,62,62,62,62,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, 60,60,60,60,60,60,60,60,59,59,59,59,59,59,59,59,59,59,58,58,58, 58,58,58,58,58,58,58,58,57,57,57,57,57,57,57,57,57,57,57,57,57, 56,56,56,56,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,55,55, 55,54,54,54,54,54,54,54,54,54,54,54,54,53,53,53,53,53,53,53,53, 52,52,52,52,52,52,52,52,52,52,52,52,52,52,51,51,51,51,51,51,51, 51,51,51,50,50,50,50,50,50,50,50,50,49,49,49,49,49,49,49,49,49, 49,49,48,48,48,48,48,48,48,48,48,48,47,47,47,47,47,47,47,47,47, 47,47,47,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,45, 45,45,45,45,45,45,45,45,45,45,45,44,44,44,44,44,44,44,44,44,44, 43,43,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42,42,42,42, 42,42,42,42,42,42,41,41,41,41,41,41,41,41,41,41,41,40,40,40,40, 40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,39,39,39,39,39,39, 39,39,39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38, 38,38,38,38,38,38,37,37,37,37,37,37,37,37,37,37,37,37,37,36,36, 36,36,36,36,36,36,36,36,36,36,36,36,35,35,35,35,35,35,35,35,35, 35,35,35,35,35,34,34,34,34,34,34,34,34,34,34,33,33,33,33,33,33, 33,33,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,31,31, 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30, 30,29,29,29,29,29,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, 27,27,27,27,27,27,27,27,27,27,27,27,26,26,26,26,26,26,26,26,26, 26,26,26,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,24,24,24, 24,24,24,24,24,24,24,24,23,23,23,23,23,23,23,23,23,23,23,23,22, 22,22,22,22,22,22,22,22,22,22,22,22,22,21,21,21,21,21,21,21,21, 21,21,21,21,21,20,20,20,20,20,20,20,20,20,20,20,20 }; const int u1000_06[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, 99,99,99,99,99,99,99,99,99,99,98,98,98,98,98,98,98,97,97,97,97, 97,97,97,97,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96, 95,95,95,95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,94,94,94, 94,94,94,94,93,93,93,93,93,93,93,93,93,93,93,93,93,93,92,92,92, 92,92,92,92,92,92,92,92,92,91,91,91,91,91,91,91,91,91,91,91,91, 91,91,91,91,90,90,90,90,90,90,90,90,90,90,90,89,89,89,89,89,89, 89,89,89,89,89,89,89,88,88,88,88,88,88,88,87,87,87,87,87,87,87, 87,87,87,86,86,86,86,86,86,85,85,85,85,85,85,85,85,85,85,85,85, 85,85,84,84,84,84,84,84,84,84,84,84,84,84,84,83,83,83,83,83,83, 82,82,82,82,82,82,82,82,82,82,81,81,81,81,81,81,81,81,81,81,80, 80,80,80,80,80,80,80,80,80,80,80,79,79,79,79,79,79,79,79,79,79, 79,79,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77, 77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,76,76,76,76,75,75, 75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,74,74,74,74,74,74, 74,74,74,74,74,74,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73, 73,73,72,72,72,72,72,72,72,72,72,72,72,72,71,71,71,71,71,71,71, 71,71,71,71,71,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70, 69,69,69,69,69,69,69,69,69,69,69,68,68,68,68,68,68,68,68,68,68, 68,68,68,67,67,67,67,67,67,67,67,67,67,66,66,66,66,66,66,66,66, 66,66,66,66,66,66,65,65,65,65,65,65,65,65,65,64,64,64,64,64,64, 64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,63,63,63,63,63,63, 63,63,63,63,63,63,63,63,63,62,62,62,62,62,62,62,62,62,62,62,62, 62,62,62,61,61,61,61,61,61,61,61,61,61,61,61,61,61,60,60,60,60, 60,60,60,60,60,60,60,59,59,59,59,59,59,59,59,59,59,59,58,58,58, 58,58,58,58,58,58,58,58,57,57,57,57,57,57,57,57,57,57,56,56,56, 56,56,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,55,55,55,55, 55,54,54,54,54,54,54,54,54,54,54,54,54,53,53,53,53,53,53,53,53, 53,53,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,51,51,51,51, 51,51,51,51,51,51,51,51,51,50,50,50,50,50,50,50,50,50,50,50,50, 50,49,49,49,49,49,49,49,49,49,49,49,48,48,48,48,48,48,48,48,48, 48,48,48,47,47,47,47,47,47,47,47,47,47,46,46,46,46,46,46,45,45, 45,45,45,45,45,45,45,45,45,45,45,45,45,44,44,44,44,44,44,44,44, 44,44,44,43,43,43,43,43,43,43,43,43,43,43,43,42,42,42,42,42,41, 41,41,41,41,41,41,41,41,41,41,41,40,40,40,40,40,40,40,40,40,40, 40,40,39,39,39,39,39,39,39,39,39,39,39,39,39,38,38,38,38,38,38, 38,38,38,38,38,38,37,37,37,37,37,37,37,37,37,37,37,37,37,36,36, 36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,35,35,35,35,35, 35,35,35,35,35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,33,33, 33,33,33,33,32,32,32,32,32,32,32,32,32,32,32,32,32,32,31,31,31, 31,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30,30, 30,30,30,30,30,29,29,29,29,29,29,29,28,28,28,28,28,28,28,28,28, 28,28,28,28,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,26, 26,26,26,26,26,26,26,26,26,26,26,26,25,25,25,25,25,25,25,25,25, 25,25,25,25,25,24,24,24,24,24,24,24,24,24,24,24,24,24,24,23,23, 23,23,23,23,23,23,23,23,22,22,22,22,22,22,22,22,22,22,22,22,22, 22,22,22,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20 }; const int u1000_07[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, 100,100,100,99,99,99,99,99,99,99,99,99,98,98,98,98,98,98,98,98, 98,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,96,96,96,96, 96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,95,95, 95,94,94,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,92, 92,92,92,92,92,92,92,91,91,91,91,91,91,91,91,91,91,91,90,90,90, 90,90,90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,89,89,89,89, 89,89,89,89,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88, 88,87,87,87,87,87,87,87,87,87,87,87,87,87,87,86,86,86,86,86,86, 86,86,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,84,84,84,84, 84,83,83,83,83,83,83,83,83,83,83,83,83,83,82,82,82,82,82,82,82, 82,82,82,82,81,81,81,81,81,81,81,81,81,81,81,81,80,80,80,80,80, 80,80,80,80,80,79,79,79,79,79,79,79,79,79,79,79,78,78,78,78,78, 78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,77,77,77,77,77,77, 77,77,77,76,76,76,76,76,76,76,76,76,76,76,76,76,76,75,75,75,75, 75,75,75,75,75,75,75,75,75,75,75,75,75,74,74,74,74,74,74,74,74, 74,74,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73,73,73,73,73, 73,73,72,72,72,72,72,72,72,72,71,71,71,71,71,71,71,71,71,71,71, 71,71,71,71,71,71,71,70,70,70,70,70,70,70,70,70,70,70,69,69,69, 69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,68,68,68,68,68, 68,68,68,68,68,68,67,67,67,67,67,67,67,67,67,67,66,66,66,66,66, 66,66,66,66,66,66,65,65,65,65,65,65,65,65,65,65,65,65,65,64,64, 64,64,64,64,64,64,64,64,64,63,63,63,63,63,63,63,63,63,63,63,63, 63,63,62,62,62,62,62,62,62,62,62,62,62,62,62,62,61,61,61,61,61, 61,61,61,61,61,61,61,61,61,61,60,60,60,60,60,60,60,59,59,59,59, 59,59,59,59,59,58,58,58,58,58,58,58,58,58,57,57,57,57,57,57,57, 57,57,57,57,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56, 56,56,56,56,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,54,54, 54,54,54,54,54,53,53,53,53,53,53,53,52,52,52,52,52,52,52,52,52, 52,52,52,52,52,52,52,52,52,52,52,51,51,51,51,51,51,51,51,51,51, 51,51,51,51,51,50,50,50,50,50,50,50,50,50,50,50,49,49,49,49,49, 49,49,49,49,49,49,49,49,49,49,48,48,48,48,48,48,48,48,48,48,48, 48,48,48,48,48,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,46, 46,46,46,46,46,46,46,46,46,46,46,45,45,45,45,45,45,45,45,45,45, 45,45,45,45,45,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,43, 43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42,42,42,42,42,42, 42,42,42,42,41,41,41,41,41,41,41,40,40,40,40,40,40,40,39,39,39, 39,39,39,39,39,39,38,38,38,38,38,38,38,38,38,38,38,37,37,37,37, 37,37,37,37,36,36,36,36,36,36,36,36,36,36,36,36,35,35,35,35,35, 35,35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,34,34,34,34,34, 34,34,34,34,34,33,33,33,33,33,33,33,33,33,33,32,32,32,32,32,32, 32,32,32,32,32,32,32,32,32,31,31,31,31,31,31,31,31,31,31,31,30, 30,30,30,30,30,30,30,30,30,30,30,30,30,29,29,29,29,29,29,29,29, 29,28,28,28,28,28,28,28,28,27,27,27,27,27,27,27,27,27,27,27,27, 26,26,26,26,26,26,26,26,26,26,26,26,26,26,25,25,25,25,25,25,25, 25,25,25,24,24,24,24,24,24,24,24,24,24,23,23,23,23,23,23,22,22, 22,22,22,22,22,22,22,21,21,21,21,21,21,21,21,21,21,21,21,21,21, 21,21,21,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20 }; const int u1000_08[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,99, 99,99,99,99,98,98,98,98,98,98,98,98,98,98,98,98,98,98,97,97,97, 97,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,95,95,95, 95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,94,94,94,94,94,93, 93,93,93,93,93,93,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92, 92,92,91,91,91,91,91,91,91,91,91,91,91,91,90,90,90,90,90,90,90, 90,90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,89,89,88,88,88, 88,88,88,88,88,88,88,87,87,87,87,87,87,87,87,87,87,87,87,87,87, 87,86,86,86,86,86,86,86,86,86,86,86,86,85,85,85,85,85,85,85,85, 85,85,85,84,84,84,84,84,84,84,84,84,83,83,83,83,83,83,83,83,83, 83,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,82,82,82,82,82, 82,82,82,81,81,81,81,81,81,81,81,81,81,81,81,81,80,80,80,80,80, 80,80,80,80,80,79,79,79,79,79,79,79,79,79,79,79,79,78,78,78,78, 78,78,78,78,78,78,78,78,78,78,77,77,77,77,77,77,77,77,77,77,77, 77,77,77,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,75,75,75, 75,75,75,75,75,75,75,75,74,74,74,74,74,74,74,74,74,74,74,74,74, 74,74,74,74,74,73,73,73,73,73,73,73,73,73,73,73,73,73,72,72,72, 72,72,72,72,72,72,72,72,72,71,71,71,71,71,71,71,71,71,71,71,71, 71,70,70,70,70,70,70,70,70,70,70,70,70,70,70,69,69,69,69,69,69, 69,69,69,69,69,69,69,69,69,69,68,68,68,68,68,68,68,68,68,67,67, 67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,66,66,66,66, 66,66,66,66,66,66,66,66,66,66,66,65,65,65,65,65,65,65,65,65,65, 64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,63,63,63,63, 63,63,63,63,62,62,62,62,62,62,62,62,62,62,62,62,62,61,61,61,61, 61,61,61,61,61,61,61,60,60,60,60,60,60,60,60,60,60,60,60,60,60, 59,59,59,59,59,59,59,59,59,59,59,58,58,58,58,58,58,58,57,57,57, 57,57,57,57,57,57,57,57,57,57,57,57,56,56,56,56,56,56,56,56,55, 55,55,55,55,55,54,54,54,54,54,54,54,54,54,54,54,54,53,53,53,53, 53,53,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,51,51, 51,51,51,51,51,51,50,50,50,50,50,50,50,50,50,50,50,50,49,49,49, 49,49,49,49,49,49,49,49,49,49,48,48,48,48,48,48,48,48,48,48,48, 48,48,48,48,48,47,47,47,47,46,46,46,46,46,46,46,46,46,46,46,46, 45,45,45,45,45,45,45,45,44,44,44,44,44,44,44,44,44,44,44,44,44, 44,44,44,43,43,43,43,43,43,43,43,43,43,43,43,43,43,42,42,42,42, 42,42,42,42,42,41,41,41,41,41,41,41,41,41,41,40,40,40,40,40,40, 40,40,40,40,40,40,40,40,39,39,39,39,39,39,39,39,39,39,38,38,38, 38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,37,37,37,37,37,37, 37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36, 36,36,36,36,35,35,35,35,35,35,35,35,35,35,35,34,34,34,34,34,34, 34,34,34,34,33,33,33,33,33,33,33,33,32,32,32,32,32,32,32,32,32, 31,31,31,31,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30, 30,30,30,29,29,29,29,29,29,29,29,29,29,29,29,29,29,28,28,28,28, 28,28,28,28,28,28,28,28,28,27,27,27,27,27,27,27,27,27,27,27,26, 26,26,26,26,26,26,26,26,25,25,25,25,25,25,25,25,25,25,25,25,25, 25,25,25,25,25,25,25,25,24,24,24,24,24,24,24,24,24,24,24,24,24, 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,22,22,22,22,22, 22,22,22,22,22,22,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20 }; const int u1000_09[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,100,100,99,99,99, 99,99,99,99,99,99,99,99,99,99,98,98,98,98,98,98,97,97,97,97,97, 97,97,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,95,95,95, 95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,94,94,94,94,94,94, 94,94,94,94,94,94,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93, 93,93,92,92,92,92,92,92,92,92,92,92,92,91,91,91,91,91,91,91,91, 91,91,91,91,91,91,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90, 89,89,89,89,89,89,89,89,89,89,89,89,88,88,88,88,88,88,88,88,88, 88,88,88,88,88,87,87,87,87,87,87,87,87,87,87,87,87,86,86,86,86, 86,86,86,86,86,86,86,86,86,86,86,85,85,85,85,85,85,85,85,85,85, 85,85,85,85,85,85,84,84,84,84,84,84,84,84,84,84,84,84,84,83,83, 83,83,83,83,83,83,83,83,83,83,83,83,83,83,82,82,82,82,82,82,82, 82,82,82,81,81,81,81,81,81,81,81,81,80,80,80,80,80,80,80,80,80, 79,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,78,78,78, 77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,76,76,76,76,76, 76,76,76,76,76,76,76,76,76,76,76,75,75,75,75,75,75,75,75,74,74, 74,74,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73,73,72,72,72, 72,72,72,72,72,72,72,71,71,71,71,71,71,71,71,71,71,71,70,70,70, 70,70,70,70,70,70,70,70,69,69,69,69,69,69,69,69,69,68,68,68,68, 68,68,68,68,68,68,68,67,67,67,67,67,67,67,67,67,67,67,67,67,67, 66,66,66,66,66,66,66,66,66,66,66,66,66,66,65,65,65,65,65,65,65, 65,65,65,65,65,64,64,64,64,64,64,64,64,64,64,63,63,63,63,63,63, 63,62,62,62,62,62,62,62,62,61,61,61,61,61,61,61,61,60,60,60,60, 60,60,60,60,60,60,59,59,59,59,59,59,59,59,59,58,58,58,58,58,58, 58,58,58,58,58,58,58,57,57,57,57,57,57,57,57,57,57,57,57,57,57, 56,56,56,56,56,56,56,56,56,56,56,56,56,55,55,55,55,55,55,55,55, 55,55,55,55,55,55,55,55,55,54,54,54,54,54,54,54,54,54,54,53,53, 53,53,53,53,53,53,53,53,52,52,52,52,52,52,52,52,52,52,52,52,52, 52,52,52,51,51,51,51,51,51,51,51,51,51,51,51,51,51,50,50,50,50, 50,50,50,50,50,50,50,50,50,50,49,49,49,49,49,49,49,49,49,49,49, 48,48,48,48,48,48,48,48,48,48,48,48,48,47,47,47,47,47,46,46,46, 46,46,46,46,46,46,46,46,46,46,46,46,46,46,45,45,45,45,45,45,45, 45,45,45,45,45,45,45,45,45,45,45,45,44,44,44,44,44,44,44,44,44, 44,44,44,44,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,42, 42,42,42,42,42,42,42,42,42,42,42,41,41,41,41,41,41,41,41,40,40, 40,40,40,40,40,40,40,40,40,39,39,39,39,39,39,39,39,39,39,39,39, 38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,37,37,37,37,37, 37,37,37,37,37,36,36,36,36,36,36,36,36,36,36,36,36,36,36,35,35, 35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,34,34,34,34,34,34, 34,33,33,33,33,33,33,33,33,33,33,33,33,32,32,32,32,32,32,32,32, 32,32,32,32,32,32,31,31,31,31,31,31,31,31,31,31,31,31,30,30,30, 30,30,30,30,30,30,29,29,29,29,29,29,29,29,29,29,29,28,28,28,28, 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,27,27,27,27,27, 27,27,27,27,27,27,27,27,27,27,27,26,26,26,26,26,26,26,26,26,26, 26,26,26,25,25,25,25,25,25,25,25,25,25,24,24,24,24,24,24,24,24, 24,24,24,24,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,22,22, 22,22,22,22,22,22,22,22,22,22,22,22,21,21,21,21,21,21,21,21,21, 21,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20,20 }; const int u1000_10[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,99, 99,99,99,99,99,98,98,98,98,98,98,98,98,97,97,97,97,97,97,97,97, 97,97,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,96,96, 96,95,95,95,95,95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,94, 94,93,93,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,92,92, 92,92,92,92,92,92,92,92,91,91,91,91,91,91,91,91,90,90,90,90,90, 90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,89,89,89,89,89,89, 89,89,89,88,88,88,88,88,88,88,88,88,88,88,88,88,87,87,87,87,87, 87,87,87,87,87,87,87,87,87,86,86,86,86,86,86,86,86,86,86,86,86, 86,85,85,85,85,85,85,85,85,85,85,85,85,84,84,84,84,84,84,84,84, 84,84,84,84,84,83,83,83,83,83,83,83,83,83,83,83,83,83,83,82,82, 82,82,82,82,82,82,82,82,82,82,82,81,81,81,81,81,81,81,81,81,81, 81,81,81,81,81,81,80,80,80,80,80,80,80,80,80,80,80,79,79,79,79, 79,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,77,77,77, 77,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,76,76,76,76,76, 76,76,76,76,76,75,75,75,75,75,75,75,74,74,74,74,74,74,74,74,74, 74,74,74,74,74,74,74,74,73,73,73,73,73,73,73,73,73,73,73,73,72, 72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,71,71,71,71,71,71, 71,71,71,71,70,70,70,70,70,70,70,70,70,70,70,70,69,69,69,69,69, 69,69,69,69,69,69,69,68,68,68,68,68,68,68,67,67,67,67,67,67,67, 67,67,67,66,66,66,66,66,66,66,65,65,65,65,65,65,65,65,65,65,65, 65,65,65,65,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,63, 63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,62,62,62,62,62, 62,62,62,62,62,62,62,62,61,61,61,61,61,61,61,61,61,61,60,60,60, 60,60,60,60,60,60,60,60,60,60,60,59,59,59,59,59,59,59,59,59,59, 59,59,59,59,59,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58, 57,57,57,57,57,57,56,56,56,56,56,56,56,56,55,55,55,55,55,55,55, 55,55,55,55,55,55,55,55,55,55,55,55,55,54,54,54,54,54,54,54,54, 54,54,53,53,53,53,53,53,53,53,53,53,53,53,53,52,52,52,52,52,52, 52,52,52,52,52,52,52,51,51,51,51,51,51,51,51,51,51,51,51,51,51, 50,50,50,50,50,50,50,50,50,50,50,49,49,49,49,49,49,49,49,49,48, 48,48,48,48,48,48,48,48,48,48,48,47,47,47,47,47,47,47,47,47,47, 47,47,47,47,47,46,46,46,46,46,46,46,46,46,46,45,45,45,45,45,45, 45,45,45,44,44,44,44,44,44,44,44,43,43,43,43,43,43,43,43,42,42, 42,42,42,42,42,42,42,42,42,42,42,41,41,41,41,41,41,41,41,41,41, 41,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,39, 39,39,39,39,39,39,39,38,38,38,38,38,38,38,38,38,38,37,37,37,37, 37,37,37,37,36,36,36,36,36,36,36,36,36,36,36,36,35,35,35,35,35, 35,35,35,35,34,34,34,34,34,34,34,33,33,33,33,33,33,33,33,33,33, 33,33,33,33,33,33,33,33,32,32,32,32,32,32,32,32,31,31,31,31,31, 31,31,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30, 30,30,30,30,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, 28,28,28,28,28,28,28,28,28,28,27,27,27,27,27,27,27,27,27,27,27, 27,27,27,27,27,27,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26, 26,26,26,25,25,25,25,25,25,25,25,25,25,25,25,25,24,24,24,24,24, 24,24,24,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,22,22, 22,22,22,22,22,22,22,22,22,22,21,21,21,21,21,21,21,21,21,21,21, 21,21,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20 }; const int u1000_11[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, 100,100,99,99,99,99,99,99,99,99,99,98,98,98,98,98,98,98,98,98, 98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,97,97,97,97,96, 96,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,95, 95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,93,93,93,93,93,93, 93,93,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,92,92,92, 92,92,92,91,91,91,91,91,91,91,91,91,91,91,90,90,90,90,90,90,90, 89,89,89,89,89,89,89,89,89,89,89,89,88,88,88,88,88,88,88,87,87, 87,87,87,87,87,87,87,87,87,87,87,86,86,86,86,86,86,86,86,86,86, 86,86,86,86,86,86,85,85,85,85,85,85,85,85,85,84,84,84,84,84,84, 84,83,83,83,83,83,83,83,83,83,83,83,83,82,82,82,82,82,82,81,81, 81,81,81,81,81,81,81,81,81,81,81,81,80,80,80,80,80,80,80,80,80, 80,79,79,79,79,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78,78, 78,78,78,77,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,76,76, 76,75,75,75,75,75,75,75,75,75,75,75,74,74,74,74,74,74,74,74,74, 74,74,74,74,73,73,73,73,73,73,73,73,73,73,72,72,72,72,72,72,72, 72,72,72,72,72,72,72,72,72,72,72,72,71,71,71,71,71,71,71,71,71, 71,71,71,71,71,71,71,71,70,70,70,70,70,70,70,70,70,70,70,70,70, 69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,68,68,68,68,68, 68,68,68,68,68,68,68,67,67,67,67,67,67,67,66,66,66,66,66,66,66, 66,66,66,66,66,66,66,66,65,65,65,65,65,65,65,65,65,65,65,65,65, 65,65,65,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,63,63, 63,63,63,63,63,63,63,63,63,63,62,62,62,62,62,62,62,62,62,62,62, 62,62,62,62,61,61,61,61,61,61,61,61,61,61,61,61,60,60,60,60,60, 60,60,60,60,60,60,59,59,59,59,59,59,59,59,59,59,59,59,58,58,58, 58,58,58,58,58,58,58,58,58,58,58,58,57,57,57,57,57,57,57,57,57, 57,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,55,55,55,55,55, 55,55,55,55,55,54,54,54,54,54,54,54,54,54,54,54,54,54,53,53,53, 53,53,53,53,53,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,51, 51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,50,50,50,50, 50,50,50,50,50,50,50,50,50,50,49,49,49,49,49,49,49,49,49,49,49, 49,49,49,49,49,49,49,48,48,48,48,48,48,48,48,48,48,48,48,48,48, 48,48,47,47,47,47,47,47,47,47,47,47,47,47,46,46,46,46,46,46,46, 46,46,46,46,45,45,45,45,45,45,45,45,45,44,44,44,44,44,44,44,44, 44,44,44,44,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,42, 42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,41,41,41,41,41,41, 41,41,41,41,40,40,40,40,40,40,40,40,40,40,39,39,39,39,39,39,39, 39,39,39,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,37,37,37, 37,37,37,37,37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,36, 36,36,35,35,35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,34,34, 34,33,33,33,33,33,33,33,33,33,33,32,32,32,32,32,32,32,32,32,32, 32,32,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,30,30, 30,30,30,30,30,30,30,30,30,29,29,29,29,29,29,29,29,29,29,29,28, 28,28,28,28,28,28,28,28,28,28,28,28,28,27,27,27,27,27,27,27,27, 27,27,27,27,27,27,27,26,26,26,26,26,26,26,26,26,26,26,26,26,26, 26,25,25,25,25,25,24,24,24,24,24,24,23,23,23,23,23,23,23,23,23, 23,23,23,22,22,22,22,22,22,22,22,22,22,22,22,21,21,21,21,21,21, 21,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20,20,20 }; const int u1000_12[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,99, 99,99,99,99,99,99,98,98,98,98,98,98,98,98,97,97,97,97,97,97,97, 97,97,97,97,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,95, 95,95,95,95,95,94,94,94,94,94,94,94,94,94,94,94,94,94,94,93,93, 93,93,93,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,92,92, 92,92,92,91,91,91,91,91,91,91,91,91,91,91,91,90,90,90,90,90,90, 90,90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,89,88,88,88,88, 88,88,88,88,88,88,88,88,88,88,88,87,87,87,87,87,87,87,87,87,87, 87,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,85,85,85, 85,85,85,85,85,85,85,85,85,84,84,84,84,84,84,84,84,84,84,84,84, 83,83,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,82,82,81,81, 81,81,81,81,81,81,81,81,81,81,81,80,80,80,80,80,80,80,80,80,80, 80,80,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,78,78, 78,78,78,77,77,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,76, 76,76,76,76,76,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75, 74,74,74,74,74,74,74,74,73,73,73,73,73,73,73,73,73,73,72,72,72, 72,72,72,72,72,72,72,72,72,72,71,71,71,71,71,71,71,71,71,71,71, 71,70,70,70,70,70,70,70,69,69,69,69,69,69,69,69,69,69,69,69,69, 69,69,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,68,68,67,67, 67,67,67,67,67,67,67,67,67,66,66,66,66,66,66,66,66,66,66,66,66, 66,65,65,65,65,65,65,65,65,65,65,65,65,65,64,64,64,64,64,64,64, 64,64,64,63,63,63,63,63,63,63,63,63,62,62,62,62,62,62,62,62,62, 62,61,61,61,61,61,61,61,61,61,61,61,61,61,61,60,60,60,60,60,60, 60,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,58,58,58, 58,58,58,58,58,58,58,58,57,57,57,57,57,57,57,57,57,57,57,57,57, 57,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,55,55,55,55,55, 55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,54,54,54,54,54,54, 54,54,54,54,54,54,54,54,54,53,53,53,53,53,53,53,53,53,53,52,52, 52,52,52,52,52,52,51,51,51,51,51,51,51,51,51,51,50,50,50,50,50, 50,50,50,50,50,49,49,49,49,49,49,49,49,49,49,49,49,49,48,48,48, 48,48,48,48,48,48,48,48,48,48,48,47,47,47,47,47,47,47,47,47,47, 47,46,46,46,46,46,46,46,46,46,45,45,45,45,45,45,45,45,45,45,45, 45,45,44,44,44,44,44,44,44,44,44,44,44,44,43,43,43,43,43,43,43, 43,43,43,43,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,41,41, 41,41,41,41,41,41,41,41,40,40,40,40,40,40,40,40,40,40,40,40,40, 39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,38,38,38,38,38, 38,38,38,38,37,37,37,37,37,37,37,37,37,37,36,36,36,36,36,36,36, 36,36,36,36,36,35,35,35,35,35,35,35,35,35,35,35,35,35,34,34,34, 34,34,34,34,34,34,34,34,34,34,34,34,34,34,33,33,33,33,33,33,33, 33,33,33,33,33,33,33,33,33,33,33,32,32,32,32,32,32,32,32,32,32, 32,32,32,32,32,32,31,31,31,31,31,31,31,31,31,31,31,30,30,30,30, 30,30,30,29,29,29,29,29,29,29,29,29,29,28,28,28,28,28,28,28,28, 28,28,27,27,27,27,27,27,27,27,27,27,26,26,26,26,26,26,26,26,26, 26,26,26,26,26,26,26,26,26,25,25,25,25,25,25,25,25,25,25,25,24, 24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,23,23,23, 23,23,23,23,23,23,23,23,23,23,23,22,22,22,22,22,22,22,22,22,22, 22,22,22,22,22,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20 }; const int u1000_13[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,99, 99,98,98,98,98,98,98,98,98,98,98,98,98,97,97,97,97,97,96,96,96, 96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95, 95,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,93,93, 93,93,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,92,92,92, 91,91,91,91,91,91,91,90,90,90,90,90,90,90,90,90,90,90,90,89,89, 89,89,89,89,89,89,89,88,88,88,88,88,88,87,87,87,87,87,87,87,87, 87,86,86,86,86,86,86,86,86,85,85,85,85,85,85,85,85,85,84,84,84, 84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,83,83,83,83,83,83, 83,83,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,82,82,82,82, 82,82,82,82,82,82,82,82,82,82,82,81,81,81,81,81,81,81,81,81,81, 81,81,81,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,79,79,79, 79,79,79,79,79,79,79,79,79,79,78,78,78,78,77,77,77,77,77,77,77, 77,77,77,77,77,77,77,76,76,76,76,76,76,76,76,76,76,76,76,76,75, 75,75,75,75,75,75,75,75,75,75,75,75,74,74,74,74,74,74,74,74,74, 74,74,74,74,74,74,73,73,73,73,73,73,73,73,73,73,72,72,72,72,72, 72,72,72,72,72,72,72,72,72,72,72,72,72,72,71,71,71,71,71,71,71, 71,71,71,71,71,71,71,71,71,71,71,71,70,70,70,70,70,70,70,70,70, 70,69,69,69,69,69,69,69,69,69,69,69,69,68,68,68,68,68,68,68,68, 68,68,68,68,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,66,66, 66,66,66,66,66,65,65,65,65,65,65,65,65,65,64,64,64,64,64,64,64, 64,64,64,64,63,63,63,63,63,63,62,62,62,62,62,62,62,62,62,62,62, 62,62,62,62,62,62,62,61,61,61,61,61,61,61,61,61,61,61,61,61,61, 61,61,61,61,61,60,60,60,60,60,60,60,60,59,59,59,59,59,59,59,59, 59,59,59,59,59,59,59,58,58,58,58,58,58,58,58,58,58,57,57,57,57, 57,57,57,57,56,56,56,56,56,56,56,56,56,56,56,56,56,56,55,55,55, 55,55,55,55,55,55,55,54,54,54,54,54,54,54,54,54,54,54,54,54,54, 54,54,54,54,54,54,54,53,53,53,53,53,53,53,53,53,53,53,53,53,52, 52,52,52,52,52,52,52,52,52,52,52,52,52,52,51,51,51,51,51,51,51, 51,51,51,51,51,51,51,51,51,50,50,50,50,50,50,50,50,50,50,50,50, 50,50,50,50,49,49,49,49,49,49,49,49,49,49,49,49,48,48,48,48,48, 48,48,48,48,48,48,48,48,48,48,47,47,47,47,47,47,47,47,47,47,47, 47,47,46,46,46,46,46,46,46,46,45,45,45,45,45,45,45,45,44,44,44, 44,44,44,44,44,44,44,44,44,43,43,43,43,43,43,43,43,43,43,43,43, 43,42,42,42,42,42,42,42,42,42,42,42,42,42,42,41,41,41,41,41,41, 41,41,41,41,41,41,41,41,41,40,40,40,40,40,40,40,40,40,40,40,40, 40,40,40,40,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,38, 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,37,37, 37,37,37,37,37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,36, 35,35,35,35,34,34,34,34,34,34,34,34,34,34,34,34,33,33,33,33,33, 33,33,33,33,33,33,33,32,32,32,32,32,32,31,31,31,31,31,31,31,31, 30,30,30,30,30,30,30,30,30,30,30,30,30,29,29,29,29,29,29,29,29, 29,29,29,29,29,29,28,28,28,28,28,28,28,28,28,28,28,28,28,28,27, 27,27,27,27,27,27,27,27,27,27,26,26,26,26,26,26,26,26,26,26,26, 25,25,25,25,25,25,25,25,25,25,25,24,24,24,24,24,24,24,24,24,24, 24,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,22,22,22,22,22, 22,22,22,22,22,22,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20 }; const int u1000_14[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,99,99,99,99,99,99, 99,99,99,99,99,98,98,98,98,98,98,98,98,98,98,98,98,97,97,97,97, 97,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,96,96,96, 96,95,95,95,95,95,95,95,95,95,95,95,95,95,95,94,94,94,94,94,94, 94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,93,93,93,93,92, 92,92,92,92,92,91,91,91,91,91,91,91,90,90,90,90,90,90,90,90,90, 90,90,89,89,89,89,89,89,89,89,88,88,88,88,88,88,88,88,88,88,88, 87,87,87,87,87,87,87,87,87,87,87,86,86,86,86,86,86,86,86,86,86, 86,86,86,86,85,85,85,85,85,85,85,85,85,84,84,84,84,84,84,84,84, 84,83,83,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,82,82,81, 81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,80,80,80,80,80, 80,80,80,80,80,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79, 78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,76,76,76,76,76,76, 76,76,76,75,75,75,75,75,75,75,75,75,75,75,75,75,74,74,74,74,74, 74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73, 73,73,73,73,73,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72, 72,72,71,71,71,71,71,71,71,71,71,71,70,70,70,70,70,70,70,70,70, 69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,68,68,68,68, 68,68,68,68,68,68,68,68,68,67,67,67,67,67,67,67,67,67,67,67,67, 67,67,66,66,66,66,66,66,66,66,66,66,66,65,65,65,65,65,65,65,65, 65,65,65,65,65,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,63, 63,63,63,63,63,63,63,63,63,63,63,63,63,63,62,62,62,62,62,62,62, 62,62,62,62,62,62,62,62,61,61,61,61,61,61,61,61,61,61,61,61,60, 60,60,60,60,60,60,60,60,60,59,59,59,59,59,59,59,59,59,59,59,59, 59,59,59,59,59,59,59,59,59,58,58,58,58,58,58,58,58,58,58,58,58, 58,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,56,56, 56,56,56,56,56,55,55,55,55,55,55,55,55,55,55,55,55,55,54,54,54, 54,54,54,54,54,54,53,53,53,53,53,53,53,53,53,53,53,53,52,52,52, 52,51,51,51,51,51,51,51,51,51,51,51,51,51,51,50,50,50,50,50,50, 50,50,50,50,50,50,50,49,49,49,49,49,49,49,49,49,49,49,49,49,48, 48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,47,47,47,47,47,47, 47,47,47,47,47,47,47,46,46,46,46,46,46,46,46,46,46,46,46,46,46, 45,45,45,45,45,45,45,45,45,45,45,45,45,44,44,44,44,44,44,44,44, 44,44,44,44,44,44,44,44,44,44,43,43,43,43,43,43,43,43,43,43,43, 43,43,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42, 42,42,42,41,41,41,41,41,41,40,40,40,40,40,40,40,40,40,40,39,39, 39,39,39,39,39,39,39,39,39,39,39,39,38,38,38,38,38,38,38,38,38, 38,38,37,37,37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,36, 36,36,36,36,36,36,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35, 34,34,34,34,34,34,34,34,34,34,34,34,34,34,33,33,33,33,33,33,33, 33,33,33,33,33,33,33,32,32,32,32,32,32,32,32,32,32,32,32,32,32, 32,32,32,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,29, 29,29,29,29,29,29,29,29,29,29,28,28,28,28,28,28,28,28,28,27,27, 27,27,27,27,27,27,27,27,27,27,27,27,27,27,26,26,26,26,26,26,26, 26,26,26,26,26,26,26,26,26,26,26,26,25,25,25,25,25,25,25,25,25, 24,24,24,24,24,24,24,24,24,24,24,23,23,23,23,23,23,23,23,23,23, 23,23,23,23,23,23,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, 21,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20 }; const int u1000_15[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,99, 99,99,98,98,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,96,96, 96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95, 95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,93,93,93,93,93,93, 93,93,93,92,92,92,92,92,92,92,92,92,92,92,92,91,91,91,91,91,91, 91,91,91,91,91,91,91,91,91,91,91,91,91,91,90,90,90,90,90,90,90, 90,90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,89,89,89,89,89, 89,89,89,89,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,87, 87,87,87,87,87,87,87,87,87,87,87,87,86,86,86,86,86,86,86,86,86, 86,86,86,86,85,85,85,85,85,85,85,85,85,85,85,85,84,84,84,84,84, 84,84,84,84,84,84,84,83,83,83,83,83,83,83,83,83,83,83,83,83,83, 82,82,82,82,82,82,82,82,82,81,81,81,81,81,81,81,81,81,81,81,81, 81,81,81,81,81,81,81,80,80,80,80,80,80,80,80,80,80,80,80,80,79, 79,79,79,79,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78,78,78, 78,78,78,78,78,78,78,78,78,77,77,77,77,77,77,77,77,77,77,77,77, 76,76,76,76,76,76,76,76,76,76,75,75,75,75,75,75,75,75,75,75,75, 74,74,74,74,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73,73,73, 73,73,73,73,73,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72, 72,71,71,71,71,71,71,71,71,71,71,71,70,70,70,70,70,70,70,70,70, 70,70,70,70,69,69,69,69,69,69,69,69,69,69,68,68,68,68,68,68,68, 68,68,67,67,67,67,67,67,67,67,67,66,66,66,66,66,66,66,66,66,66, 66,66,66,66,65,65,65,65,65,65,65,65,65,65,65,65,65,64,64,64,64, 64,64,64,64,64,64,63,63,63,63,63,63,63,63,63,63,63,63,63,63,62, 62,62,62,62,62,62,62,62,61,61,61,61,61,61,61,61,61,61,61,61,60, 60,60,60,60,60,60,60,60,60,59,59,59,59,59,59,59,59,59,59,59,58, 58,58,58,58,58,58,58,57,57,57,57,57,57,57,56,56,56,56,56,56,56, 56,56,56,56,56,55,55,55,55,55,55,55,55,55,55,55,55,54,54,54,54, 54,54,54,54,54,54,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53, 53,53,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52, 52,51,51,51,51,51,51,51,51,51,51,51,51,50,50,50,50,50,50,50,50, 50,50,50,50,50,50,50,49,49,49,49,49,49,49,49,49,49,49,49,49,49, 49,49,49,49,49,49,49,48,48,48,48,48,48,48,48,48,48,48,47,47,47, 47,47,47,47,47,47,47,47,47,47,47,46,46,46,46,46,46,45,45,45,45, 45,45,45,45,45,45,45,45,44,44,44,44,44,44,44,44,44,44,44,43,43, 43,43,43,43,43,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42, 42,42,42,42,42,42,42,42,42,42,41,41,41,41,41,41,41,40,40,40,40, 40,40,40,40,40,40,40,40,40,40,40,39,39,39,39,39,39,39,39,39,39, 39,39,39,39,38,38,38,38,38,38,38,38,38,37,37,37,37,37,37,37,37, 37,37,37,37,36,36,36,36,36,36,36,36,36,35,35,35,35,35,35,35,35, 35,35,34,34,34,34,34,34,34,34,34,34,34,34,33,33,33,33,33,33,33, 33,33,33,33,32,32,32,32,32,32,32,32,32,31,31,31,31,31,31,31,31, 31,30,30,30,30,30,30,30,30,30,29,29,29,29,29,29,29,29,29,29,29, 29,29,29,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,27, 27,27,27,27,27,27,27,27,27,27,27,27,27,26,26,26,26,26,26,26,26, 26,26,26,26,26,25,25,25,25,25,25,25,25,25,25,25,25,25,25,24,24, 24,24,24,24,24,24,24,24,24,24,24,23,23,23,23,23,23,23,23,23,23, 23,22,22,22,22,22,22,22,22,22,21,21,21,21,21,21,21,21,21,21,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20 }; const int u1000_16[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,98,98, 98,98,98,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,97,97, 97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,95,95,95,95,95,95, 95,95,95,94,94,94,94,94,94,94,94,94,94,94,94,93,93,93,93,93,93, 93,93,93,93,93,93,93,93,93,93,93,93,92,92,92,92,92,92,92,92,92, 92,92,92,92,92,92,92,92,91,91,91,91,91,91,91,91,91,91,91,91,91, 91,91,91,90,90,90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,89, 89,89,89,89,88,88,88,88,88,88,88,88,88,87,87,87,87,87,87,87,87, 87,87,87,87,87,87,87,86,86,86,86,86,86,86,86,86,86,86,86,85,85, 85,85,85,85,85,85,85,85,85,85,84,84,84,84,84,84,84,84,84,84,84, 83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,82,82,82,82,82, 82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,81,81,81,81,81, 81,81,81,81,81,81,81,81,81,80,80,80,80,80,80,80,80,80,80,80,80, 79,79,79,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,78, 78,78,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,76,76,76,76, 76,76,76,76,76,76,76,76,76,76,76,76,76,75,75,75,75,75,75,75,75, 75,75,75,75,75,75,75,75,74,74,74,74,74,74,74,74,74,74,74,74,74, 74,74,73,73,73,73,73,73,73,72,72,72,72,72,72,72,72,72,72,72,71, 71,71,71,71,71,71,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70, 69,69,69,69,69,69,69,69,69,69,69,69,68,68,68,68,68,68,68,68,68, 68,68,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,66,66, 66,66,66,66,66,66,66,66,65,65,65,65,65,65,65,65,65,65,65,65,65, 65,65,64,64,64,64,64,64,64,64,64,64,64,64,64,64,63,63,63,63,63, 63,63,63,63,63,63,63,63,62,62,62,62,62,62,62,62,62,62,62,62,62, 62,62,61,61,61,61,61,61,61,61,60,60,60,60,60,60,60,60,60,60,60, 60,60,59,59,59,59,59,59,59,59,59,59,59,59,59,58,58,58,58,58,58, 58,58,58,58,57,57,57,57,57,57,57,57,57,57,57,57,57,56,56,56,56, 56,56,56,56,56,56,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55, 55,55,54,54,54,54,54,54,54,54,54,53,53,53,53,53,52,52,52,52,52, 52,52,52,52,52,52,52,51,51,51,51,51,51,51,51,51,51,51,51,51,51, 51,51,50,50,50,50,50,50,50,50,50,50,50,49,49,49,49,49,49,49,49, 49,48,48,48,48,48,48,48,48,48,48,47,47,47,47,47,47,47,47,47,47, 47,47,46,46,46,46,46,46,46,46,46,46,46,46,46,45,45,45,45,45,45, 44,44,44,44,44,44,44,44,44,43,43,43,43,43,43,43,43,43,43,43,42, 42,42,42,42,42,42,42,42,42,42,42,41,41,41,41,41,41,41,41,41,41, 41,41,41,41,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40, 40,40,40,39,39,39,39,39,39,39,39,39,39,39,38,38,38,38,38,38,38, 38,38,38,38,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,36, 36,36,36,36,36,36,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35, 35,35,34,34,34,34,34,34,34,34,34,34,34,34,33,33,33,33,33,33,33, 33,33,33,33,33,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,31, 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,29, 29,29,29,29,29,29,29,29,29,29,29,29,28,28,28,28,28,28,28,28,28, 28,28,28,28,28,27,27,27,27,27,27,27,27,27,27,26,26,26,26,26,26, 26,26,26,26,26,26,26,26,26,26,26,25,25,25,25,25,25,25,25,25,25, 25,25,25,24,24,24,24,24,24,24,23,23,23,23,23,23,23,23,22,22,22, 22,22,22,22,22,22,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21, 21,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20 }; const int u1000_17[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,100,100,100,100,100,99,99, 99,99,99,99,99,99,99,99,99,99,99,99,98,98,98,98,98,98,98,98,98, 98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,97,97,97,96,96,96, 96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,95,95,94,94, 94,94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,93,93,93,93, 93,92,92,92,92,92,92,92,92,92,91,91,91,91,91,91,91,91,91,91,91, 91,91,91,90,90,90,90,90,90,90,90,90,90,90,90,89,89,89,89,89,89, 89,89,89,89,89,89,89,89,88,88,88,88,88,88,88,88,88,88,88,88,87, 87,87,87,87,87,87,87,87,87,87,87,87,87,86,86,86,86,86,86,86,86, 86,86,86,86,86,86,86,86,86,86,86,85,85,85,85,85,85,85,85,85,85, 85,85,85,85,85,85,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84, 84,84,84,84,83,83,83,83,83,83,83,83,83,83,83,83,82,82,82,82,82, 82,82,82,82,82,82,82,82,82,82,81,81,81,81,81,81,81,81,81,81,81, 81,80,80,80,80,80,80,80,80,80,80,79,79,79,79,79,79,79,79,79,79, 79,79,79,78,78,78,78,78,78,78,78,78,77,77,77,77,77,77,77,77,77, 77,77,77,77,76,76,76,76,76,76,76,76,76,75,75,75,75,75,75,75,75, 75,75,75,75,75,75,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74, 74,74,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,72,72,72,72, 72,72,72,72,72,71,71,71,71,71,71,71,71,71,71,71,71,70,70,70,70, 70,70,70,70,70,70,70,69,69,69,69,69,69,69,69,69,69,69,69,69,69, 69,69,68,68,68,68,68,68,68,67,67,67,67,67,67,67,67,67,67,67,67, 66,66,66,66,66,66,66,66,66,66,66,66,65,65,65,65,65,65,65,65,65, 65,65,65,65,65,65,65,65,65,64,64,64,64,64,64,64,64,64,64,64,64, 63,63,63,63,63,63,63,63,63,63,62,62,62,62,62,62,62,62,62,62,62, 62,62,62,61,61,61,61,61,61,61,61,61,60,60,60,60,60,60,60,60,60, 60,60,60,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,58, 58,58,58,58,58,58,58,58,58,58,57,57,57,57,57,57,57,56,56,56,56, 56,56,56,56,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,55,55, 54,54,54,54,54,54,54,54,54,53,53,53,53,53,53,53,53,53,53,53,53, 53,53,53,52,52,52,52,52,52,52,52,52,52,52,52,52,51,51,51,51,51, 51,51,51,51,50,50,50,50,50,50,50,50,50,50,50,49,49,49,49,49,49, 49,49,49,49,49,49,48,48,48,48,48,48,48,48,48,48,48,48,48,47,47, 47,47,47,47,47,47,47,46,46,46,46,46,46,45,45,45,45,45,45,45,45, 45,45,45,44,44,44,44,44,44,44,44,44,44,44,44,43,43,43,43,43,43, 43,43,42,42,42,42,42,42,42,42,42,42,42,41,41,41,41,41,41,41,41, 41,41,41,41,41,41,41,41,40,40,40,40,40,40,40,40,40,40,40,40,40, 39,39,39,39,39,39,39,39,39,39,39,38,38,38,38,38,38,37,37,37,37, 37,37,37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,36,36,35, 35,35,35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,34,34,33,33, 33,33,33,33,33,33,33,32,32,32,32,32,32,32,32,32,32,32,32,32,32, 32,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,30,30,30, 30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,29,29,29,29,29, 29,29,29,29,29,29,29,28,28,28,28,28,28,28,28,28,27,27,27,27,27, 27,27,27,27,27,27,27,27,27,26,26,26,26,26,26,26,26,26,26,26,26, 26,26,26,26,26,26,26,25,25,25,25,25,25,25,25,25,25,25,25,24,24, 24,24,24,24,24,24,24,24,24,24,24,23,23,23,23,23,23,23,23,22,22, 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,21,21,21, 21,21,21,21,21,21,21,21,20,20,20,20,20,20,20,20,20,20 }; const int u1000_18[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,99,99,99,99,99,99,99,99,99,99,99,99,98, 98,98,98,98,98,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,97, 97,97,96,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95, 95,95,95,95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,94,94,94, 94,94,94,94,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,92, 92,92,92,92,92,92,92,92,92,92,92,92,91,91,91,91,91,91,91,91,91, 91,90,90,90,90,90,90,90,90,90,90,90,89,89,89,89,89,89,89,89,89, 89,89,89,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,87,87, 87,87,87,87,87,87,87,87,87,86,86,86,86,86,86,86,86,85,85,85,85, 85,85,85,85,85,85,85,85,85,85,85,84,84,84,84,84,84,84,84,84,84, 84,84,84,84,83,83,83,83,83,83,83,83,83,82,82,82,82,82,82,81,81, 81,81,81,81,81,81,81,81,81,81,81,81,81,81,80,80,80,80,80,80,80, 80,80,80,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,78, 78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,77,77,77,77, 77,77,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,76,76,76,76, 75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,74,74,74, 74,74,74,74,74,74,74,74,73,73,73,73,73,73,73,73,73,72,72,72,72, 72,72,72,72,72,72,72,72,71,71,71,71,71,71,71,71,71,71,71,71,71, 70,70,70,70,70,70,70,70,70,69,69,69,69,69,69,69,69,69,69,68,68, 68,68,68,68,68,68,68,68,67,67,67,67,67,67,67,67,67,67,67,67,66, 66,66,66,66,66,66,66,66,65,65,65,65,65,65,65,65,65,65,64,64,64, 64,64,64,64,64,64,64,64,64,64,64,63,63,63,63,63,63,63,63,63,63, 63,63,63,63,63,62,62,62,62,62,62,62,62,62,62,61,61,61,61,61,61, 61,61,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,59,59,59, 59,59,59,59,59,59,59,58,58,58,58,58,58,58,58,58,58,58,58,58,57, 57,57,57,57,57,57,57,57,57,57,57,57,56,56,56,56,56,56,56,56,56, 56,56,56,56,55,55,55,55,55,55,55,55,55,55,55,55,55,54,54,54,54, 54,54,54,54,54,54,53,53,53,53,53,53,53,53,53,53,53,52,52,52,52, 52,52,52,52,52,52,52,52,52,51,51,51,51,51,51,51,51,51,51,51,51, 51,50,50,50,50,50,50,50,50,50,50,49,49,49,49,49,49,49,49,49,49, 49,49,49,49,49,49,49,48,48,48,48,48,48,48,48,48,48,48,48,48,48, 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,46,46,46,46,46, 46,46,46,46,46,46,46,46,46,45,45,45,45,45,45,45,45,45,44,44,44, 44,44,43,43,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42,42, 42,42,42,42,42,42,42,41,41,41,41,41,41,41,41,41,41,41,41,40,40, 40,40,40,40,40,40,40,40,40,40,40,40,40,39,39,39,39,39,39,39,39, 39,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37, 37,37,37,37,37,37,37,37,36,36,36,36,36,36,36,36,36,36,35,35,35, 35,35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,34,34,33,33,33, 33,33,33,33,33,33,33,33,32,32,32,32,32,32,32,32,32,32,32,32,31, 31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30,30,30, 30,30,30,30,30,30,30,30,30,30,29,29,29,29,29,29,29,29,29,29,29, 29,29,29,29,29,28,28,28,28,28,28,28,28,28,28,28,28,28,27,27,27, 27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,26,26, 26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,25,25,25,25,25, 25,25,25,25,25,24,24,24,24,24,24,24,24,23,23,23,23,23,23,23,23, 23,23,23,23,23,23,23,23,23,23,23,22,22,22,22,22,22,22,22,21,21, 21,21,20,20,20,20,20,20,20,20,20,20,20,20,20 }; const int u1000_19[] = { // Capacity 150, // Number of items 1000, // Size of items (sorted) 100,100,100,100,100,100,100,100,100,99,99,99,99,99,99,99,99,98, 98,98,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,97,97,97, 96,96,96,96,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,94,94, 94,94,94,94,94,94,94,94,94,94,94,94,93,93,93,93,93,93,93,93,93, 93,93,93,93,93,92,92,92,92,92,92,92,92,92,92,92,91,91,91,91,91, 91,91,91,91,91,91,91,91,91,90,90,90,90,90,90,90,90,90,90,90,90, 89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,88,88,88,88,88,88, 88,88,88,88,88,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87, 87,86,86,86,86,86,86,86,86,86,86,86,86,86,85,85,85,85,85,85,85, 85,85,85,85,85,85,84,84,84,84,84,84,84,84,84,84,84,84,83,83,83, 83,83,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,82,82,82,82, 82,82,82,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,80,80, 80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,79,79,79,79,79,79, 79,79,79,79,79,79,79,79,79,78,78,78,78,78,78,78,78,78,78,78,78, 78,78,77,77,77,77,77,77,77,77,77,76,76,76,76,76,76,76,76,76,76, 76,76,76,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,74,74, 74,74,74,74,74,74,74,74,74,74,74,74,74,74,73,73,73,73,73,73,73, 73,73,73,73,73,73,72,72,72,72,72,72,72,72,72,71,71,71,71,71,71, 71,71,71,71,71,71,71,71,71,70,70,70,70,70,70,70,70,70,69,69,69, 69,69,69,69,69,69,68,68,68,68,68,68,68,68,68,67,67,67,67,67,67, 67,67,67,67,67,67,67,67,66,66,66,66,66,66,66,66,66,66,66,66,65, 65,65,65,65,65,65,65,65,65,65,64,64,64,64,64,64,64,64,64,64,63, 63,63,63,63,63,63,63,63,63,63,63,62,62,62,62,62,62,62,62,61,61, 61,61,61,61,61,61,61,61,61,61,61,60,60,60,60,60,60,60,60,60,60, 60,59,59,59,59,59,59,59,59,58,58,58,58,58,58,58,58,58,58,58,58, 58,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,56,56, 56,56,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,55,55,55,55, 55,55,55,55,54,54,54,54,54,54,54,54,54,54,54,54,54,53,53,53,53, 53,53,53,53,53,53,53,52,52,52,52,52,52,52,52,52,52,52,52,52,52, 52,52,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,50,50,50,50, 50,50,50,50,50,50,50,50,50,50,49,49,49,49,49,49,49,49,48,48,48, 48,48,48,48,48,48,48,48,47,47,47,47,47,47,47,47,47,47,47,47,47, 47,47,47,46,46,46,46,46,46,46,46,46,46,46,46,46,45,45,45,45,45, 45,45,45,45,45,45,45,45,45,45,45,45,44,44,44,44,44,44,44,44,44, 43,43,43,43,43,43,43,43,43,42,42,42,42,42,42,42,42,42,42,42,41, 41,41,41,41,41,41,41,41,41,41,41,40,40,40,40,40,40,40,40,39,39, 39,39,39,39,39,38,38,38,38,38,38,38,38,38,37,37,37,37,37,37,37, 37,37,37,37,36,36,36,36,36,36,36,36,36,36,36,35,35,35,35,35,35, 35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,34,34,34,34,34,34, 34,34,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33, 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,31,31,31,31,31,31, 31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30,30,30,30,29,29, 29,29,29,29,28,28,28,28,28,28,28,28,28,28,28,28,28,28,27,27,27, 27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,26,26,26,26,26, 26,26,26,26,26,25,25,25,25,25,25,25,25,25,25,25,25,24,24,24,24, 24,24,24,24,24,24,24,24,23,23,23,23,23,23,23,23,23,23,23,22,22, 22,22,22,22,22,22,22,22,22,22,22,22,22,22,21,21,21,21,21,21,21, 21,21,20,20,20,20,20,20,20,20,20,20,20,20,20,20 }; const int t120_00[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 497,497,495,485,480,478,474,473,472,470,466,450,446,445,445,444, 439,434,430,420,419,414,412,410,407,405,400,397,395,376,372,370, 366,366,366,366,366,363,363,362,361,357,357,356,356,355,352,351, 350,350,350,347,336,333,329,325,320,315,314,313,307,303,302,301, 299,298,298,298,295,294,292,290,288,287,283,282,282,276,275,275, 274,273,273,272,272,271,271,269,269,268,267,267,266,263,263,262, 262,261,260,259,259,259,258,256,255,254,254,254,253,253,253,253, 252,252,252,252,251,251,250,250 }; const int t120_01[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 498,496,493,491,491,485,483,465,448,444,433,432,429,427,424,421, 421,414,408,406,403,402,399,398,396,393,392,389,389,383,381,380, 375,372,372,368,367,366,365,365,363,363,363,357,353,353,351,347, 340,338,336,335,331,330,329,328,328,325,324,322,317,316,316,313, 311,311,308,308,303,303,303,298,296,296,295,295,294,292,289,289, 283,282,280,279,277,276,275,271,268,268,268,266,265,265,265,262, 262,260,260,260,259,259,259,259,257,256,255,254,254,253,253,252, 252,251,251,251,250,250,250,250 }; const int t120_02[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 499,498,495,495,494,491,485,480,466,464,463,458,451,445,444,440, 435,434,430,429,428,427,426,426,413,412,399,398,395,381,376,373, 370,370,370,368,368,367,362,361,360,358,357,351,350,350,349,347, 344,344,343,332,330,329,323,320,315,311,309,306,304,300,300,299, 297,294,290,289,288,287,286,286,286,283,283,282,281,280,279,277, 277,275,274,274,274,273,272,272,271,270,268,267,265,263,263,262, 261,259,258,258,257,257,256,256,255,255,255,254,254,253,253,252, 251,251,250,250,250,250,250,250 }; const int t120_03[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 499,499,480,476,473,471,470,467,463,457,447,444,442,439,439,437, 434,432,419,418,418,415,412,412,411,410,406,405,403,397,396,393, 393,390,381,374,372,369,366,364,354,354,354,351,351,348,346,336, 329,328,324,324,323,321,320,317,316,316,306,304,304,301,301,301, 300,299,299,298,296,295,294,290,289,288,287,287,285,285,282,280, 279,278,278,277,277,277,276,276,274,274,273,272,271,269,268,266, 265,265,265,262,261,261,257,257,256,255,255,255,254,254,254,254, 253,252,252,251,251,250,250,250 }; const int t120_04[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 499,497,491,488,484,484,483,481,480,473,469,465,464,462,460,452, 447,446,436,434,432,430,426,424,419,414,410,409,403,401,396,396, 391,384,382,373,370,368,360,359,357,350,350,350,337,335,334,333, 328,325,324,322,321,317,315,314,312,308,306,303,301,298,298,298, 296,289,289,289,288,286,285,283,280,279,279,278,276,275,274,273, 272,272,270,269,269,268,268,267,267,266,266,266,265,265,265,263, 263,262,261,261,260,259,258,258,257,256,256,255,254,254,253,252, 252,251,251,251,251,250,250,250 }; const int t120_05[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 499,494,493,491,482,480,474,471,469,465,462,462,462,457,453,447, 435,433,424,423,420,415,414,413,411,410,408,402,394,393,393,389, 389,383,375,373,371,363,363,358,358,355,355,351,349,343,340,335, 334,333,332,332,329,318,315,313,312,309,307,306,305,303,303,299, 298,298,291,290,289,289,288,285,284,282,282,282,281,281,280,280, 279,278,277,275,275,275,273,272,272,271,270,269,268,268,264,261, 260,260,259,259,258,258,258,257,257,257,256,256,255,255,254,254, 254,253,252,251,251,250,250,250 }; const int t120_06[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 493,491,491,471,469,468,465,461,459,457,455,453,451,448,441,429, 428,427,425,420,404,402,397,391,390,380,380,378,378,377,375,375, 374,373,371,370,370,366,364,363,360,360,359,359,358,357,357,350, 339,336,330,327,326,325,325,323,323,321,320,319,318,311,311,304, 303,303,301,300,299,299,299,297,297,297,295,292,292,290,289,289, 286,285,285,284,281,281,278,277,276,275,273,271,269,269,266,265, 263,262,260,260,260,260,258,258,257,257,257,257,255,254,254,254, 253,253,252,252,252,251,250,250 }; const int t120_07[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 497,496,493,490,490,485,484,472,470,462,458,446,446,445,442,436, 436,433,427,426,423,422,419,414,410,408,403,402,396,388,387,386, 377,375,375,374,373,372,372,364,363,361,357,352,352,349,347,342, 339,336,335,334,330,329,328,323,318,315,312,310,308,308,306,306, 305,302,302,294,292,290,287,285,280,278,276,276,276,276,275,275, 274,274,273,273,272,270,270,270,269,268,268,266,265,263,262,262, 262,260,258,258,258,257,256,255,254,254,254,254,253,253,253,252, 252,252,252,251,250,250,250,250 }; const int t120_08[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 494,483,483,481,477,476,475,471,462,461,460,460,454,449,447,443, 436,430,429,427,424,418,418,411,411,408,406,402,398,397,395,382, 379,378,375,372,370,369,368,364,360,358,357,354,351,346,346,336, 334,326,325,322,321,317,316,315,315,312,309,309,305,304,301,301, 297,296,290,290,289,289,289,288,288,286,285,285,284,284,284,281, 280,280,277,276,273,271,271,270,269,269,269,268,268,268,268,267, 267,266,264,264,263,263,261,261,259,258,257,257,257,255,255,254, 252,251,251,251,251,251,250,250 }; const int t120_09[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 499,498,498,495,490,486,482,480,478,478,462,434,434,432,430,428, 427,419,414,410,408,408,400,397,395,394,394,391,387,387,386,382, 375,370,368,366,364,362,362,361,357,356,356,353,352,347,346,345, 344,344,340,338,336,336,330,329,327,326,324,323,314,314,305,304, 304,300,297,296,295,293,292,292,289,288,288,285,284,284,282,281, 281,280,278,277,276,276,276,275,274,272,271,270,270,269,269,263, 262,262,262,261,259,259,256,256,254,253,252,252,252,252,251,251, 251,251,250,250,250,250,250,250 }; const int t120_10[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 495,495,492,491,488,479,478,474,471,462,459,452,442,441,438,436, 427,426,425,421,421,421,415,408,407,407,402,390,390,385,385,383, 378,377,376,368,362,361,356,355,355,355,352,352,346,346,345,342, 339,339,330,329,324,320,319,316,315,312,308,306,306,305,305,303, 301,300,298,298,297,297,297,294,292,292,287,287,287,285,284,282, 282,281,279,277,276,274,273,272,272,270,269,269,269,268,266,266, 265,265,264,263,262,258,258,258,257,257,257,257,255,255,255,254, 254,253,251,251,251,251,250,250 }; const int t120_11[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 499,493,493,491,491,488,485,483,472,465,465,463,456,450,449,443, 443,435,429,424,422,412,408,401,400,400,400,399,395,393,385,383, 378,377,377,374,372,372,365,361,360,355,354,350,349,347,344,343, 338,337,332,329,326,325,320,313,311,310,310,308,308,305,301,300, 297,296,296,295,292,291,291,288,288,288,287,281,280,277,276,275, 275,275,273,271,269,268,268,268,267,266,266,266,265,264,264,264, 263,262,262,262,261,261,260,258,258,257,256,256,256,256,255,253, 253,252,252,251,251,251,251,250 }; const int t120_12[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 498,495,495,493,492,488,486,484,482,480,476,473,473,460,457,455, 450,450,447,447,446,429,421,411,408,400,398,397,395,391,388,383, 379,377,377,375,375,370,366,361,358,357,356,354,350,348,348,347, 343,341,340,339,329,329,326,323,322,309,302,298,298,296,294,293, 293,290,284,283,283,282,281,281,280,278,278,277,273,272,272,271, 269,269,268,267,266,266,266,265,264,264,261,261,260,260,260,260, 259,257,257,255,255,255,255,254,254,253,253,253,252,252,252,251, 251,250,250,250,250,250,250,250 }; const int t120_13[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 491,477,473,472,467,464,461,459,459,458,454,448,444,440,426,423, 417,416,414,413,408,407,406,404,400,399,397,391,387,384,384,378, 378,375,375,375,372,370,361,360,359,356,356,356,356,355,354,350, 341,337,334,330,329,329,324,323,323,322,321,318,317,315,314,313, 309,305,305,302,299,297,297,295,291,291,290,290,290,287,283,283, 280,278,278,278,275,274,273,273,273,272,270,269,268,267,267,267, 266,266,265,265,264,263,263,263,261,261,261,259,258,256,256,255, 255,255,255,254,253,251,250,250 }; const int t120_14[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 496,496,496,494,489,486,486,484,470,470,453,450,445,444,443,442, 433,430,421,418,418,416,414,412,405,405,404,402,396,390,388,386, 384,384,382,373,373,369,365,363,358,357,356,353,350,350,343,340, 336,336,332,331,329,329,328,319,316,313,313,311,309,309,309,306, 305,302,302,298,294,290,289,289,289,287,284,283,282,280,280,276, 275,273,273,271,271,269,267,266,265,264,262,261,261,261,260,260, 259,259,258,258,257,257,256,256,256,255,254,254,254,254,254,253, 253,252,251,251,251,251,250,250 }; const int t120_15[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 487,484,483,482,479,473,472,472,469,465,463,458,453,446,446,443, 443,443,440,433,426,426,425,422,411,408,404,400,400,387,387,386, 386,378,373,372,367,365,363,363,363,362,362,357,354,344,337,334, 333,332,330,322,322,322,320,317,310,307,306,306,305,304,303,303, 303,302,296,296,294,292,287,285,282,281,280,279,279,278,277,277, 276,274,274,274,272,271,271,270,270,270,269,267,267,267,266,266, 264,264,263,262,262,261,261,260,258,258,257,256,256,255,255,252, 252,251,251,251,251,250,250,250 }; const int t120_16[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 492,490,485,484,475,472,467,461,454,447,446,443,442,442,437,434, 432,431,428,427,422,419,414,412,404,404,403,397,393,387,383,381, 381,377,377,376,370,369,369,368,367,365,364,361,359,358,355,352, 349,337,337,330,329,329,324,323,321,319,317,316,310,303,299,298, 298,294,294,293,293,290,290,287,285,285,285,284,284,282,281,279, 279,278,275,274,273,273,272,272,270,267,267,265,265,265,264,264, 264,262,262,262,261,260,260,260,259,259,257,257,256,255,255,254, 254,253,252,252,251,251,250,250 }; const int t120_17[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 499,496,495,492,489,477,476,474,473,471,470,456,454,453,450,449, 447,447,446,442,435,433,432,431,422,422,416,414,401,399,398,397, 396,388,385,384,379,378,377,360,359,357,352,337,332,330,324,323, 322,321,319,319,314,314,308,307,306,304,301,300,296,296,296,294, 292,289,288,288,286,285,285,283,282,280,279,279,279,279,276,275, 275,274,274,273,272,271,270,270,269,269,269,267,267,266,266,263, 262,260,259,259,258,258,257,257,257,257,256,256,255,254,254,254, 253,253,252,252,251,251,251,250 }; const int t120_18[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 499,495,495,493,488,488,477,476,473,469,466,461,460,458,457,455, 453,444,438,428,424,421,418,418,417,410,408,408,407,400,398,395, 393,391,385,373,370,369,366,355,348,346,340,339,338,334,329,327, 327,323,323,318,317,317,314,313,312,309,308,306,304,304,300,300, 298,297,295,295,292,292,290,287,286,286,286,284,282,282,282,280, 278,276,275,274,272,268,268,268,267,267,265,264,264,262,262,261, 259,259,259,259,258,258,256,256,256,255,255,255,254,254,253,252, 251,251,250,250,250,250,250,250 }; const int t120_19[] = { // Capacity 1000, // Number of items 120, // Size of items (sorted) 499,497,496,492,491,486,484,479,476,472,469,468,467,460,456,450, 442,434,430,426,418,418,416,410,407,405,399,395,390,390,386,381, 380,380,379,374,371,369,367,364,358,352,350,345,341,340,337,333, 333,331,330,330,326,321,320,319,315,309,309,309,309,309,305,301, 300,298,296,296,292,291,291,288,282,281,279,277,276,276,276,275, 275,274,273,273,272,271,271,271,270,269,269,268,267,265,265,261, 260,260,259,259,258,257,257,256,256,255,254,254,254,253,253,253, 253,253,251,251,251,250,250,250 }; const int t249_00[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 498,497,497,497,496,495,495,492,491,491,490,488,485,485,485,485, 481,480,480,479,478,474,473,473,472,471,470,469,466,464,462,450, 446,446,445,445,444,441,441,439,437,434,430,426,426,422,421,420, 419,419,415,414,412,410,407,406,405,404,400,397,395,393,392,392, 392,386,385,382,376,372,370,370,367,367,366,366,366,366,366,365, 363,363,362,361,359,357,357,357,356,356,355,355,352,351,351,350, 350,350,350,347,346,344,342,337,336,333,333,330,329,325,320,318, 318,315,314,314,313,312,310,308,308,307,305,303,302,301,299,298, 298,298,297,295,294,294,294,293,293,292,291,290,288,287,287,287, 283,282,282,281,281,280,278,277,276,276,276,275,275,275,274,274, 274,274,273,273,272,272,272,271,271,271,271,271,269,269,269,269, 268,267,267,266,265,264,264,264,263,263,263,262,262,262,261,261, 260,260,260,259,259,259,259,259,259,258,258,258,258,258,257,256, 255,255,255,255,255,255,254,254,254,254,254,253,253,253,253,253, 253,253,252,252,252,252,252,252,252,251,251,251,251,251,251,250, 250,250,250,250,250,250,250,250,250 }; const int t249_01[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 499,497,497,497,494,492,491,491,489,488,487,480,469,468,466,464, 464,461,460,459,457,452,452,451,451,449,446,444,443,441,440,438, 437,437,434,432,431,431,428,428,426,425,425,425,424,422,422,416, 415,415,410,409,407,407,404,401,400,398,397,393,392,391,387,385, 385,385,383,382,382,382,382,381,381,380,379,377,376,372,372,370, 369,368,368,365,364,363,361,361,360,360,359,358,354,353,344,343, 340,336,335,334,334,333,332,332,331,331,329,329,328,325,325,323, 323,322,321,321,319,317,316,314,312,311,311,310,309,309,309,308, 306,305,303,303,302,301,301,299,298,297,296,295,293,293,293,292, 291,291,291,289,289,288,288,284,284,284,283,283,283,282,282,281, 281,280,279,279,279,279,278,278,277,277,277,276,276,276,273,273, 272,271,271,271,270,270,269,269,269,269,267,267,267,267,265,264, 263,263,263,262,261,260,260,260,260,259,259,258,258,258,258,258, 258,257,257,257,257,256,255,255,255,255,255,254,254,254,254,254, 254,254,253,253,253,253,253,253,252,252,252,252,251,251,251,251, 250,250,250,250,250,250,250,250,250 }; const int t249_02[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 496,494,494,490,488,487,484,484,481,477,476,469,467,466,463,461, 459,459,458,457,456,453,450,449,448,445,443,443,442,441,434,433, 433,431,430,424,421,421,419,414,414,413,410,407,407,405,403,401, 401,397,397,396,394,392,392,391,391,390,390,390,387,387,384,383, 382,381,377,377,375,374,374,374,374,373,373,373,373,372,369,368, 368,367,367,366,365,363,362,362,360,357,357,356,356,353,351,350, 350,349,346,346,345,345,343,340,339,339,335,335,333,333,332,329, 329,329,326,324,324,324,323,322,319,319,318,317,315,314,311,311, 311,311,310,308,307,304,303,302,301,300,300,299,298,297,296,294, 292,290,290,290,290,288,288,287,287,287,286,286,286,285,285,285, 283,282,281,281,281,281,281,281,280,280,280,279,278,278,276,274, 274,273,273,272,272,271,271,271,271,271,270,270,270,269,269,269, 269,267,266,265,265,264,264,264,264,263,263,263,263,262,261,260, 260,260,260,259,259,259,259,258,258,257,257,257,257,256,256,256, 256,256,255,255,255,255,254,254,254,254,253,253,253,253,252,252, 252,252,251,250,250,250,250,250,250 }; const int t249_03[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 499,495,494,493,492,491,489,489,489,488,487,486,484,482,482,477, 476,474,473,472,466,463,461,459,458,458,454,451,451,448,444,444, 443,442,442,441,438,435,431,430,427,425,424,424,420,420,419,418, 414,414,412,407,405,405,400,398,397,396,396,395,393,393,392,391, 391,387,385,385,381,380,378,374,373,373,371,369,368,367,367,366, 364,363,363,362,362,361,359,357,356,355,354,348,347,347,341,340, 339,339,337,336,335,334,333,330,329,327,325,324,324,323,321,321, 318,317,313,313,312,311,311,309,309,308,305,305,304,304,303,303, 303,302,299,298,298,296,295,295,295,294,292,292,290,289,289,289, 288,286,286,285,285,285,284,283,283,282,282,282,282,282,281,281, 280,279,278,278,278,277,277,276,276,276,276,275,275,273,273,272, 272,272,272,272,272,270,270,270,270,270,270,270,270,269,269,267, 266,265,265,265,265,264,264,264,264,263,263,263,261,260,260,260, 259,259,259,258,258,258,257,257,257,257,257,256,256,256,256,255, 255,255,255,254,254,254,254,253,253,253,253,252,252,251,251,251, 251,251,251,251,250,250,250,250,250 }; const int t249_04[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 499,498,498,498,498,498,496,488,486,486,483,483,482,481,480,479, 476,476,475,475,474,468,467,467,467,466,461,461,461,460,460,459, 458,455,453,452,451,448,448,447,446,445,445,442,440,439,433,429, 427,427,425,423,421,421,420,415,414,413,410,409,409,408,403,401, 401,400,398,397,396,390,387,386,383,379,378,375,374,374,374,371, 368,365,362,360,359,358,355,353,351,351,350,349,346,346,345,344, 343,340,337,335,335,325,322,322,322,322,321,320,319,318,317,317, 317,315,308,308,305,305,303,303,302,301,300,298,296,296,296,295, 294,294,294,294,290,289,289,287,287,286,286,286,285,285,284,283, 283,282,281,281,281,280,278,278,277,276,276,275,275,274,273,273, 273,272,271,271,270,270,269,269,269,269,268,268,267,267,267,266, 266,265,265,265,264,264,263,263,263,263,263,262,262,262,261,261, 261,260,259,259,258,258,258,258,258,257,257,256,256,256,255,255, 255,255,255,254,254,254,254,254,254,254,253,253,253,253,253,252, 252,252,252,252,252,252,252,252,252,252,251,251,251,251,250,250, 250,250,250,250,250,250,250,250,250 }; const int t249_05[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 499,498,493,491,489,489,489,488,487,484,480,479,478,472,471,467, 466,463,463,463,461,453,450,447,445,444,443,440,438,438,435,433, 433,431,425,425,425,422,420,419,418,414,413,412,411,407,405,404, 404,403,403,400,399,394,394,389,388,386,385,384,384,382,382,381, 381,380,379,379,378,377,376,376,374,374,371,370,367,366,365,365, 363,363,362,361,360,358,357,356,353,353,352,352,350,350,346,345, 343,343,342,338,336,335,335,334,333,330,330,329,329,328,326,324, 323,321,320,320,319,317,315,315,314,313,313,312,312,312,310,310, 309,308,307,307,307,305,304,304,301,301,300,300,300,299,299,299, 297,297,297,297,295,295,294,294,293,293,291,290,289,289,288,287, 286,285,285,283,283,283,282,281,280,279,279,279,279,278,276,276, 276,276,276,275,275,274,274,274,273,273,273,273,271,270,270,270, 269,268,268,268,267,267,265,265,264,263,263,263,263,262,262,261, 261,260,260,260,260,259,259,259,259,259,258,258,258,257,257,255, 255,255,254,254,254,253,253,253,252,252,252,252,252,252,252,252, 252,251,251,251,250,250,250,250,250 }; const int t249_06[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 499,497,496,495,494,494,493,492,491,482,480,479,479,479,478,475, 468,467,466,465,461,460,457,457,453,453,453,452,448,448,447,444, 443,442,440,439,436,432,432,429,428,427,423,420,415,415,414,414, 414,413,412,410,408,407,406,403,400,396,395,395,394,393,393,392, 389,387,386,384,383,380,380,376,375,374,372,371,370,369,369,366, 366,364,363,362,357,357,356,354,352,352,352,352,351,351,350,350, 346,346,342,341,340,339,336,335,335,332,332,331,325,321,321,321, 318,317,316,316,314,314,313,313,313,312,310,310,309,308,308,306, 305,303,302,300,300,300,300,298,298,297,295,295,294,294,293,293, 293,291,290,290,289,289,289,289,289,285,285,284,284,284,284,283, 282,282,282,280,278,278,278,277,275,274,274,274,273,271,271,270, 270,269,269,269,268,266,266,266,265,264,264,264,264,263,263,263, 263,262,262,261,261,260,259,259,259,259,258,258,258,257,257,257, 257,257,256,256,256,256,256,256,255,255,255,255,255,254,254,254, 254,254,253,253,253,253,252,252,252,252,251,251,251,251,251,251, 250,250,250,250,250,250,250,250,250 }; const int t249_07[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 499,498,498,497,495,494,489,488,488,486,480,476,472,471,470,470, 468,468,468,468,468,465,462,462,461,460,460,456,451,450,449,449, 447,444,443,440,436,433,430,430,430,427,426,425,420,419,419,418, 417,417,415,412,412,411,407,406,405,404,401,397,396,396,395,392, 392,391,389,384,383,383,381,380,380,379,377,377,376,375,374,371, 370,368,365,365,363,361,359,358,355,355,354,352,350,350,347,347, 344,341,340,337,336,335,335,332,331,330,327,324,324,322,321,319, 319,318,314,313,313,309,307,305,305,304,304,304,304,303,303,303, 301,300,299,298,297,296,296,296,295,292,292,292,291,291,289,289, 287,287,285,284,284,284,284,283,283,283,282,281,280,279,279,278, 278,278,277,277,277,276,276,276,275,274,273,271,271,271,271,270, 270,269,268,268,268,267,266,266,266,266,266,266,264,264,264,262, 262,262,262,261,261,261,261,261,260,260,260,259,259,259,259,259, 258,258,258,258,258,258,256,256,256,256,255,255,255,255,254,254, 254,254,254,254,254,254,253,253,253,253,253,252,252,252,252,252, 252,251,251,250,250,250,250,250,250 }; const int t249_08[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 498,498,493,493,490,488,488,487,483,483,482,482,481,480,479,479, 476,475,469,468,466,465,464,459,459,455,454,451,450,449,449,448, 447,445,442,442,438,436,436,435,429,411,408,407,406,405,404,404, 403,402,402,402,401,401,398,396,396,395,395,391,389,388,386,385, 383,383,382,382,380,379,378,378,378,377,371,371,369,367,366,365, 363,363,363,362,361,360,359,358,357,355,351,351,350,349,348,347, 346,346,345,343,340,339,338,336,335,334,334,334,334,331,326,325, 325,324,320,320,320,319,319,317,317,317,317,314,313,313,312,309, 308,308,307,306,305,301,300,300,298,295,295,293,291,289,288,287, 286,286,286,285,284,283,283,281,279,279,278,278,278,278,277,276, 276,276,275,275,275,275,275,275,275,274,273,271,271,271,270,270, 270,270,270,269,269,269,269,268,268,267,267,267,267,266,266,266, 265,264,264,264,264,263,263,263,263,263,262,262,262,261,261,261, 260,260,260,260,259,259,259,258,258,258,257,257,257,256,256,255, 255,255,255,254,254,254,254,253,252,252,252,252,252,252,251,251, 251,250,250,250,250,250,250,250,250 }; const int t249_09[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 494,491,491,488,487,482,480,478,477,476,474,471,470,470,470,469, 466,463,460,460,460,459,458,458,457,455,451,449,446,446,444,440, 440,438,438,438,437,436,436,435,434,427,427,426,425,424,424,419, 417,417,415,414,411,411,411,400,398,397,396,394,388,388,386,384, 382,381,380,379,378,377,377,376,375,372,370,369,369,369,366,365, 365,364,364,362,361,357,356,356,355,353,352,350,349,345,343,341, 340,340,339,338,337,335,333,332,329,329,328,327,326,324,323,319, 318,317,315,314,312,312,312,309,308,307,307,305,305,303,303,303, 302,302,302,301,299,298,297,297,296,295,295,295,294,294,292,292, 291,291,291,290,289,289,289,289,288,287,287,286,285,283,282,282, 281,280,280,280,279,279,275,275,275,275,275,274,274,274,274,274, 273,273,273,273,271,271,271,270,270,270,270,269,269,269,269,268, 268,268,267,267,267,266,266,264,264,264,264,263,263,263,262,262, 262,262,261,261,260,260,260,260,259,259,259,258,258,258,257,257, 257,257,256,256,256,255,255,255,255,255,255,253,252,252,252,252, 252,252,251,251,251,250,250,250,250 }; const int t249_10[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 499,494,493,492,492,489,488,487,486,485,485,483,481,481,480,477, 477,477,475,475,474,473,472,471,471,465,461,461,461,459,459,458, 457,455,452,450,449,448,445,443,441,440,437,436,436,434,424,422, 418,416,415,410,409,408,405,402,400,399,398,398,397,396,395,393, 393,390,389,389,385,383,383,377,377,374,374,374,373,371,366,366, 365,363,362,362,360,359,358,357,354,352,352,352,350,349,348,347, 345,339,330,329,326,326,324,324,323,321,319,318,315,313,313,312, 310,309,308,307,305,305,305,304,303,303,302,302,301,300,300,299, 296,296,296,295,294,294,294,293,292,292,291,290,290,289,288,288, 287,287,287,284,284,284,281,281,280,280,279,279,279,279,278,277, 277,276,275,275,275,274,274,274,272,272,271,271,270,269,269,269, 269,268,267,267,267,266,266,266,265,265,265,265,265,264,264,264, 264,263,263,263,263,262,261,261,261,261,261,261,261,260,260,260, 260,260,260,260,259,258,258,258,257,257,257,257,256,255,255,255, 255,254,254,254,254,253,253,252,252,252,251,251,251,251,251,251, 251,250,250,250,250,250,250,250,250 }; const int t249_11[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 497,495,493,489,488,486,483,482,476,476,474,473,473,472,467,466, 466,464,462,461,459,456,455,455,454,453,451,451,450,449,449,444, 442,437,433,433,432,428,426,424,424,423,423,422,420,420,417,414, 414,413,412,411,410,410,406,406,405,404,403,403,401,399,397,396, 395,394,392,391,386,384,382,382,380,378,378,374,372,364,362,362, 361,360,359,359,358,358,356,356,356,353,353,352,346,345,342,342, 340,340,338,334,332,331,330,329,326,326,325,324,324,321,320,320, 319,318,318,317,316,316,316,314,314,313,311,309,307,307,306,305, 305,305,303,302,300,299,296,296,295,294,294,294,294,294,293,292, 291,290,290,289,289,285,285,284,283,283,282,282,281,281,281,280, 280,280,280,280,279,278,278,278,276,275,275,275,275,274,274,274, 274,274,273,273,272,272,271,271,270,270,270,269,269,268,268,266, 266,265,265,265,265,264,264,264,264,262,261,261,261,261,261,260, 260,260,259,258,257,257,257,257,257,256,256,256,256,256,255,255, 255,255,255,255,255,255,255,255,255,254,253,253,253,253,253,253, 253,252,252,252,252,251,251,251,250 }; const int t249_12[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 494,493,491,489,488,486,481,478,478,474,473,472,471,469,469,468, 459,457,456,455,455,453,449,448,446,445,442,439,438,438,436,433, 433,432,431,431,427,425,425,421,418,418,414,414,412,409,409,407, 403,401,397,396,391,386,385,384,384,384,381,380,380,378,378,377, 376,375,373,372,372,372,372,370,369,368,366,366,366,363,363,363, 363,362,361,360,360,360,358,357,356,355,355,354,353,353,353,352, 352,351,348,347,346,346,345,345,344,342,339,339,337,336,335,334, 334,332,332,331,328,328,325,324,318,318,317,316,316,313,313,312, 311,310,308,306,305,304,302,301,301,300,298,298,297,297,296,296, 296,295,295,295,295,294,294,292,292,291,290,289,288,288,288,288, 287,286,280,280,279,279,278,278,278,277,277,277,276,276,276,276, 276,275,275,275,275,274,274,272,272,271,271,271,271,270,270,270, 269,269,269,269,267,267,267,266,265,264,263,262,262,261,261,261, 260,260,260,259,259,258,258,257,257,257,257,257,256,256,256,256, 256,256,256,256,255,254,254,254,254,254,253,253,253,253,252,252, 251,251,251,250,250,250,250,250,250 }; const int t249_13[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 495,493,492,492,492,490,489,488,487,487,486,484,482,481,480,479, 476,476,472,470,467,467,465,459,459,458,457,456,456,455,451,449, 447,441,441,439,437,437,436,434,434,432,418,416,415,414,413,412, 410,410,408,406,406,404,404,402,400,399,399,397,395,393,393,393, 387,387,386,385,384,382,382,381,380,380,379,377,377,372,372,371, 368,367,363,363,361,360,360,358,357,356,356,355,354,353,352,350, 348,345,340,338,337,335,334,331,330,329,328,326,325,324,323,322, 321,320,318,318,315,315,312,310,310,310,310,308,306,305,304,302, 302,302,302,299,296,295,294,293,293,293,292,292,291,291,291,290, 290,290,290,289,288,286,286,286,284,282,282,281,281,280,280,279, 279,278,277,276,276,274,274,273,273,272,272,271,271,270,267,267, 266,266,266,266,266,266,265,265,265,264,263,263,263,263,263,262, 262,262,262,262,261,261,260,260,260,259,259,258,258,258,258,258, 257,257,257,257,256,256,256,256,256,256,256,255,255,254,254,254, 254,253,253,253,253,253,252,252,252,252,252,252,252,252,251,251, 251,251,250,250,250,250,250,250,250 }; const int t249_14[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 498,495,495,493,487,485,484,484,483,479,476,472,469,464,464,463, 460,456,453,449,449,448,445,442,440,437,433,432,430,430,428,427, 426,425,424,423,423,423,422,419,417,415,415,414,413,410,407,406, 403,402,397,397,393,391,391,387,384,384,383,382,381,380,379,379, 379,378,378,378,376,376,375,375,375,374,372,372,367,366,365,363, 361,361,360,358,358,358,356,356,355,355,354,352,352,351,350,350, 350,349,347,345,344,343,342,339,339,339,335,332,332,331,330,329, 329,328,327,327,326,326,325,324,321,318,314,314,314,311,311,310, 309,309,308,308,308,306,305,305,304,303,303,302,302,301,300,299, 299,297,297,295,294,293,293,293,291,290,290,289,288,287,287,285, 285,284,284,283,283,282,282,281,281,280,280,280,279,279,279,278, 276,276,275,275,275,275,274,274,273,273,272,272,271,270,269,269, 268,268,267,267,266,266,266,266,264,264,264,264,263,263,263,262, 262,261,260,260,260,260,260,260,260,260,259,259,259,259,258,257, 257,257,257,257,256,256,256,256,256,255,255,254,254,254,253,252, 252,252,251,251,251,251,251,250,250 }; const int t249_15[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 499,496,496,495,492,489,488,487,484,480,479,477,476,476,476,475, 475,473,469,467,465,463,463,459,458,456,451,451,449,447,446,444, 438,438,434,433,432,431,431,422,420,418,417,416,416,415,415,414, 413,410,408,406,405,405,401,397,392,391,390,390,389,386,385,384, 384,383,383,382,382,382,380,379,378,377,376,374,374,374,369,368, 363,362,362,360,360,357,356,356,356,356,353,349,348,347,347,347, 341,338,336,335,335,334,334,334,330,329,326,326,325,324,324,323, 323,323,321,319,316,315,313,313,313,312,312,310,310,309,309,307, 304,304,303,302,301,300,300,299,299,298,297,296,295,295,294,294, 294,292,291,291,291,290,289,289,287,286,285,283,283,281,281,280, 279,278,278,278,277,277,276,276,276,275,275,274,274,274,273,273, 273,272,271,271,271,270,270,270,269,269,269,269,268,268,268,268, 267,267,266,265,265,264,263,262,262,262,262,261,261,261,260,259, 259,259,259,258,257,257,257,257,257,256,256,256,256,256,255,255, 255,255,255,254,254,254,254,253,252,252,252,252,251,251,250,250, 250,250,250,250,250,250,250,250,250 }; const int t249_16[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 498,496,495,495,493,490,487,482,481,480,477,476,476,473,471,470, 467,467,466,463,461,460,457,454,452,452,448,448,447,446,445,442, 441,439,438,437,437,435,434,432,432,431,430,429,425,424,420,419, 417,416,414,414,414,412,411,411,409,409,404,403,397,395,394,392, 392,390,389,389,385,382,382,382,382,381,381,380,380,379,378,377, 376,365,365,362,361,361,360,357,356,354,352,352,351,343,342,341, 341,337,336,333,332,331,330,329,328,324,324,321,318,317,317,316, 312,311,310,309,308,308,307,304,304,304,303,303,302,301,300,298, 298,298,297,296,296,295,294,294,294,294,294,293,293,293,291,290, 290,290,288,287,287,287,287,286,285,285,285,284,283,282,281,280, 280,279,279,277,277,277,276,276,276,276,275,274,274,273,273,273, 273,272,271,271,271,269,269,269,268,267,267,267,267,266,266,266, 265,264,264,264,264,263,263,263,263,263,262,261,261,261,261,260, 260,259,259,259,258,258,258,258,258,258,257,257,256,256,256,256, 255,255,254,254,254,254,254,254,254,253,253,253,253,252,252,252, 251,251,251,250,250,250,250,250,250 }; const int t249_17[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 498,494,493,492,492,490,489,487,484,482,480,477,472,471,470,468, 465,464,462,460,460,456,454,443,442,441,440,436,436,435,435,435, 431,427,427,426,424,417,417,416,415,415,412,407,402,402,402,400, 399,398,398,394,390,386,386,385,385,385,384,381,380,379,378,378, 377,377,376,375,374,372,372,368,367,366,366,366,366,365,365,363, 362,362,361,359,359,358,358,357,357,355,355,354,353,352,352,352, 352,352,350,349,349,347,343,342,341,340,339,336,335,333,332,331, 330,328,327,326,326,325,324,324,323,319,317,316,315,314,313,312, 311,309,309,309,309,308,306,305,303,302,301,301,300,297,297,296, 296,296,296,295,295,292,291,291,290,290,289,288,288,288,287,286, 285,285,283,282,282,282,281,281,280,279,278,277,277,277,276,276, 275,275,275,275,274,274,274,273,273,271,269,269,268,268,268,268, 268,268,266,264,264,263,263,263,263,263,262,262,261,261,261,261, 261,260,260,260,260,260,260,260,259,259,258,258,258,258,258,257, 257,257,256,256,256,256,256,255,255,254,254,254,253,253,252,252, 252,251,251,250,250,250,250,250,250 }; const int t249_18[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 499,495,492,491,491,490,490,489,488,487,486,486,484,484,483,483, 480,476,469,469,466,466,459,458,457,450,449,448,445,442,440,440, 439,437,436,435,432,431,430,430,426,426,424,422,414,411,410,408, 407,407,402,401,399,396,396,395,394,391,391,388,386,384,384,384, 384,381,374,374,372,372,371,371,370,369,368,367,367,365,365,363, 363,362,362,360,360,358,357,357,356,356,355,355,353,352,352,352, 351,351,344,343,342,342,340,338,337,336,334,332,330,330,329,329, 323,322,321,320,319,317,315,313,310,310,309,307,306,306,306,306, 305,305,303,303,303,302,301,300,299,297,297,296,294,294,293,293, 293,292,292,290,289,288,288,287,287,287,286,285,285,283,283,282, 281,281,281,280,279,279,278,278,278,277,277,276,276,276,273,272, 272,271,270,268,268,268,268,267,267,267,267,266,265,265,264,264, 264,263,263,263,263,262,262,262,262,260,260,260,259,259,259,259, 258,258,258,258,258,258,258,257,257,257,257,256,256,256,256,256, 255,255,255,254,254,253,253,253,253,252,251,251,251,251,251,251, 251,251,251,250,250,250,250,250,250 }; const int t249_19[] = { // Capacity 1000, // Number of items 249, // Size of items (sorted) 499,498,496,496,493,492,489,488,488,487,487,485,484,484,484,482, 478,476,475,474,472,471,470,469,469,468,468,467,467,466,466,464, 464,462,460,459,458,457,454,452,450,448,446,445,442,442,442,441, 439,434,432,427,427,427,425,424,423,420,419,419,418,417,417,413, 410,409,406,405,405,404,403,401,396,389,378,377,377,370,366,363, 361,356,353,353,353,350,347,342,341,339,337,335,332,331,326,326, 325,324,323,322,320,320,318,318,318,316,315,314,313,313,312,312, 309,308,306,305,305,303,299,299,298,296,296,296,293,291,291,290, 289,289,288,287,286,285,284,284,284,283,282,282,281,280,280,280, 280,279,278,278,278,277,277,277,276,275,275,274,274,274,273,273, 273,272,271,271,271,271,271,271,270,270,270,270,270,269,269,268, 268,267,267,266,266,264,264,264,263,263,263,263,262,262,261,261, 261,261,260,260,260,260,260,260,259,259,259,259,258,258,258,257, 257,256,256,256,256,256,256,256,255,255,255,255,255,254,254,254, 254,253,253,253,253,253,252,252,252,252,252,252,251,251,251,251, 251,251,251,250,250,250,250,250,250 }; const int t501_00[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 498,498,498,497,497,497,496,496,495,495,495,493,493,492,491,491, 490,490,488,488,487,487,485,485,485,485,484,483,481,480,480,480, 479,479,478,478,478,475,475,474,473,473,472,471,470,469,467,467, 466,465,464,463,462,460,459,457,456,456,456,455,451,450,447,446, 446,446,445,445,445,445,444,443,442,441,441,439,437,437,434,434, 433,433,430,426,426,425,425,425,423,422,421,421,420,419,419,419, 418,418,418,418,417,417,415,414,413,412,410,410,407,406,406,405, 404,402,401,400,399,398,397,395,395,394,394,393,393,392,392,392, 392,390,386,385,383,382,381,381,381,381,379,377,377,376,376,375, 375,375,373,372,372,370,370,369,369,369,367,367,366,366,366,366, 366,365,364,363,363,363,362,362,361,359,359,357,357,357,356,356, 356,356,355,355,354,354,352,352,351,351,350,350,350,350,350,349, 347,347,347,347,346,346,344,344,343,343,342,342,340,340,340,340, 339,338,337,336,334,333,333,333,333,331,331,330,329,329,326,325, 324,324,323,321,320,320,318,318,318,317,315,314,314,313,313,312, 312,310,308,308,307,307,307,306,305,303,302,301,301,301,299,299, 299,298,298,298,298,298,297,297,296,296,295,295,294,294,294,294, 293,293,292,292,291,291,291,291,290,290,289,288,288,287,287,287, 287,287,287,285,285,285,285,284,284,283,283,282,282,282,282,282, 281,281,281,280,280,280,280,278,277,276,276,276,276,275,275,275, 275,275,275,275,274,274,274,274,274,274,274,274,274,273,273,273, 273,273,272,272,272,272,272,271,271,271,271,271,271,271,271,270, 270,270,269,269,269,269,269,269,269,268,268,267,267,267,267,267, 267,266,266,265,265,265,264,264,264,264,263,263,263,263,263,262, 262,262,262,262,262,261,261,261,260,260,260,260,259,259,259,259, 259,259,259,259,259,259,259,259,259,258,258,258,258,258,258,258, 258,258,258,258,257,257,257,256,256,256,256,256,255,255,255,255, 255,255,255,255,255,255,254,254,254,254,254,254,254,254,254,254, 254,254,254,253,253,253,253,253,253,253,253,253,253,253,253,253, 253,252,252,252,252,252,252,252,252,252,252,252,252,251,251,251, 251,251,251,251,251,251,250,250,250,250,250,250,250,250,250,250, 250,250,250,250,250 }; const int t501_01[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 498,496,495,494,494,493,491,490,490,488,488,488,488,487,486,486, 485,485,485,483,482,482,482,481,477,476,476,476,475,475,475,475, 474,474,472,469,469,468,467,467,466,465,464,463,462,462,461,461, 461,460,459,458,457,456,455,455,455,453,453,452,451,451,451,449, 449,448,447,447,445,444,443,443,443,442,442,440,440,440,437,435, 435,435,434,434,433,432,432,431,428,428,426,426,426,424,424,424, 424,424,424,423,422,422,419,419,417,417,416,415,414,413,413,411, 411,411,407,407,407,407,407,406,405,404,404,404,401,398,398,397, 396,396,395,393,392,392,391,390,389,387,386,386,386,385,385,384, 383,378,374,374,373,371,371,370,370,369,367,366,365,364,362,361, 360,360,360,360,360,360,359,359,359,359,358,357,357,356,355,354, 353,353,353,353,352,352,351,351,350,350,347,345,341,340,339,337, 336,335,334,332,331,331,331,330,329,329,329,327,327,326,326,325, 324,323,323,323,322,321,321,321,321,320,320,319,319,319,318,316, 316,315,314,314,313,312,312,312,312,310,309,307,307,307,307,306, 305,305,303,303,303,302,302,302,302,301,301,300,300,299,299,299, 298,298,298,298,297,297,296,296,296,296,296,296,296,295,294,293, 293,292,291,291,291,290,290,289,289,289,288,288,287,287,286,286, 286,286,286,286,286,286,285,285,285,285,284,284,284,284,284,283, 283,283,282,282,282,282,282,281,281,281,281,281,280,280,280,280, 280,279,279,279,279,279,279,278,278,278,278,278,278,277,277,277, 277,276,276,276,276,276,275,275,274,274,274,274,273,273,273,272, 272,272,272,272,272,271,271,271,271,271,271,271,271,270,270,270, 270,270,269,269,269,269,268,267,267,267,267,267,267,267,266,266, 266,266,265,265,264,264,264,264,264,264,264,264,264,264,264,263, 263,263,262,262,262,262,262,262,262,261,261,261,261,261,261,261, 261,261,261,261,260,260,260,260,260,259,258,258,258,258,258,258, 258,258,258,257,257,257,257,257,257,257,257,257,256,256,256,255, 255,255,255,255,255,255,255,254,254,254,254,254,254,254,254,254, 254,253,253,253,253,253,253,252,252,252,252,252,252,252,252,252, 252,252,252,252,252,251,251,251,251,251,251,251,251,251,251,251, 250,250,250,250,250 }; const int t501_02[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 499,498,493,493,491,490,488,486,486,484,482,480,478,478,477,477, 476,475,473,472,472,472,472,471,470,468,464,464,464,464,462,461, 460,458,458,457,457,456,456,455,455,453,453,452,452,451,451,449, 448,447,447,447,446,445,443,443,442,442,442,442,441,441,441,438, 437,437,434,434,434,432,432,432,431,430,430,429,427,426,426,425, 425,424,423,419,418,418,417,415,415,412,412,412,412,411,410,410, 408,406,406,406,406,405,405,404,401,401,399,397,396,396,394,394, 394,393,393,393,392,392,392,391,391,389,389,389,387,385,385,383, 383,382,382,380,378,378,378,377,376,376,375,375,375,374,374,374, 373,373,373,373,372,371,370,370,369,368,368,368,367,367,367,366, 364,363,362,362,362,361,361,360,360,360,359,358,358,358,357,356, 356,355,355,355,355,355,354,354,353,353,353,353,353,352,352,351, 351,351,351,351,350,350,349,347,344,344,344,343,341,340,339,339, 338,338,338,335,333,333,332,331,331,330,329,327,327,325,325,325, 325,325,323,323,322,322,322,321,321,321,320,319,319,317,317,317, 316,316,314,313,312,312,311,310,309,309,309,309,308,308,307,307, 307,306,306,306,305,304,304,303,302,301,300,300,300,299,299,298, 298,297,297,297,297,295,295,295,295,295,294,294,294,294,293,293, 293,293,292,292,292,291,291,291,291,291,290,290,290,290,289,288, 288,287,287,287,287,287,287,287,286,286,286,286,285,285,285,285, 284,284,284,283,283,283,282,282,282,282,282,282,281,281,281,280, 280,280,280,279,279,279,279,279,278,278,278,278,277,277,277,276, 276,276,276,276,276,276,275,275,275,275,275,275,275,274,273,273, 273,273,273,273,272,272,272,272,271,271,271,271,271,271,270,270, 270,270,270,269,269,269,269,269,269,269,269,268,268,267,267,267, 266,266,266,266,266,266,266,266,265,265,265,264,263,263,263,263, 263,263,263,262,262,262,262,262,262,261,261,261,261,261,261,260, 260,259,259,259,259,259,259,259,259,259,259,259,259,258,258,258, 258,258,258,258,258,257,257,257,257,257,256,256,256,256,256,256, 256,255,255,255,255,255,255,254,254,254,253,253,253,253,253,253, 253,253,252,252,252,252,252,252,251,251,251,251,251,251,251,250, 250,250,250,250,250 }; const int t501_03[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 499,498,497,497,495,494,494,492,489,489,487,486,485,480,479,479, 477,476,475,475,475,474,473,473,470,469,468,466,466,466,466,465, 465,463,463,462,462,460,458,457,455,454,454,453,452,452,450,449, 448,447,446,445,444,443,443,443,441,441,440,440,440,439,438,438, 438,437,437,435,435,435,435,434,434,434,432,429,428,428,428,426, 426,425,423,423,421,419,419,418,417,417,416,416,414,413,412,410, 410,410,409,408,408,408,408,407,407,402,400,399,398,397,396,395, 394,392,392,392,392,391,391,387,387,386,384,384,383,383,382,382, 382,382,380,379,378,378,378,377,377,376,376,376,376,375,375,374, 373,373,373,371,371,371,370,369,369,369,369,369,368,368,367,367, 365,364,361,360,360,360,360,359,359,359,359,358,357,357,356,356, 355,355,355,354,353,353,353,353,352,352,351,350,350,349,349,348, 346,346,345,345,342,341,340,340,338,337,336,335,335,335,334,333, 332,331,330,330,329,328,327,326,326,326,326,326,325,325,325,325, 325,324,323,322,322,322,322,322,322,320,319,319,318,318,318,316, 316,315,315,314,313,313,312,312,312,311,311,309,308,307,307,306, 306,305,305,305,305,304,304,303,303,303,302,302,302,302,302,301, 301,301,301,300,300,299,299,299,299,299,298,297,297,297,296,296, 296,295,295,295,295,295,294,293,293,293,293,293,293,292,291,291, 291,291,290,289,289,289,288,288,287,287,287,287,287,287,287,287, 286,286,286,286,285,284,284,284,283,283,283,283,282,282,282,281, 281,281,281,281,280,280,279,279,278,278,278,277,277,277,277,277, 277,277,276,275,275,274,274,274,273,273,273,273,273,273,272,272, 272,272,272,272,272,271,271,271,271,270,270,270,270,269,269,269, 268,268,268,268,267,267,267,267,267,267,267,266,266,266,266,266, 265,265,265,265,265,264,264,264,264,263,263,263,263,263,262,262, 262,262,261,261,261,261,261,261,261,260,260,260,260,259,259,259, 259,259,259,258,258,258,258,258,258,258,257,257,257,257,257,257, 257,256,256,256,255,255,255,255,255,255,255,255,255,254,254,254, 254,254,254,254,254,254,254,253,253,253,253,253,253,253,252,252, 252,252,252,252,252,252,252,252,251,251,251,251,251,250,250,250, 250,250,250,250,250 }; const int t501_04[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 499,499,498,498,495,493,493,491,490,488,487,487,486,486,486,486, 485,485,485,484,483,481,479,479,477,474,473,471,471,470,470,466, 466,465,465,465,463,463,462,461,461,460,460,459,456,456,455,455, 454,454,453,452,450,449,448,447,447,446,444,442,440,439,438,436, 435,432,430,429,428,428,428,428,427,426,426,425,425,425,424,423, 422,422,422,422,421,420,418,417,417,415,412,412,410,410,409,409, 408,408,406,404,403,403,403,401,401,401,399,399,398,398,397,397, 397,396,395,395,395,394,394,394,393,392,391,390,389,387,385,385, 384,383,382,382,382,381,381,380,380,380,380,379,377,377,376,375, 375,375,375,374,372,372,371,371,371,371,370,370,370,369,369,368, 368,366,366,365,365,364,363,363,361,360,360,360,360,359,359,357, 356,356,354,353,353,352,352,351,351,351,350,350,346,346,344,343, 343,343,342,342,342,341,341,341,341,340,340,340,338,338,337,335, 335,335,333,332,331,331,331,330,330,330,330,330,329,328,326,326, 326,326,326,325,325,324,323,323,320,320,320,319,319,319,318,318, 318,318,317,316,316,316,316,315,315,314,313,313,312,312,312,312, 311,310,309,308,307,307,306,306,306,304,302,302,301,300,299,298, 298,298,298,297,296,296,296,295,295,294,294,294,294,293,293,292, 292,291,291,291,290,290,289,289,289,288,288,288,288,288,287,286, 286,285,285,285,285,285,284,284,284,283,283,283,283,283,283,283, 282,282,282,282,282,282,281,281,281,281,280,280,280,280,280,280, 280,280,279,279,278,278,278,277,277,277,276,276,276,275,275,275, 274,274,274,274,274,274,274,273,273,273,272,272,270,270,270,269, 269,269,269,269,268,268,268,268,268,267,267,267,267,267,267,266, 266,266,266,266,266,265,265,265,265,265,264,264,264,264,264,264, 264,264,264,264,263,263,263,263,263,263,263,262,261,261,261,261, 261,261,261,260,260,260,260,260,259,259,259,259,259,258,258,258, 258,258,258,258,258,257,257,257,257,257,257,257,256,256,256,256, 256,256,256,256,256,255,255,255,255,255,255,255,255,254,254,254, 254,254,254,254,253,253,253,253,253,253,253,253,253,253,253,252, 252,252,252,252,252,252,252,252,251,251,251,251,251,251,250,250, 250,250,250,250,250 }; const int t501_05[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 498,498,498,496,495,491,490,490,489,489,488,488,486,485,485,485, 484,484,481,480,479,479,478,478,476,476,476,474,474,473,473,473, 472,472,471,470,468,467,465,465,464,464,462,462,461,461,461,460, 460,460,458,457,457,456,454,454,453,452,452,452,450,449,449,448, 446,444,444,443,443,442,441,440,440,439,439,438,437,437,436,434, 434,433,431,430,430,429,429,429,429,427,427,426,426,424,424,423, 420,417,417,416,414,413,412,412,411,408,408,408,407,405,404,404, 403,402,401,400,398,398,398,395,395,394,394,393,392,390,389,388, 387,387,384,383,382,382,381,381,381,381,381,380,379,378,377,376, 375,375,375,374,373,372,369,369,369,367,367,367,367,367,366,366, 365,365,363,363,362,362,360,359,358,358,357,357,356,356,356,355, 355,354,354,354,354,353,352,351,351,350,350,350,349,348,347,347, 345,345,344,343,341,341,341,338,335,335,334,334,334,334,333,330, 329,329,329,328,328,328,327,324,323,322,322,322,321,320,320,320, 319,319,318,318,316,315,315,314,314,314,313,312,311,310,310,310, 310,309,308,308,308,307,307,307,306,305,305,305,305,303,303,301, 301,301,300,300,300,299,299,298,298,297,297,297,296,296,296,295, 295,295,295,295,295,294,294,294,293,293,293,292,292,292,291,291, 291,289,289,289,288,288,288,287,287,287,287,287,286,286,286,286, 285,285,284,284,284,284,284,283,282,282,282,281,281,281,280,280, 279,279,279,279,279,278,278,278,278,278,278,278,277,277,277,277, 277,276,276,276,276,275,275,275,275,275,275,275,274,274,274,274, 274,274,273,273,273,273,273,273,272,272,272,271,271,271,271,271, 271,271,270,270,270,269,269,269,268,268,268,268,267,266,266,265, 265,265,265,265,264,264,264,264,263,263,263,263,263,262,262,262, 262,262,262,262,262,262,262,262,262,262,261,261,261,261,260,260, 260,259,259,259,259,259,259,258,258,258,258,258,258,258,257,257, 257,257,257,257,257,257,257,257,256,256,256,256,255,255,255,255, 255,255,255,255,255,255,254,254,254,254,254,254,254,254,253,253, 253,253,253,253,253,253,253,253,253,252,252,252,252,252,252,252, 252,252,251,251,251,251,250,250,250,250,250,250,250,250,250,250, 250,250,250,250,250 }; const int t501_06[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 499,498,498,497,497,494,494,493,491,490,490,487,487,486,486,484, 482,480,480,479,479,478,477,476,474,474,473,473,470,468,468,468, 467,467,467,467,466,465,465,465,464,459,458,457,456,456,455,454, 452,452,451,448,448,448,447,445,443,441,440,440,440,439,435,435, 434,430,430,429,428,427,427,427,427,426,426,426,425,424,423,421, 421,420,419,418,417,416,415,414,414,413,413,413,410,409,409,408, 407,405,405,404,404,404,403,402,401,399,399,399,398,397,397,396, 395,394,393,393,393,392,390,389,389,388,388,388,387,386,384,383, 382,382,381,381,380,378,378,377,376,376,376,376,375,375,375,374, 374,373,372,370,369,368,368,368,367,367,365,364,364,364,364,364, 363,363,362,362,362,362,360,360,360,360,359,359,358,358,357,357, 356,356,355,354,353,353,352,352,352,352,352,350,349,349,346,345, 345,344,344,341,341,340,339,339,339,339,339,337,337,337,337,336, 336,334,334,334,332,331,330,329,329,327,326,326,326,325,325,324, 324,324,323,323,323,323,322,322,321,319,318,318,318,317,317,317, 316,314,314,314,314,313,313,313,312,312,312,311,311,310,310,309, 308,308,307,307,307,306,305,305,305,304,304,304,304,302,301,301, 301,301,301,300,300,300,300,300,300,299,299,298,298,298,298,298, 297,296,296,296,295,295,295,295,293,293,292,291,291,291,289,289, 289,288,288,288,288,287,287,287,287,286,286,286,285,285,285,283, 283,283,283,283,283,282,282,282,282,281,281,281,281,281,280,280, 280,279,279,279,279,279,279,279,278,278,278,278,278,278,277,277, 277,277,277,276,276,276,276,275,275,275,274,274,274,274,274,274, 274,274,274,274,273,273,273,272,272,271,271,271,271,271,270,270, 269,269,268,268,267,267,267,267,266,266,266,265,265,265,265,265, 265,265,264,264,264,264,264,263,263,263,263,262,262,262,262,262, 262,261,261,261,261,261,261,261,260,260,260,260,259,259,259,259, 258,258,258,258,258,258,257,257,257,257,257,257,257,256,256,256, 256,256,256,255,255,255,254,254,254,254,253,253,253,253,253,253, 253,253,252,252,252,252,252,252,252,252,252,252,252,252,252,252, 251,251,251,251,251,251,251,251,251,251,250,250,250,250,250,250, 250,250,250,250,250 }; const int t501_07[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 499,499,497,495,494,494,493,493,492,492,491,489,487,486,484,484, 483,480,479,479,479,477,477,477,477,475,471,470,470,470,470,469, 467,467,466,466,466,465,465,465,465,463,462,461,460,458,457,456, 456,455,454,452,452,451,450,450,449,449,448,446,446,445,442,441, 438,437,437,435,434,433,433,433,431,431,431,430,430,429,429,428, 428,427,423,421,421,421,420,419,417,417,416,416,415,414,412,410, 409,408,408,408,407,407,405,404,404,403,403,402,400,399,397,397, 396,395,395,394,394,393,392,392,392,391,391,391,390,388,388,385, 384,383,382,382,381,380,378,376,376,376,375,375,374,374,374,372, 372,372,371,371,371,370,370,369,369,369,369,368,368,367,367,366, 366,366,364,364,364,363,361,361,361,360,360,359,359,357,357,357, 355,355,355,354,354,352,352,351,351,350,350,350,349,347,345,345, 345,344,344,344,343,343,343,343,341,340,340,340,340,337,336,335, 335,335,335,333,332,332,331,330,328,328,328,328,326,325,325,325, 324,324,322,320,319,318,318,318,317,317,317,316,316,314,312,312, 312,311,311,311,310,309,309,309,309,309,308,308,308,307,307,306, 306,306,306,305,305,304,304,303,303,302,301,301,301,300,300,300, 300,300,300,299,299,298,297,296,296,296,295,295,295,295,295,294, 293,293,291,291,291,291,290,290,290,290,290,290,290,289,289,289, 289,289,288,288,288,287,287,287,286,286,286,286,285,284,284,284, 284,283,283,282,282,282,281,281,280,280,280,280,280,280,279,279, 279,278,278,277,277,277,276,276,276,276,276,274,274,274,274,274, 273,273,273,273,273,273,272,272,272,272,272,272,271,271,271,271, 271,271,271,271,270,270,269,269,269,269,268,268,268,268,268,268, 267,267,267,267,266,266,266,266,266,266,266,266,265,265,265,264, 264,264,263,263,263,263,263,263,263,263,263,263,262,262,262,262, 262,261,261,260,260,260,260,260,260,259,259,259,259,259,258,258, 258,258,257,257,257,257,257,257,257,257,256,256,256,256,256,256, 256,256,256,255,255,255,255,255,255,254,254,253,253,253,253,253, 253,253,253,253,253,252,252,252,251,251,251,251,251,251,251,251, 251,251,251,251,251,251,250,250,250,250,250,250,250,250,250,250, 250,250,250,250,250 }; const int t501_08[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 499,498,497,496,496,495,495,494,493,492,491,491,491,491,488,486, 484,482,481,480,479,477,477,476,476,473,473,470,469,468,466,465, 459,458,458,457,456,456,455,454,453,453,453,452,451,451,450,450, 450,448,447,446,446,446,445,445,445,445,442,441,441,440,439,438, 437,436,435,434,432,431,431,431,430,429,429,429,429,428,426,426, 426,426,426,425,425,424,423,422,422,422,421,421,420,419,419,417, 417,416,416,415,414,412,412,412,411,411,410,410,407,406,405,403, 401,400,399,398,396,395,395,395,394,393,392,392,392,390,389,386, 386,386,385,385,385,384,384,384,384,383,383,382,380,378,377,377, 376,376,376,376,375,373,372,371,370,370,368,365,364,364,364,364, 363,363,363,362,362,362,362,361,360,359,358,358,358,357,357,357, 357,356,355,354,354,354,354,353,352,351,351,351,351,351,350,350, 349,346,340,340,334,334,332,332,331,331,330,330,330,329,329,329, 328,328,328,327,327,326,325,325,323,323,322,322,321,321,320,320, 320,320,318,318,318,318,318,317,317,316,315,315,315,315,315,315, 314,314,313,313,312,312,311,311,311,310,309,309,308,307,307,306, 306,306,305,304,304,304,303,303,303,303,302,302,301,301,301,301, 301,300,299,297,297,297,296,296,295,295,294,294,294,293,293,293, 293,293,292,292,292,292,292,292,292,291,291,291,291,290,290,290, 290,290,288,288,288,287,286,286,286,285,285,285,284,284,284,284, 284,283,283,283,282,282,282,282,281,281,281,281,280,280,280,279, 279,279,279,279,278,278,278,278,277,277,277,276,276,276,276,276, 276,275,275,275,274,274,274,274,274,273,273,273,273,273,273,272, 272,271,271,271,270,270,270,270,270,270,269,269,269,269,268,268, 267,267,267,267,267,267,267,267,266,266,266,266,266,266,266,265, 265,264,263,263,263,263,263,263,263,262,262,262,262,262,262,261, 261,261,261,261,261,260,260,260,260,260,259,259,259,259,259,259, 259,259,259,258,258,258,258,258,257,257,257,257,257,257,256,256, 256,256,255,255,255,255,255,254,254,254,254,254,254,254,254,253, 253,253,253,253,253,253,253,252,252,252,252,252,252,252,252,252, 251,251,251,251,251,251,251,251,251,250,250,250,250,250,250,250, 250,250,250,250,250 }; const int t501_09[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 499,498,498,495,495,495,493,492,491,490,490,489,487,486,484,483, 483,481,480,480,480,479,477,477,475,475,473,473,472,471,469,468, 467,467,465,465,464,464,464,464,463,462,461,461,460,459,459,458, 458,456,456,455,455,454,450,445,444,442,442,442,441,441,438,438, 437,437,437,436,436,435,434,432,432,431,431,430,430,428,425,425, 425,424,423,419,418,417,417,416,416,414,414,413,413,412,412,411, 409,409,407,406,406,406,404,402,402,402,401,401,396,396,395,393, 393,391,391,390,390,389,389,387,386,386,385,384,383,383,383,381, 381,381,381,379,379,378,378,378,378,376,376,375,374,374,373,372, 372,372,372,372,371,371,371,371,371,370,370,370,369,369,369,369, 368,368,367,367,366,366,365,365,364,364,362,362,361,360,360,360, 359,359,359,359,358,357,357,357,357,357,355,354,354,353,353,353, 351,351,351,351,351,350,347,345,343,342,341,339,338,337,337,337, 335,335,333,333,332,331,330,328,327,327,327,326,325,325,324,324, 324,323,323,323,322,320,319,318,318,318,318,317,317,317,317,315, 315,315,313,312,312,311,310,310,310,309,308,308,308,308,307,307, 306,306,306,305,305,305,303,303,302,302,302,301,301,301,300,300, 299,299,299,298,298,298,298,298,298,297,297,297,296,296,296,295, 294,294,294,292,292,292,291,291,290,290,290,290,289,289,289,288, 288,288,286,286,286,286,285,285,285,285,285,284,284,283,283,283, 283,283,283,282,281,280,280,280,279,278,278,278,278,277,277,277, 277,277,276,276,276,276,276,276,276,275,275,274,274,274,274,274, 273,273,273,272,272,272,271,271,271,271,270,270,270,270,270,270, 270,269,269,269,269,268,268,268,268,268,268,268,267,267,267,267, 267,266,266,266,266,266,266,266,265,265,265,265,265,264,264,264, 264,264,263,262,262,262,262,262,262,262,262,262,262,262,262,261, 261,261,261,261,261,260,260,260,260,259,259,259,259,259,258,258, 258,258,258,257,257,257,257,257,257,257,257,256,256,256,256,256, 256,256,256,256,256,256,256,256,255,255,255,255,255,254,254,254, 254,254,253,253,252,252,252,252,252,252,252,252,252,252,251,251, 251,251,251,251,251,251,251,251,251,251,251,250,250,250,250,250, 250,250,250,250,250 }; const int t501_10[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 498,498,497,495,495,495,494,493,493,492,488,487,487,486,486,485, 484,480,479,477,477,476,474,473,473,472,472,471,470,470,470,468, 466,465,465,465,464,463,461,460,459,457,457,457,457,457,456,456, 455,455,455,455,455,454,453,453,452,450,450,450,449,446,445,444, 444,444,443,443,441,439,438,438,437,437,436,435,434,433,433,429, 428,427,427,426,426,426,424,422,422,420,418,417,417,417,415,415, 413,412,410,410,409,407,407,406,399,398,395,395,394,394,393,391, 391,391,391,390,390,389,389,388,388,388,388,388,387,387,386,385, 384,381,381,380,380,380,379,379,379,378,378,377,377,377,375,375, 374,373,373,373,373,371,370,370,370,370,369,369,369,368,368,368, 368,368,368,368,367,366,365,364,363,361,361,360,359,358,358,358, 358,357,357,357,356,355,354,354,353,352,352,352,352,351,350,350, 350,350,349,348,348,348,346,346,345,345,341,340,339,339,338,338, 337,337,335,334,334,332,331,330,329,329,329,327,327,325,325,325, 325,325,324,324,322,321,320,320,318,318,318,317,317,317,315,315, 315,315,313,313,312,312,310,309,308,308,307,306,306,305,305,303, 302,302,302,302,300,300,300,299,299,299,298,298,298,298,298,297, 297,297,297,296,296,296,295,295,294,294,294,294,293,293,292,292, 292,291,291,291,290,290,290,290,290,290,289,288,288,288,288,288, 287,287,287,287,287,286,286,286,286,286,284,284,284,283,283,282, 282,282,282,281,281,280,280,280,279,279,279,278,278,278,277,276, 276,276,275,275,275,275,275,275,274,274,274,274,274,274,273,273, 273,272,272,272,272,272,272,271,271,270,270,270,269,269,269,269, 269,269,269,269,268,268,268,268,267,267,267,267,266,266,266,266, 266,266,266,266,266,266,265,265,265,265,265,265,265,264,264,264, 264,264,263,263,263,263,262,262,262,262,262,262,262,261,261,261, 261,261,261,261,260,260,260,259,259,259,259,259,258,258,258,258, 258,257,257,257,257,257,257,256,256,256,256,256,256,255,255,255, 255,255,255,255,255,255,254,254,254,254,254,254,254,253,253,253, 253,253,253,253,253,253,253,253,252,252,252,252,252,252,252,252, 251,251,251,251,251,251,251,251,250,250,250,250,250,250,250,250, 250,250,250,250,250 }; const int t501_11[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 499,498,498,496,495,492,491,490,490,488,488,485,485,483,483,480, 479,478,475,474,473,471,471,470,469,468,467,465,465,464,463,463, 462,462,461,459,459,458,457,455,454,454,454,453,453,452,451,451, 451,450,449,449,449,448,445,443,442,441,441,438,436,434,433,433, 433,432,431,430,429,429,428,426,426,423,423,422,420,419,419,418, 417,417,417,414,414,414,413,413,412,410,409,409,409,409,408,407, 404,401,400,399,399,398,398,397,397,396,395,394,394,393,392,391, 390,386,386,385,385,385,384,384,383,383,383,382,382,381,381,380, 380,379,379,379,378,378,378,377,377,376,376,375,374,374,374,373, 373,373,373,371,371,371,371,371,369,369,369,369,368,368,367,367, 367,366,365,365,364,364,363,362,362,362,361,360,360,360,360,360, 360,359,359,359,359,359,358,358,357,357,357,357,357,356,355,353, 352,352,352,352,351,351,350,350,347,346,346,345,345,345,342,341, 341,339,339,338,338,337,335,334,334,332,330,330,330,328,328,328, 326,326,326,326,325,325,324,323,322,322,321,320,320,320,320,320, 319,318,317,317,316,316,315,315,315,315,315,314,313,313,312,312, 312,310,309,309,307,307,305,303,303,302,302,302,301,301,300,300, 300,300,299,298,297,297,297,297,297,297,296,296,296,296,296,295, 293,292,292,291,291,291,291,291,291,290,290,289,289,289,289,289, 289,289,288,288,288,287,287,286,286,285,285,285,285,285,285,285, 285,284,284,284,284,283,283,283,282,282,282,282,282,281,281,280, 280,280,280,280,280,280,279,279,279,278,278,278,278,278,278,278, 278,278,277,277,276,276,276,275,275,275,275,275,275,274,274,274, 274,274,273,271,271,271,271,270,270,270,270,270,270,270,269,269, 269,269,269,268,268,268,268,268,267,267,267,267,267,267,267,267, 266,266,266,266,266,265,265,265,264,264,264,263,263,263,262,262, 262,262,262,262,261,261,261,261,261,261,260,260,260,259,259,259, 259,258,258,258,258,258,258,258,257,257,257,257,257,257,256,256, 256,256,256,256,255,255,255,255,255,255,255,255,255,254,254,254, 254,254,254,254,254,253,253,253,253,253,253,253,253,253,253,253, 252,252,252,252,252,252,252,252,251,251,251,251,251,251,250,250, 250,250,250,250,250 }; const int t501_12[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 499,498,495,494,492,491,491,490,490,489,489,488,486,486,485,484, 484,484,482,482,481,480,480,480,480,480,479,479,477,476,473,473, 472,472,471,471,470,470,469,468,468,468,468,467,467,467,466,466, 466,465,464,464,462,462,462,461,461,461,460,460,458,458,454,454, 453,453,452,452,451,449,448,446,446,445,443,442,441,441,440,437, 435,435,435,435,433,431,431,430,429,428,428,427,425,424,424,418, 416,416,415,415,414,412,412,411,411,410,407,406,406,406,405,404, 404,397,397,396,395,395,394,394,393,392,392,388,387,386,386,385, 384,383,382,381,379,379,379,378,377,377,376,375,375,374,374,374, 374,373,373,371,371,371,371,371,370,370,370,370,370,369,369,368, 367,366,365,364,363,363,363,362,362,361,361,360,360,357,357,356, 355,355,355,354,354,354,354,354,353,353,352,351,351,348,348,348, 346,346,345,345,344,344,344,344,344,343,342,341,341,341,340,339, 339,339,335,331,330,330,329,329,328,326,326,325,323,322,321,320, 320,319,319,319,319,319,318,318,318,318,316,315,315,315,314,314, 313,312,312,311,309,309,308,308,306,305,304,303,303,303,302,302, 302,302,300,298,298,297,297,297,296,296,296,295,294,294,294,293, 293,293,292,291,291,291,290,289,289,289,289,288,288,287,287,287, 287,287,287,286,285,285,285,285,284,284,283,283,283,283,282,282, 282,282,281,281,281,281,281,279,279,279,279,278,278,278,278,277, 277,277,277,276,276,276,276,276,276,276,276,275,275,275,274,274, 274,273,273,273,273,273,272,272,272,272,272,271,271,271,271,271, 270,270,269,269,269,269,269,269,268,268,267,267,267,267,267,266, 266,266,266,266,265,265,265,265,264,264,264,264,264,263,263,263, 263,263,263,263,262,262,262,262,262,262,262,262,262,262,261,261, 261,261,261,260,260,260,260,259,259,259,259,259,259,259,259,259, 259,258,258,258,258,258,258,258,258,258,258,258,257,257,257,257, 257,257,257,257,257,257,257,256,256,256,256,256,256,256,255,255, 255,255,255,255,255,254,254,254,254,254,254,254,253,253,253,253, 252,252,252,252,252,252,252,252,252,252,252,252,252,251,251,251, 251,251,251,251,251,251,251,251,251,250,250,250,250,250,250,250, 250,250,250,250,250 }; const int t501_13[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 499,498,495,495,495,493,493,492,492,491,491,491,490,489,485,483, 482,482,482,481,480,480,477,476,474,473,473,471,469,469,468,467, 466,465,465,465,465,464,463,463,462,462,459,458,457,456,456,455, 454,454,451,450,449,447,447,447,446,446,445,443,442,441,440,439, 439,437,436,434,434,434,432,431,431,430,429,428,428,428,427,427, 426,423,421,419,419,419,418,417,416,414,414,413,413,413,412,411, 411,411,410,407,406,405,405,404,403,402,400,400,399,397,396,393, 392,391,389,389,389,388,387,387,387,385,384,383,383,383,382,380, 379,379,378,377,377,377,376,376,376,376,375,375,374,373,372,372, 372,371,370,370,370,369,369,369,368,367,367,367,367,367,367,366, 366,366,365,365,365,365,364,364,363,363,363,362,362,361,361,359, 358,358,357,357,357,356,356,356,356,355,355,355,355,354,354,354, 353,353,353,352,351,351,351,350,350,350,349,346,341,340,340,337, 336,336,335,335,335,333,333,332,331,330,330,329,329,328,326,326, 325,325,324,324,324,323,322,322,320,317,316,316,316,315,315,314, 314,313,313,313,313,313,312,311,311,311,310,310,310,309,308,307, 307,306,306,305,303,303,303,303,302,302,302,301,301,300,299,299, 299,299,299,299,297,297,296,296,295,295,295,294,294,293,293,293, 292,292,291,291,291,291,289,289,289,289,289,288,288,288,287,287, 286,286,286,286,285,285,285,285,284,284,284,284,284,284,283,283, 283,283,283,282,282,281,281,281,280,280,279,279,279,278,278,278, 278,278,278,278,278,278,277,277,276,276,276,276,275,275,274,274, 273,273,273,273,273,273,272,272,272,272,272,272,272,271,271,271, 271,270,270,270,270,269,269,269,269,269,269,268,268,268,268,267, 267,266,266,266,266,265,265,265,265,265,264,264,264,264,263,263, 263,263,263,263,263,262,262,262,262,262,262,262,261,261,261,261, 261,261,261,261,260,260,260,260,260,260,259,259,259,259,258,258, 258,258,258,258,258,257,257,257,257,257,257,256,256,256,256,256, 256,256,256,255,255,255,255,255,255,255,254,254,254,254,254,254, 254,254,254,254,253,253,253,253,253,252,252,252,252,252,252,252, 252,252,252,252,252,251,251,251,251,251,251,251,250,250,250,250, 250,250,250,250,250 }; const int t501_14[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 499,498,497,496,495,495,494,493,491,490,490,490,489,488,487,486, 486,486,486,486,485,485,485,484,484,483,482,482,481,480,475,475, 475,474,470,470,467,467,466,463,462,461,461,459,458,458,457,456, 456,456,455,454,453,453,452,449,446,444,444,444,444,444,441,441, 439,438,438,437,436,435,435,433,432,432,431,430,429,428,428,427, 427,426,424,423,421,421,419,418,416,415,414,414,413,412,411,411, 411,410,410,410,408,408,407,405,405,405,404,402,401,400,399,399, 399,397,396,393,391,391,390,390,389,388,388,388,385,383,382,382, 381,381,379,378,377,376,376,375,374,374,374,373,372,372,371,369, 369,369,369,368,368,367,367,367,366,365,365,365,365,365,364,364, 364,363,362,362,361,361,360,360,360,360,359,359,359,358,357,357, 356,356,356,355,354,354,354,353,353,353,353,353,351,350,350,349, 348,347,347,347,346,345,344,343,343,343,343,343,343,342,341,341, 341,340,339,337,333,333,332,332,331,330,329,328,326,326,325,325, 324,322,322,321,320,320,320,320,319,317,317,317,317,316,316,315, 315,314,314,314,314,314,313,313,313,312,312,312,310,310,309,309, 308,307,307,307,306,306,305,305,304,304,303,303,303,302,301,301, 300,299,299,299,299,298,298,297,297,296,296,296,296,295,295,295, 294,294,294,293,293,292,292,292,291,291,290,290,290,289,289,288, 288,287,287,287,286,286,285,285,285,285,284,284,284,283,283,283, 282,282,281,281,281,280,280,280,280,280,279,279,279,279,278,278, 277,277,277,277,277,277,276,276,276,275,275,274,274,274,274,273, 273,273,272,272,272,272,272,272,271,271,270,270,269,269,269,268, 268,268,268,268,268,268,267,266,266,266,265,265,264,264,264,264, 264,264,264,264,264,263,263,263,263,262,262,262,262,262,262,261, 261,261,261,261,261,260,260,260,260,260,260,260,260,260,260,260, 259,259,259,259,258,258,258,258,258,258,257,257,257,257,257,257, 257,257,257,257,257,256,256,256,256,256,256,256,255,255,255,255, 255,255,255,255,254,254,254,254,254,254,254,253,253,253,253,253, 253,253,253,253,253,252,252,252,252,252,252,251,251,251,251,251, 251,251,251,251,251,251,250,250,250,250,250,250,250,250,250,250, 250,250,250,250,250 }; const int t501_15[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 499,499,498,496,496,494,492,492,491,487,483,481,481,480,480,480, 478,478,477,476,475,475,475,474,473,473,472,472,471,471,468,468, 467,466,466,466,465,464,463,462,461,461,460,459,459,458,457,456, 456,455,455,454,454,453,452,451,451,449,448,448,447,445,444,444, 442,441,440,440,440,440,438,438,437,437,434,432,432,431,427,427, 427,426,425,425,424,422,422,418,418,413,410,410,408,407,407,407, 407,406,405,404,403,400,399,397,397,396,396,395,395,394,393,393, 392,392,392,391,389,389,388,388,388,387,387,387,386,385,385,385, 383,382,381,381,380,379,379,378,378,378,377,376,376,376,376,376, 375,374,374,373,372,372,372,371,370,370,369,369,369,369,369,368, 368,367,365,365,364,364,364,364,364,363,362,361,360,359,358,358, 358,357,357,357,357,356,356,355,351,351,351,350,349,349,349,348, 348,347,347,347,346,346,344,343,342,340,340,340,339,337,337,336, 335,332,332,331,330,330,330,329,329,329,327,326,325,325,325,325, 324,324,323,323,323,322,321,321,320,319,319,318,318,318,318,316, 315,315,314,313,312,312,310,310,309,309,309,309,309,309,308,307, 306,306,305,303,303,302,302,301,301,300,300,298,298,298,297,296, 296,296,296,296,295,295,294,294,294,294,294,293,293,293,292,292, 291,291,291,291,290,290,290,290,290,289,289,289,289,289,289,288, 288,287,287,287,287,287,287,286,286,286,286,286,286,285,284,284, 283,283,282,282,281,280,280,280,279,279,279,279,279,279,278,278, 278,278,278,278,278,277,277,276,276,276,276,275,275,275,275,275, 275,274,274,274,274,274,273,273,273,273,272,272,272,272,272,271, 271,271,271,271,271,271,271,271,270,270,270,270,270,269,269,269, 269,269,269,269,269,268,268,268,268,268,267,267,267,267,266,266, 266,265,265,265,265,264,264,264,263,263,263,263,263,263,263,263, 262,262,261,261,261,261,260,260,259,259,259,259,259,259,258,258, 258,258,258,257,257,257,257,257,257,257,257,257,256,256,256,256, 256,255,255,255,255,255,255,254,254,254,254,254,254,254,253,253, 253,253,253,253,253,252,252,252,252,252,252,252,252,252,252,252, 252,251,251,251,251,251,251,251,251,250,250,250,250,250,250,250, 250,250,250,250,250 }; const int t501_16[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 499,498,497,497,497,496,496,495,495,493,491,491,490,489,487,486, 486,485,484,483,483,481,481,480,480,479,479,478,478,477,475,475, 475,473,471,470,470,468,467,465,463,462,462,462,461,461,460,459, 458,456,456,456,454,454,453,453,453,453,451,450,450,449,447,447, 446,443,442,442,442,441,440,437,436,435,433,431,429,429,428,426, 425,424,423,421,421,421,421,421,421,420,420,416,415,415,414,413, 413,412,407,405,405,404,403,403,402,401,401,400,398,398,397,396, 395,395,394,393,392,391,388,387,387,385,385,383,383,383,383,382, 382,382,381,381,380,379,379,379,379,379,375,375,374,374,373,373, 372,372,372,371,369,368,368,367,367,367,365,365,365,365,365,365, 364,364,364,364,363,363,362,362,361,361,361,361,361,361,361,360, 359,359,359,358,358,357,357,356,356,355,355,354,352,352,352,352, 351,350,348,347,347,345,343,342,340,340,339,338,337,337,337,336, 336,335,334,334,333,332,331,330,330,330,329,329,327,326,326,325, 324,323,323,323,322,322,322,321,321,321,321,320,319,319,319,316, 316,314,313,312,312,312,311,310,309,309,309,309,309,309,308,307, 306,305,305,305,304,302,302,301,301,301,301,301,300,299,299,298, 298,298,297,296,296,296,296,296,296,294,294,294,294,293,293,293, 293,292,291,291,291,291,290,290,290,290,289,289,288,287,287,286, 286,286,286,286,286,285,285,284,283,283,283,282,281,281,281,280, 280,280,280,280,279,279,279,278,278,278,278,277,277,277,277,276, 276,276,276,275,275,275,275,275,275,275,274,274,273,273,273,272, 272,272,272,271,271,270,270,270,270,270,270,270,270,269,269,268, 268,268,268,268,268,267,267,267,267,266,266,266,266,265,265,265, 264,264,264,264,264,264,264,264,264,264,263,263,263,263,263,263, 263,263,262,262,262,262,261,261,261,261,261,260,260,260,259,259, 259,259,259,258,258,258,258,257,257,257,257,257,256,256,256,256, 256,256,256,256,255,255,255,255,255,255,254,254,254,254,254,254, 254,254,254,254,254,254,253,253,253,253,253,253,253,253,253,253, 253,253,253,253,253,253,253,253,252,252,252,252,252,252,252,252, 252,251,251,251,251,251,251,251,250,250,250,250,250,250,250,250, 250,250,250,250,250 }; const int t501_17[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 498,498,497,497,496,492,490,489,489,488,486,485,485,485,484,484, 483,482,481,481,478,477,476,474,474,473,472,472,472,472,471,470, 469,469,468,467,467,466,463,463,462,462,461,460,460,459,459,458, 457,456,455,454,454,453,453,452,450,449,448,447,447,446,446,444, 442,441,440,439,438,437,437,437,436,435,434,432,432,431,431,430, 429,429,429,426,426,422,420,420,419,418,418,417,417,417,417,417, 417,417,416,415,413,413,412,412,411,411,407,406,406,404,404,403, 402,401,400,400,396,396,395,395,392,392,392,390,390,387,387,387, 386,384,384,383,383,383,382,382,382,381,381,380,380,379,379,378, 377,377,376,376,374,373,372,372,371,370,370,370,370,369,368,368, 367,366,366,366,364,364,363,362,361,361,360,360,360,360,357,357, 357,356,356,356,355,355,353,352,352,351,351,350,350,350,350,345, 341,340,338,338,335,335,334,334,333,333,333,332,332,332,331,331, 331,330,329,328,327,327,326,325,324,324,324,323,322,322,321,320, 318,318,318,317,316,316,315,315,315,314,314,314,313,313,312,312, 312,312,312,312,312,310,310,309,308,307,307,307,306,306,305,305, 305,305,305,305,304,303,303,302,300,300,299,299,299,299,298,298, 297,297,297,296,296,296,296,295,295,294,294,294,294,294,293,292, 292,291,291,291,290,290,290,289,289,289,289,289,289,288,288,288, 288,288,287,286,286,285,285,285,284,284,284,284,284,284,283,283, 283,282,282,282,280,280,280,280,280,280,279,279,279,278,278,278, 278,278,277,277,277,277,277,277,276,276,276,276,276,275,275,274, 274,274,273,273,273,273,272,272,272,272,271,271,271,270,270,270, 269,269,269,268,268,268,268,267,267,267,267,267,266,266,266,266, 265,265,265,265,265,265,264,264,264,264,264,263,263,263,263,263, 263,262,262,262,261,261,261,261,261,261,261,261,261,261,260,260, 260,260,260,260,260,260,260,259,259,259,259,259,259,259,259,259, 258,258,258,257,257,257,257,257,257,257,257,257,256,256,256,256, 256,256,256,255,255,255,255,254,254,254,254,254,254,254,254,254, 254,253,253,253,253,253,253,253,253,253,253,252,252,252,252,252, 252,252,252,252,252,251,251,251,250,250,250,250,250,250,250,250, 250,250,250,250,250 }; const int t501_18[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 499,499,498,498,498,497,496,494,494,493,491,488,485,483,482,481, 480,479,477,477,476,476,472,472,471,470,468,468,467,467,466,465, 464,464,464,463,463,462,462,462,462,462,461,461,460,460,460,459, 459,458,457,455,454,454,454,453,452,451,451,451,449,448,447,446, 445,445,444,444,444,443,442,441,441,440,439,439,438,438,438,438, 438,435,434,434,433,433,431,431,429,429,428,428,426,425,425,424, 423,423,423,423,423,422,420,419,417,414,413,412,412,412,411,408, 405,405,404,402,402,402,402,400,398,395,395,390,390,388,386,385, 384,383,382,381,380,379,379,377,377,376,375,375,375,373,373,373, 372,372,371,371,370,369,369,369,369,368,368,368,367,367,366,365, 363,362,362,362,362,362,362,360,359,359,358,358,357,357,357,357, 357,357,355,354,353,353,352,352,351,350,350,348,346,345,345,345, 344,342,342,341,340,339,338,336,336,335,334,334,334,332,331,330, 330,327,327,327,327,326,325,323,323,323,321,318,317,317,317,317, 316,316,316,315,315,313,313,312,312,311,309,309,308,308,308,307, 307,306,306,306,305,305,305,305,304,303,302,302,302,302,301,301, 301,301,301,300,300,300,299,299,299,298,298,298,297,297,296,295, 294,294,294,294,294,293,293,293,293,293,293,292,292,292,292,291, 291,290,290,289,289,288,288,288,288,287,287,287,286,286,286,285, 285,285,285,285,285,284,284,284,284,283,283,283,283,283,283,283, 283,282,282,282,281,281,281,281,281,280,279,279,278,278,278,278, 278,277,277,277,277,277,277,275,275,275,275,275,275,274,274,274, 274,274,274,274,273,273,273,273,272,272,271,271,271,271,271,271, 271,271,271,270,270,270,270,269,269,269,269,268,268,268,267,267, 266,266,266,266,266,266,266,265,265,265,265,265,265,264,264,264, 264,264,263,263,263,263,263,263,263,262,262,262,262,262,262,262, 261,261,261,261,261,260,260,260,260,260,260,260,259,259,259,259, 259,259,259,258,258,258,258,258,258,258,257,257,257,257,257,257, 257,256,256,255,255,255,255,255,255,254,254,254,254,253,253,253, 252,252,252,252,252,252,252,252,252,252,252,251,251,251,251,251, 251,251,251,251,251,250,250,250,250,250,250,250,250,250,250,250, 250,250,250,250,250 }; const int t501_19[] = { // Capacity 1000, // Number of items 501, // Size of items (sorted) 499,499,499,498,495,494,494,494,492,492,492,492,491,490,489,489, 488,488,488,487,487,485,484,484,482,482,482,481,481,481,480,479, 479,478,478,477,477,476,476,475,475,471,471,470,470,469,469,468, 466,466,465,464,464,462,462,462,462,462,461,460,459,457,455,455, 454,454,453,451,449,449,447,447,445,443,443,442,441,437,436,434, 434,432,432,431,431,430,429,429,429,429,429,426,426,425,424,423, 421,421,420,418,418,416,416,415,414,413,412,412,412,411,411,411, 410,409,409,406,405,404,403,401,400,400,398,398,397,397,396,396, 396,395,394,391,389,389,389,389,386,385,383,383,381,379,379,378, 377,377,376,376,375,375,375,373,373,372,371,370,369,368,367,367, 365,364,363,363,361,360,359,359,358,358,357,356,356,356,354,354, 353,352,352,351,351,350,350,348,347,347,344,343,342,341,341,340, 340,340,339,338,337,337,337,336,336,335,334,333,333,333,330,328, 328,327,325,325,324,324,324,323,323,322,321,320,319,319,319,318, 318,318,317,317,316,316,316,316,315,315,312,312,312,312,311,311, 310,310,309,309,309,309,309,308,308,307,306,306,304,304,304,304, 304,304,303,303,302,299,299,299,299,298,298,297,296,296,296,296, 295,295,294,294,292,292,291,290,290,289,289,289,289,288,288,288, 287,286,285,285,285,283,283,283,283,282,282,282,282,281,281,280, 280,279,279,279,279,278,278,277,277,277,277,277,275,275,274,274, 274,274,274,274,273,273,273,273,272,272,272,272,272,272,272,272, 271,271,271,271,271,270,269,269,269,269,268,268,268,268,268,267, 267,267,267,267,267,267,266,266,266,265,265,265,265,265,265,265, 265,265,265,264,264,264,264,264,264,264,264,264,264,264,263,263, 263,263,263,263,263,263,263,262,262,261,261,261,261,261,261,260, 260,260,260,260,259,259,259,259,259,259,259,258,258,258,258,258, 258,258,258,258,257,257,257,257,257,257,257,257,256,256,256,256, 256,256,255,255,255,255,255,255,255,255,255,255,255,254,254,254, 254,254,254,254,254,254,254,254,254,254,253,253,253,253,253,253, 252,252,252,252,252,252,252,252,252,252,252,251,251,251,251,251, 251,251,251,251,251,251,251,251,251,250,250,250,250,250,250,250, 250,250,250,250,250 }; const int* bpp[] = { &n1c1w1_a[0], &n1c1w1_b[0], &n1c1w1_c[0], &n1c1w1_d[0], &n1c1w1_e[0], &n1c1w1_f[0], &n1c1w1_g[0], &n1c1w1_h[0], &n1c1w1_i[0], &n1c1w1_j[0], &n1c1w1_k[0], &n1c1w1_l[0], &n1c1w1_m[0], &n1c1w1_n[0], &n1c1w1_o[0], &n1c1w1_p[0], &n1c1w1_q[0], &n1c1w1_r[0], &n1c1w1_s[0], &n1c1w1_t[0], &n1c1w2_a[0], &n1c1w2_b[0], &n1c1w2_c[0], &n1c1w2_d[0], &n1c1w2_e[0], &n1c1w2_f[0], &n1c1w2_g[0], &n1c1w2_h[0], &n1c1w2_i[0], &n1c1w2_j[0], &n1c1w2_k[0], &n1c1w2_l[0], &n1c1w2_m[0], &n1c1w2_n[0], &n1c1w2_o[0], &n1c1w2_p[0], &n1c1w2_q[0], &n1c1w2_r[0], &n1c1w2_s[0], &n1c1w2_t[0], &n1c1w4_a[0], &n1c1w4_b[0], &n1c1w4_c[0], &n1c1w4_d[0], &n1c1w4_e[0], &n1c1w4_f[0], &n1c1w4_g[0], &n1c1w4_h[0], &n1c1w4_i[0], &n1c1w4_j[0], &n1c1w4_k[0], &n1c1w4_l[0], &n1c1w4_m[0], &n1c1w4_n[0], &n1c1w4_o[0], &n1c1w4_p[0], &n1c1w4_q[0], &n1c1w4_r[0], &n1c1w4_s[0], &n1c1w4_t[0], &n1c2w1_a[0], &n1c2w1_b[0], &n1c2w1_c[0], &n1c2w1_d[0], &n1c2w1_e[0], &n1c2w1_f[0], &n1c2w1_g[0], &n1c2w1_h[0], &n1c2w1_i[0], &n1c2w1_j[0], &n1c2w1_k[0], &n1c2w1_l[0], &n1c2w1_m[0], &n1c2w1_n[0], &n1c2w1_o[0], &n1c2w1_p[0], &n1c2w1_q[0], &n1c2w1_r[0], &n1c2w1_s[0], &n1c2w1_t[0], &n1c2w2_a[0], &n1c2w2_b[0], &n1c2w2_c[0], &n1c2w2_d[0], &n1c2w2_e[0], &n1c2w2_f[0], &n1c2w2_g[0], &n1c2w2_h[0], &n1c2w2_i[0], &n1c2w2_j[0], &n1c2w2_k[0], &n1c2w2_l[0], &n1c2w2_m[0], &n1c2w2_n[0], &n1c2w2_o[0], &n1c2w2_p[0], &n1c2w2_q[0], &n1c2w2_r[0], &n1c2w2_s[0], &n1c2w2_t[0], &n1c2w4_a[0], &n1c2w4_b[0], &n1c2w4_c[0], &n1c2w4_d[0], &n1c2w4_e[0], &n1c2w4_f[0], &n1c2w4_g[0], &n1c2w4_h[0], &n1c2w4_i[0], &n1c2w4_j[0], &n1c2w4_k[0], &n1c2w4_l[0], &n1c2w4_m[0], &n1c2w4_n[0], &n1c2w4_o[0], &n1c2w4_p[0], &n1c2w4_q[0], &n1c2w4_r[0], &n1c2w4_s[0], &n1c2w4_t[0], &n1c3w1_a[0], &n1c3w1_b[0], &n1c3w1_c[0], &n1c3w1_d[0], &n1c3w1_e[0], &n1c3w1_f[0], &n1c3w1_g[0], &n1c3w1_h[0], &n1c3w1_i[0], &n1c3w1_j[0], &n1c3w1_k[0], &n1c3w1_l[0], &n1c3w1_m[0], &n1c3w1_n[0], &n1c3w1_o[0], &n1c3w1_p[0], &n1c3w1_q[0], &n1c3w1_r[0], &n1c3w1_s[0], &n1c3w1_t[0], &n1c3w2_a[0], &n1c3w2_b[0], &n1c3w2_c[0], &n1c3w2_d[0], &n1c3w2_e[0], &n1c3w2_f[0], &n1c3w2_g[0], &n1c3w2_h[0], &n1c3w2_i[0], &n1c3w2_j[0], &n1c3w2_k[0], &n1c3w2_l[0], &n1c3w2_m[0], &n1c3w2_n[0], &n1c3w2_o[0], &n1c3w2_p[0], &n1c3w2_q[0], &n1c3w2_r[0], &n1c3w2_s[0], &n1c3w2_t[0], &n1c3w4_a[0], &n1c3w4_b[0], &n1c3w4_c[0], &n1c3w4_d[0], &n1c3w4_e[0], &n1c3w4_f[0], &n1c3w4_g[0], &n1c3w4_h[0], &n1c3w4_i[0], &n1c3w4_j[0], &n1c3w4_k[0], &n1c3w4_l[0], &n1c3w4_m[0], &n1c3w4_n[0], &n1c3w4_o[0], &n1c3w4_p[0], &n1c3w4_q[0], &n1c3w4_r[0], &n1c3w4_s[0], &n1c3w4_t[0], &n2c1w1_a[0], &n2c1w1_b[0], &n2c1w1_c[0], &n2c1w1_d[0], &n2c1w1_e[0], &n2c1w1_f[0], &n2c1w1_g[0], &n2c1w1_h[0], &n2c1w1_i[0], &n2c1w1_j[0], &n2c1w1_k[0], &n2c1w1_l[0], &n2c1w1_m[0], &n2c1w1_n[0], &n2c1w1_o[0], &n2c1w1_p[0], &n2c1w1_q[0], &n2c1w1_r[0], &n2c1w1_s[0], &n2c1w1_t[0], &n2c1w2_a[0], &n2c1w2_b[0], &n2c1w2_c[0], &n2c1w2_d[0], &n2c1w2_e[0], &n2c1w2_f[0], &n2c1w2_g[0], &n2c1w2_h[0], &n2c1w2_i[0], &n2c1w2_j[0], &n2c1w2_k[0], &n2c1w2_l[0], &n2c1w2_m[0], &n2c1w2_n[0], &n2c1w2_o[0], &n2c1w2_p[0], &n2c1w2_q[0], &n2c1w2_r[0], &n2c1w2_s[0], &n2c1w2_t[0], &n2c1w4_a[0], &n2c1w4_b[0], &n2c1w4_c[0], &n2c1w4_d[0], &n2c1w4_e[0], &n2c1w4_f[0], &n2c1w4_g[0], &n2c1w4_h[0], &n2c1w4_i[0], &n2c1w4_j[0], &n2c1w4_k[0], &n2c1w4_l[0], &n2c1w4_m[0], &n2c1w4_n[0], &n2c1w4_o[0], &n2c1w4_p[0], &n2c1w4_q[0], &n2c1w4_r[0], &n2c1w4_s[0], &n2c1w4_t[0], &n2c2w1_a[0], &n2c2w1_b[0], &n2c2w1_c[0], &n2c2w1_d[0], &n2c2w1_e[0], &n2c2w1_f[0], &n2c2w1_g[0], &n2c2w1_h[0], &n2c2w1_i[0], &n2c2w1_j[0], &n2c2w1_k[0], &n2c2w1_l[0], &n2c2w1_m[0], &n2c2w1_n[0], &n2c2w1_o[0], &n2c2w1_p[0], &n2c2w1_q[0], &n2c2w1_r[0], &n2c2w1_s[0], &n2c2w1_t[0], &n2c2w2_a[0], &n2c2w2_b[0], &n2c2w2_c[0], &n2c2w2_d[0], &n2c2w2_e[0], &n2c2w2_f[0], &n2c2w2_g[0], &n2c2w2_h[0], &n2c2w2_i[0], &n2c2w2_j[0], &n2c2w2_k[0], &n2c2w2_l[0], &n2c2w2_m[0], &n2c2w2_n[0], &n2c2w2_o[0], &n2c2w2_p[0], &n2c2w2_q[0], &n2c2w2_r[0], &n2c2w2_s[0], &n2c2w2_t[0], &n2c2w4_a[0], &n2c2w4_b[0], &n2c2w4_c[0], &n2c2w4_d[0], &n2c2w4_e[0], &n2c2w4_f[0], &n2c2w4_g[0], &n2c2w4_h[0], &n2c2w4_i[0], &n2c2w4_j[0], &n2c2w4_k[0], &n2c2w4_l[0], &n2c2w4_m[0], &n2c2w4_n[0], &n2c2w4_o[0], &n2c2w4_p[0], &n2c2w4_q[0], &n2c2w4_r[0], &n2c2w4_s[0], &n2c2w4_t[0], &n2c3w1_a[0], &n2c3w1_b[0], &n2c3w1_c[0], &n2c3w1_d[0], &n2c3w1_e[0], &n2c3w1_f[0], &n2c3w1_g[0], &n2c3w1_h[0], &n2c3w1_i[0], &n2c3w1_j[0], &n2c3w1_k[0], &n2c3w1_l[0], &n2c3w1_m[0], &n2c3w1_n[0], &n2c3w1_o[0], &n2c3w1_p[0], &n2c3w1_q[0], &n2c3w1_r[0], &n2c3w1_s[0], &n2c3w1_t[0], &n2c3w2_a[0], &n2c3w2_b[0], &n2c3w2_c[0], &n2c3w2_d[0], &n2c3w2_e[0], &n2c3w2_f[0], &n2c3w2_g[0], &n2c3w2_h[0], &n2c3w2_i[0], &n2c3w2_j[0], &n2c3w2_k[0], &n2c3w2_l[0], &n2c3w2_m[0], &n2c3w2_n[0], &n2c3w2_o[0], &n2c3w2_p[0], &n2c3w2_q[0], &n2c3w2_r[0], &n2c3w2_s[0], &n2c3w2_t[0], &n2c3w4_a[0], &n2c3w4_b[0], &n2c3w4_c[0], &n2c3w4_d[0], &n2c3w4_e[0], &n2c3w4_f[0], &n2c3w4_g[0], &n2c3w4_h[0], &n2c3w4_i[0], &n2c3w4_j[0], &n2c3w4_k[0], &n2c3w4_l[0], &n2c3w4_m[0], &n2c3w4_n[0], &n2c3w4_o[0], &n2c3w4_p[0], &n2c3w4_q[0], &n2c3w4_r[0], &n2c3w4_s[0], &n2c3w4_t[0], &n3c1w1_a[0], &n3c1w1_b[0], &n3c1w1_c[0], &n3c1w1_d[0], &n3c1w1_e[0], &n3c1w1_f[0], &n3c1w1_g[0], &n3c1w1_h[0], &n3c1w1_i[0], &n3c1w1_j[0], &n3c1w1_k[0], &n3c1w1_l[0], &n3c1w1_m[0], &n3c1w1_n[0], &n3c1w1_o[0], &n3c1w1_p[0], &n3c1w1_q[0], &n3c1w1_r[0], &n3c1w1_s[0], &n3c1w1_t[0], &n3c1w2_a[0], &n3c1w2_b[0], &n3c1w2_c[0], &n3c1w2_d[0], &n3c1w2_e[0], &n3c1w2_f[0], &n3c1w2_g[0], &n3c1w2_h[0], &n3c1w2_i[0], &n3c1w2_j[0], &n3c1w2_k[0], &n3c1w2_l[0], &n3c1w2_m[0], &n3c1w2_n[0], &n3c1w2_o[0], &n3c1w2_p[0], &n3c1w2_q[0], &n3c1w2_r[0], &n3c1w2_s[0], &n3c1w2_t[0], &n3c1w4_a[0], &n3c1w4_b[0], &n3c1w4_c[0], &n3c1w4_d[0], &n3c1w4_e[0], &n3c1w4_f[0], &n3c1w4_g[0], &n3c1w4_h[0], &n3c1w4_i[0], &n3c1w4_j[0], &n3c1w4_k[0], &n3c1w4_l[0], &n3c1w4_m[0], &n3c1w4_n[0], &n3c1w4_o[0], &n3c1w4_p[0], &n3c1w4_q[0], &n3c1w4_r[0], &n3c1w4_s[0], &n3c1w4_t[0], &n3c2w1_a[0], &n3c2w1_b[0], &n3c2w1_c[0], &n3c2w1_d[0], &n3c2w1_e[0], &n3c2w1_f[0], &n3c2w1_g[0], &n3c2w1_h[0], &n3c2w1_i[0], &n3c2w1_j[0], &n3c2w1_k[0], &n3c2w1_l[0], &n3c2w1_m[0], &n3c2w1_n[0], &n3c2w1_o[0], &n3c2w1_p[0], &n3c2w1_q[0], &n3c2w1_r[0], &n3c2w1_s[0], &n3c2w1_t[0], &n3c2w2_a[0], &n3c2w2_b[0], &n3c2w2_c[0], &n3c2w2_d[0], &n3c2w2_e[0], &n3c2w2_f[0], &n3c2w2_g[0], &n3c2w2_h[0], &n3c2w2_i[0], &n3c2w2_j[0], &n3c2w2_k[0], &n3c2w2_l[0], &n3c2w2_m[0], &n3c2w2_n[0], &n3c2w2_o[0], &n3c2w2_p[0], &n3c2w2_q[0], &n3c2w2_r[0], &n3c2w2_s[0], &n3c2w2_t[0], &n3c2w4_a[0], &n3c2w4_b[0], &n3c2w4_c[0], &n3c2w4_d[0], &n3c2w4_e[0], &n3c2w4_f[0], &n3c2w4_g[0], &n3c2w4_h[0], &n3c2w4_i[0], &n3c2w4_j[0], &n3c2w4_k[0], &n3c2w4_l[0], &n3c2w4_m[0], &n3c2w4_n[0], &n3c2w4_o[0], &n3c2w4_p[0], &n3c2w4_q[0], &n3c2w4_r[0], &n3c2w4_s[0], &n3c2w4_t[0], &n3c3w1_a[0], &n3c3w1_b[0], &n3c3w1_c[0], &n3c3w1_d[0], &n3c3w1_e[0], &n3c3w1_f[0], &n3c3w1_g[0], &n3c3w1_h[0], &n3c3w1_i[0], &n3c3w1_j[0], &n3c3w1_k[0], &n3c3w1_l[0], &n3c3w1_m[0], &n3c3w1_n[0], &n3c3w1_o[0], &n3c3w1_p[0], &n3c3w1_q[0], &n3c3w1_r[0], &n3c3w1_s[0], &n3c3w1_t[0], &n3c3w2_a[0], &n3c3w2_b[0], &n3c3w2_c[0], &n3c3w2_d[0], &n3c3w2_e[0], &n3c3w2_f[0], &n3c3w2_g[0], &n3c3w2_h[0], &n3c3w2_i[0], &n3c3w2_j[0], &n3c3w2_k[0], &n3c3w2_l[0], &n3c3w2_m[0], &n3c3w2_n[0], &n3c3w2_o[0], &n3c3w2_p[0], &n3c3w2_q[0], &n3c3w2_r[0], &n3c3w2_s[0], &n3c3w2_t[0], &n3c3w4_a[0], &n3c3w4_b[0], &n3c3w4_c[0], &n3c3w4_d[0], &n3c3w4_e[0], &n3c3w4_f[0], &n3c3w4_g[0], &n3c3w4_h[0], &n3c3w4_i[0], &n3c3w4_j[0], &n3c3w4_k[0], &n3c3w4_l[0], &n3c3w4_m[0], &n3c3w4_n[0], &n3c3w4_o[0], &n3c3w4_p[0], &n3c3w4_q[0], &n3c3w4_r[0], &n3c3w4_s[0], &n3c3w4_t[0], &n4c1w1_a[0], &n4c1w1_b[0], &n4c1w1_c[0], &n4c1w1_d[0], &n4c1w1_e[0], &n4c1w1_f[0], &n4c1w1_g[0], &n4c1w1_h[0], &n4c1w1_i[0], &n4c1w1_j[0], &n4c1w1_k[0], &n4c1w1_l[0], &n4c1w1_m[0], &n4c1w1_n[0], &n4c1w1_o[0], &n4c1w1_p[0], &n4c1w1_q[0], &n4c1w1_r[0], &n4c1w1_s[0], &n4c1w1_t[0], &n4c1w2_a[0], &n4c1w2_b[0], &n4c1w2_c[0], &n4c1w2_d[0], &n4c1w2_e[0], &n4c1w2_f[0], &n4c1w2_g[0], &n4c1w2_h[0], &n4c1w2_i[0], &n4c1w2_j[0], &n4c1w2_k[0], &n4c1w2_l[0], &n4c1w2_m[0], &n4c1w2_n[0], &n4c1w2_o[0], &n4c1w2_p[0], &n4c1w2_q[0], &n4c1w2_r[0], &n4c1w2_s[0], &n4c1w2_t[0], &n4c1w4_a[0], &n4c1w4_b[0], &n4c1w4_c[0], &n4c1w4_d[0], &n4c1w4_e[0], &n4c1w4_f[0], &n4c1w4_g[0], &n4c1w4_h[0], &n4c1w4_i[0], &n4c1w4_j[0], &n4c1w4_k[0], &n4c1w4_l[0], &n4c1w4_m[0], &n4c1w4_n[0], &n4c1w4_o[0], &n4c1w4_p[0], &n4c1w4_q[0], &n4c1w4_r[0], &n4c1w4_s[0], &n4c1w4_t[0], &n4c2w1_a[0], &n4c2w1_b[0], &n4c2w1_c[0], &n4c2w1_d[0], &n4c2w1_e[0], &n4c2w1_f[0], &n4c2w1_g[0], &n4c2w1_h[0], &n4c2w1_i[0], &n4c2w1_j[0], &n4c2w1_k[0], &n4c2w1_l[0], &n4c2w1_m[0], &n4c2w1_n[0], &n4c2w1_o[0], &n4c2w1_p[0], &n4c2w1_q[0], &n4c2w1_r[0], &n4c2w1_s[0], &n4c2w1_t[0], &n4c2w2_a[0], &n4c2w2_b[0], &n4c2w2_c[0], &n4c2w2_d[0], &n4c2w2_e[0], &n4c2w2_f[0], &n4c2w2_g[0], &n4c2w2_h[0], &n4c2w2_i[0], &n4c2w2_j[0], &n4c2w2_k[0], &n4c2w2_l[0], &n4c2w2_m[0], &n4c2w2_n[0], &n4c2w2_o[0], &n4c2w2_p[0], &n4c2w2_q[0], &n4c2w2_r[0], &n4c2w2_s[0], &n4c2w2_t[0], &n4c2w4_a[0], &n4c2w4_b[0], &n4c2w4_c[0], &n4c2w4_d[0], &n4c2w4_e[0], &n4c2w4_f[0], &n4c2w4_g[0], &n4c2w4_h[0], &n4c2w4_i[0], &n4c2w4_j[0], &n4c2w4_k[0], &n4c2w4_l[0], &n4c2w4_m[0], &n4c2w4_n[0], &n4c2w4_o[0], &n4c2w4_p[0], &n4c2w4_q[0], &n4c2w4_r[0], &n4c2w4_s[0], &n4c2w4_t[0], &n4c3w1_a[0], &n4c3w1_b[0], &n4c3w1_c[0], &n4c3w1_d[0], &n4c3w1_e[0], &n4c3w1_f[0], &n4c3w1_g[0], &n4c3w1_h[0], &n4c3w1_i[0], &n4c3w1_j[0], &n4c3w1_k[0], &n4c3w1_l[0], &n4c3w1_m[0], &n4c3w1_n[0], &n4c3w1_o[0], &n4c3w1_p[0], &n4c3w1_q[0], &n4c3w1_r[0], &n4c3w1_s[0], &n4c3w1_t[0], &n4c3w2_a[0], &n4c3w2_b[0], &n4c3w2_c[0], &n4c3w2_d[0], &n4c3w2_e[0], &n4c3w2_f[0], &n4c3w2_g[0], &n4c3w2_h[0], &n4c3w2_i[0], &n4c3w2_j[0], &n4c3w2_k[0], &n4c3w2_l[0], &n4c3w2_m[0], &n4c3w2_n[0], &n4c3w2_o[0], &n4c3w2_p[0], &n4c3w2_q[0], &n4c3w2_r[0], &n4c3w2_s[0], &n4c3w2_t[0], &n4c3w4_a[0], &n4c3w4_b[0], &n4c3w4_c[0], &n4c3w4_d[0], &n4c3w4_e[0], &n4c3w4_f[0], &n4c3w4_g[0], &n4c3w4_h[0], &n4c3w4_i[0], &n4c3w4_j[0], &n4c3w4_k[0], &n4c3w4_l[0], &n4c3w4_m[0], &n4c3w4_n[0], &n4c3w4_o[0], &n4c3w4_p[0], &n4c3w4_q[0], &n4c3w4_r[0], &n4c3w4_s[0], &n4c3w4_t[0], &n1w1b1r0[0], &n1w1b1r1[0], &n1w1b1r2[0], &n1w1b1r3[0], &n1w1b1r4[0], &n1w1b1r5[0], &n1w1b1r6[0], &n1w1b1r7[0], &n1w1b1r8[0], &n1w1b1r9[0], &n1w1b2r0[0], &n1w1b2r1[0], &n1w1b2r2[0], &n1w1b2r3[0], &n1w1b2r4[0], &n1w1b2r5[0], &n1w1b2r6[0], &n1w1b2r7[0], &n1w1b2r8[0], &n1w1b2r9[0], &n1w1b3r0[0], &n1w1b3r1[0], &n1w1b3r2[0], &n1w1b3r3[0], &n1w1b3r4[0], &n1w1b3r5[0], &n1w1b3r6[0], &n1w1b3r7[0], &n1w1b3r8[0], &n1w1b3r9[0], &n1w2b1r0[0], &n1w2b1r1[0], &n1w2b1r2[0], &n1w2b1r3[0], &n1w2b1r4[0], &n1w2b1r5[0], &n1w2b1r6[0], &n1w2b1r7[0], &n1w2b1r8[0], &n1w2b1r9[0], &n1w2b2r0[0], &n1w2b2r1[0], &n1w2b2r2[0], &n1w2b2r3[0], &n1w2b2r4[0], &n1w2b2r5[0], &n1w2b2r6[0], &n1w2b2r7[0], &n1w2b2r8[0], &n1w2b2r9[0], &n1w2b3r0[0], &n1w2b3r1[0], &n1w2b3r2[0], &n1w2b3r3[0], &n1w2b3r4[0], &n1w2b3r5[0], &n1w2b3r6[0], &n1w2b3r7[0], &n1w2b3r8[0], &n1w2b3r9[0], &n1w3b1r0[0], &n1w3b1r1[0], &n1w3b1r2[0], &n1w3b1r3[0], &n1w3b1r4[0], &n1w3b1r5[0], &n1w3b1r6[0], &n1w3b1r7[0], &n1w3b1r8[0], &n1w3b1r9[0], &n1w3b2r0[0], &n1w3b2r1[0], &n1w3b2r2[0], &n1w3b2r3[0], &n1w3b2r4[0], &n1w3b2r5[0], &n1w3b2r6[0], &n1w3b2r7[0], &n1w3b2r8[0], &n1w3b2r9[0], &n1w3b3r0[0], &n1w3b3r1[0], &n1w3b3r2[0], &n1w3b3r3[0], &n1w3b3r4[0], &n1w3b3r5[0], &n1w3b3r6[0], &n1w3b3r7[0], &n1w3b3r8[0], &n1w3b3r9[0], &n1w4b1r0[0], &n1w4b1r1[0], &n1w4b1r2[0], &n1w4b1r3[0], &n1w4b1r4[0], &n1w4b1r5[0], &n1w4b1r6[0], &n1w4b1r7[0], &n1w4b1r8[0], &n1w4b1r9[0], &n1w4b2r0[0], &n1w4b2r1[0], &n1w4b2r2[0], &n1w4b2r3[0], &n1w4b2r4[0], &n1w4b2r5[0], &n1w4b2r6[0], &n1w4b2r7[0], &n1w4b2r8[0], &n1w4b2r9[0], &n1w4b3r0[0], &n1w4b3r1[0], &n1w4b3r2[0], &n1w4b3r3[0], &n1w4b3r4[0], &n1w4b3r5[0], &n1w4b3r6[0], &n1w4b3r7[0], &n1w4b3r8[0], &n1w4b3r9[0], &n2w1b1r0[0], &n2w1b1r1[0], &n2w1b1r2[0], &n2w1b1r3[0], &n2w1b1r4[0], &n2w1b1r5[0], &n2w1b1r6[0], &n2w1b1r7[0], &n2w1b1r8[0], &n2w1b1r9[0], &n2w1b2r0[0], &n2w1b2r1[0], &n2w1b2r2[0], &n2w1b2r3[0], &n2w1b2r4[0], &n2w1b2r5[0], &n2w1b2r6[0], &n2w1b2r7[0], &n2w1b2r8[0], &n2w1b2r9[0], &n2w1b3r0[0], &n2w1b3r1[0], &n2w1b3r2[0], &n2w1b3r3[0], &n2w1b3r4[0], &n2w1b3r5[0], &n2w1b3r6[0], &n2w1b3r7[0], &n2w1b3r8[0], &n2w1b3r9[0], &n2w2b1r0[0], &n2w2b1r1[0], &n2w2b1r2[0], &n2w2b1r3[0], &n2w2b1r4[0], &n2w2b1r5[0], &n2w2b1r6[0], &n2w2b1r7[0], &n2w2b1r8[0], &n2w2b1r9[0], &n2w2b2r0[0], &n2w2b2r1[0], &n2w2b2r2[0], &n2w2b2r3[0], &n2w2b2r4[0], &n2w2b2r5[0], &n2w2b2r6[0], &n2w2b2r7[0], &n2w2b2r8[0], &n2w2b2r9[0], &n2w2b3r0[0], &n2w2b3r1[0], &n2w2b3r2[0], &n2w2b3r3[0], &n2w2b3r4[0], &n2w2b3r5[0], &n2w2b3r6[0], &n2w2b3r7[0], &n2w2b3r8[0], &n2w2b3r9[0], &n2w3b1r0[0], &n2w3b1r1[0], &n2w3b1r2[0], &n2w3b1r3[0], &n2w3b1r4[0], &n2w3b1r5[0], &n2w3b1r6[0], &n2w3b1r7[0], &n2w3b1r8[0], &n2w3b1r9[0], &n2w3b2r0[0], &n2w3b2r1[0], &n2w3b2r2[0], &n2w3b2r3[0], &n2w3b2r4[0], &n2w3b2r5[0], &n2w3b2r6[0], &n2w3b2r7[0], &n2w3b2r8[0], &n2w3b2r9[0], &n2w3b3r0[0], &n2w3b3r1[0], &n2w3b3r2[0], &n2w3b3r3[0], &n2w3b3r4[0], &n2w3b3r5[0], &n2w3b3r6[0], &n2w3b3r7[0], &n2w3b3r8[0], &n2w3b3r9[0], &n2w4b1r0[0], &n2w4b1r1[0], &n2w4b1r2[0], &n2w4b1r3[0], &n2w4b1r4[0], &n2w4b1r5[0], &n2w4b1r6[0], &n2w4b1r7[0], &n2w4b1r8[0], &n2w4b1r9[0], &n2w4b2r0[0], &n2w4b2r1[0], &n2w4b2r2[0], &n2w4b2r3[0], &n2w4b2r4[0], &n2w4b2r5[0], &n2w4b2r6[0], &n2w4b2r7[0], &n2w4b2r8[0], &n2w4b2r9[0], &n2w4b3r0[0], &n2w4b3r1[0], &n2w4b3r2[0], &n2w4b3r3[0], &n2w4b3r4[0], &n2w4b3r5[0], &n2w4b3r6[0], &n2w4b3r7[0], &n2w4b3r8[0], &n2w4b3r9[0], &n3w1b1r0[0], &n3w1b1r1[0], &n3w1b1r2[0], &n3w1b1r3[0], &n3w1b1r4[0], &n3w1b1r5[0], &n3w1b1r6[0], &n3w1b1r7[0], &n3w1b1r8[0], &n3w1b1r9[0], &n3w1b2r0[0], &n3w1b2r1[0], &n3w1b2r2[0], &n3w1b2r3[0], &n3w1b2r4[0], &n3w1b2r5[0], &n3w1b2r6[0], &n3w1b2r7[0], &n3w1b2r8[0], &n3w1b2r9[0], &n3w1b3r0[0], &n3w1b3r1[0], &n3w1b3r2[0], &n3w1b3r3[0], &n3w1b3r4[0], &n3w1b3r5[0], &n3w1b3r6[0], &n3w1b3r7[0], &n3w1b3r8[0], &n3w1b3r9[0], &n3w2b1r0[0], &n3w2b1r1[0], &n3w2b1r2[0], &n3w2b1r3[0], &n3w2b1r4[0], &n3w2b1r5[0], &n3w2b1r6[0], &n3w2b1r7[0], &n3w2b1r8[0], &n3w2b1r9[0], &n3w2b2r0[0], &n3w2b2r1[0], &n3w2b2r2[0], &n3w2b2r3[0], &n3w2b2r4[0], &n3w2b2r5[0], &n3w2b2r6[0], &n3w2b2r7[0], &n3w2b2r8[0], &n3w2b2r9[0], &n3w2b3r0[0], &n3w2b3r1[0], &n3w2b3r2[0], &n3w2b3r3[0], &n3w2b3r4[0], &n3w2b3r5[0], &n3w2b3r6[0], &n3w2b3r7[0], &n3w2b3r8[0], &n3w2b3r9[0], &n3w3b1r0[0], &n3w3b1r1[0], &n3w3b1r2[0], &n3w3b1r3[0], &n3w3b1r4[0], &n3w3b1r5[0], &n3w3b1r6[0], &n3w3b1r7[0], &n3w3b1r8[0], &n3w3b1r9[0], &n3w3b2r0[0], &n3w3b2r1[0], &n3w3b2r2[0], &n3w3b2r3[0], &n3w3b2r4[0], &n3w3b2r5[0], &n3w3b2r6[0], &n3w3b2r7[0], &n3w3b2r8[0], &n3w3b2r9[0], &n3w3b3r0[0], &n3w3b3r1[0], &n3w3b3r2[0], &n3w3b3r3[0], &n3w3b3r4[0], &n3w3b3r5[0], &n3w3b3r6[0], &n3w3b3r7[0], &n3w3b3r8[0], &n3w3b3r9[0], &n3w4b1r0[0], &n3w4b1r1[0], &n3w4b1r2[0], &n3w4b1r3[0], &n3w4b1r4[0], &n3w4b1r5[0], &n3w4b1r6[0], &n3w4b1r7[0], &n3w4b1r8[0], &n3w4b1r9[0], &n3w4b2r0[0], &n3w4b2r1[0], &n3w4b2r2[0], &n3w4b2r3[0], &n3w4b2r4[0], &n3w4b2r5[0], &n3w4b2r6[0], &n3w4b2r7[0], &n3w4b2r8[0], &n3w4b2r9[0], &n3w4b3r0[0], &n3w4b3r1[0], &n3w4b3r2[0], &n3w4b3r3[0], &n3w4b3r4[0], &n3w4b3r5[0], &n3w4b3r6[0], &n3w4b3r7[0], &n3w4b3r8[0], &n3w4b3r9[0], &n4w1b1r0[0], &n4w1b1r1[0], &n4w1b1r2[0], &n4w1b1r3[0], &n4w1b1r4[0], &n4w1b1r5[0], &n4w1b1r6[0], &n4w1b1r7[0], &n4w1b1r8[0], &n4w1b1r9[0], &n4w1b2r0[0], &n4w1b2r1[0], &n4w1b2r2[0], &n4w1b2r3[0], &n4w1b2r4[0], &n4w1b2r5[0], &n4w1b2r6[0], &n4w1b2r7[0], &n4w1b2r8[0], &n4w1b2r9[0], &n4w1b3r0[0], &n4w1b3r1[0], &n4w1b3r2[0], &n4w1b3r3[0], &n4w1b3r4[0], &n4w1b3r5[0], &n4w1b3r6[0], &n4w1b3r7[0], &n4w1b3r8[0], &n4w1b3r9[0], &n4w2b1r0[0], &n4w2b1r1[0], &n4w2b1r2[0], &n4w2b1r3[0], &n4w2b1r4[0], &n4w2b1r5[0], &n4w2b1r6[0], &n4w2b1r7[0], &n4w2b1r8[0], &n4w2b1r9[0], &n4w2b2r0[0], &n4w2b2r1[0], &n4w2b2r2[0], &n4w2b2r3[0], &n4w2b2r4[0], &n4w2b2r5[0], &n4w2b2r6[0], &n4w2b2r7[0], &n4w2b2r8[0], &n4w2b2r9[0], &n4w2b3r0[0], &n4w2b3r1[0], &n4w2b3r2[0], &n4w2b3r3[0], &n4w2b3r4[0], &n4w2b3r5[0], &n4w2b3r6[0], &n4w2b3r7[0], &n4w2b3r8[0], &n4w2b3r9[0], &n4w3b1r0[0], &n4w3b1r1[0], &n4w3b1r2[0], &n4w3b1r3[0], &n4w3b1r4[0], &n4w3b1r5[0], &n4w3b1r6[0], &n4w3b1r7[0], &n4w3b1r8[0], &n4w3b1r9[0], &n4w3b2r0[0], &n4w3b2r1[0], &n4w3b2r2[0], &n4w3b2r3[0], &n4w3b2r4[0], &n4w3b2r5[0], &n4w3b2r6[0], &n4w3b2r7[0], &n4w3b2r8[0], &n4w3b2r9[0], &n4w3b3r0[0], &n4w3b3r1[0], &n4w3b3r2[0], &n4w3b3r3[0], &n4w3b3r4[0], &n4w3b3r5[0], &n4w3b3r6[0], &n4w3b3r7[0], &n4w3b3r8[0], &n4w3b3r9[0], &n4w4b1r0[0], &n4w4b1r1[0], &n4w4b1r2[0], &n4w4b1r3[0], &n4w4b1r4[0], &n4w4b1r5[0], &n4w4b1r6[0], &n4w4b1r7[0], &n4w4b1r8[0], &n4w4b1r9[0], &n4w4b2r0[0], &n4w4b2r1[0], &n4w4b2r2[0], &n4w4b2r3[0], &n4w4b2r4[0], &n4w4b2r5[0], &n4w4b2r6[0], &n4w4b2r7[0], &n4w4b2r8[0], &n4w4b2r9[0], &n4w4b3r0[0], &n4w4b3r1[0], &n4w4b3r2[0], &n4w4b3r3[0], &n4w4b3r4[0], &n4w4b3r5[0], &n4w4b3r6[0], &n4w4b3r7[0], &n4w4b3r8[0], &n4w4b3r9[0], &hard0[0], &hard1[0], &hard2[0], &hard3[0], &hard4[0], &hard5[0], &hard6[0], &hard7[0], &hard8[0], &hard9[0], &t60_00[0], &t60_01[0], &t60_02[0], &t60_03[0], &t60_04[0], &t60_05[0], &t60_06[0], &t60_07[0], &t60_08[0], &t60_09[0], &t60_10[0], &t60_11[0], &t60_12[0], &t60_13[0], &t60_14[0], &t60_15[0], &t60_16[0], &t60_17[0], &t60_18[0], &t60_19[0], &u120_00[0], &u120_01[0], &u120_02[0], &u120_03[0], &u120_04[0], &u120_05[0], &u120_06[0], &u120_07[0], &u120_08[0], &u120_09[0], &u120_10[0], &u120_11[0], &u120_12[0], &u120_13[0], &u120_14[0], &u120_15[0], &u120_16[0], &u120_17[0], &u120_18[0], &u120_19[0], &u250_00[0], &u250_01[0], &u250_02[0], &u250_03[0], &u250_04[0], &u250_05[0], &u250_06[0], &u250_07[0], &u250_08[0], &u250_09[0], &u250_10[0], &u250_11[0], &u250_12[0], &u250_13[0], &u250_14[0], &u250_15[0], &u250_16[0], &u250_17[0], &u250_18[0], &u250_19[0], &u500_00[0], &u500_01[0], &u500_02[0], &u500_03[0], &u500_04[0], &u500_05[0], &u500_06[0], &u500_07[0], &u500_08[0], &u500_09[0], &u500_10[0], &u500_11[0], &u500_12[0], &u500_13[0], &u500_14[0], &u500_15[0], &u500_16[0], &u500_17[0], &u500_18[0], &u500_19[0], &u1000_00[0], &u1000_01[0], &u1000_02[0], &u1000_03[0], &u1000_04[0], &u1000_05[0], &u1000_06[0], &u1000_07[0], &u1000_08[0], &u1000_09[0], &u1000_10[0], &u1000_11[0], &u1000_12[0], &u1000_13[0], &u1000_14[0], &u1000_15[0], &u1000_16[0], &u1000_17[0], &u1000_18[0], &u1000_19[0], &t120_00[0], &t120_01[0], &t120_02[0], &t120_03[0], &t120_04[0], &t120_05[0], &t120_06[0], &t120_07[0], &t120_08[0], &t120_09[0], &t120_10[0], &t120_11[0], &t120_12[0], &t120_13[0], &t120_14[0], &t120_15[0], &t120_16[0], &t120_17[0], &t120_18[0], &t120_19[0], &t249_00[0], &t249_01[0], &t249_02[0], &t249_03[0], &t249_04[0], &t249_05[0], &t249_06[0], &t249_07[0], &t249_08[0], &t249_09[0], &t249_10[0], &t249_11[0], &t249_12[0], &t249_13[0], &t249_14[0], &t249_15[0], &t249_16[0], &t249_17[0], &t249_18[0], &t249_19[0], &t501_00[0], &t501_01[0], &t501_02[0], &t501_03[0], &t501_04[0], &t501_05[0], &t501_06[0], &t501_07[0], &t501_08[0], &t501_09[0], &t501_10[0], &t501_11[0], &t501_12[0], &t501_13[0], &t501_14[0], &t501_15[0], &t501_16[0], &t501_17[0], &t501_18[0], &t501_19[0] }; const char* name[] = { "n1c1w1_a", "n1c1w1_b", "n1c1w1_c", "n1c1w1_d", "n1c1w1_e", "n1c1w1_f", "n1c1w1_g", "n1c1w1_h", "n1c1w1_i", "n1c1w1_j", "n1c1w1_k", "n1c1w1_l", "n1c1w1_m", "n1c1w1_n", "n1c1w1_o", "n1c1w1_p", "n1c1w1_q", "n1c1w1_r", "n1c1w1_s", "n1c1w1_t", "n1c1w2_a", "n1c1w2_b", "n1c1w2_c", "n1c1w2_d", "n1c1w2_e", "n1c1w2_f", "n1c1w2_g", "n1c1w2_h", "n1c1w2_i", "n1c1w2_j", "n1c1w2_k", "n1c1w2_l", "n1c1w2_m", "n1c1w2_n", "n1c1w2_o", "n1c1w2_p", "n1c1w2_q", "n1c1w2_r", "n1c1w2_s", "n1c1w2_t", "n1c1w4_a", "n1c1w4_b", "n1c1w4_c", "n1c1w4_d", "n1c1w4_e", "n1c1w4_f", "n1c1w4_g", "n1c1w4_h", "n1c1w4_i", "n1c1w4_j", "n1c1w4_k", "n1c1w4_l", "n1c1w4_m", "n1c1w4_n", "n1c1w4_o", "n1c1w4_p", "n1c1w4_q", "n1c1w4_r", "n1c1w4_s", "n1c1w4_t", "n1c2w1_a", "n1c2w1_b", "n1c2w1_c", "n1c2w1_d", "n1c2w1_e", "n1c2w1_f", "n1c2w1_g", "n1c2w1_h", "n1c2w1_i", "n1c2w1_j", "n1c2w1_k", "n1c2w1_l", "n1c2w1_m", "n1c2w1_n", "n1c2w1_o", "n1c2w1_p", "n1c2w1_q", "n1c2w1_r", "n1c2w1_s", "n1c2w1_t", "n1c2w2_a", "n1c2w2_b", "n1c2w2_c", "n1c2w2_d", "n1c2w2_e", "n1c2w2_f", "n1c2w2_g", "n1c2w2_h", "n1c2w2_i", "n1c2w2_j", "n1c2w2_k", "n1c2w2_l", "n1c2w2_m", "n1c2w2_n", "n1c2w2_o", "n1c2w2_p", "n1c2w2_q", "n1c2w2_r", "n1c2w2_s", "n1c2w2_t", "n1c2w4_a", "n1c2w4_b", "n1c2w4_c", "n1c2w4_d", "n1c2w4_e", "n1c2w4_f", "n1c2w4_g", "n1c2w4_h", "n1c2w4_i", "n1c2w4_j", "n1c2w4_k", "n1c2w4_l", "n1c2w4_m", "n1c2w4_n", "n1c2w4_o", "n1c2w4_p", "n1c2w4_q", "n1c2w4_r", "n1c2w4_s", "n1c2w4_t", "n1c3w1_a", "n1c3w1_b", "n1c3w1_c", "n1c3w1_d", "n1c3w1_e", "n1c3w1_f", "n1c3w1_g", "n1c3w1_h", "n1c3w1_i", "n1c3w1_j", "n1c3w1_k", "n1c3w1_l", "n1c3w1_m", "n1c3w1_n", "n1c3w1_o", "n1c3w1_p", "n1c3w1_q", "n1c3w1_r", "n1c3w1_s", "n1c3w1_t", "n1c3w2_a", "n1c3w2_b", "n1c3w2_c", "n1c3w2_d", "n1c3w2_e", "n1c3w2_f", "n1c3w2_g", "n1c3w2_h", "n1c3w2_i", "n1c3w2_j", "n1c3w2_k", "n1c3w2_l", "n1c3w2_m", "n1c3w2_n", "n1c3w2_o", "n1c3w2_p", "n1c3w2_q", "n1c3w2_r", "n1c3w2_s", "n1c3w2_t", "n1c3w4_a", "n1c3w4_b", "n1c3w4_c", "n1c3w4_d", "n1c3w4_e", "n1c3w4_f", "n1c3w4_g", "n1c3w4_h", "n1c3w4_i", "n1c3w4_j", "n1c3w4_k", "n1c3w4_l", "n1c3w4_m", "n1c3w4_n", "n1c3w4_o", "n1c3w4_p", "n1c3w4_q", "n1c3w4_r", "n1c3w4_s", "n1c3w4_t", "n2c1w1_a", "n2c1w1_b", "n2c1w1_c", "n2c1w1_d", "n2c1w1_e", "n2c1w1_f", "n2c1w1_g", "n2c1w1_h", "n2c1w1_i", "n2c1w1_j", "n2c1w1_k", "n2c1w1_l", "n2c1w1_m", "n2c1w1_n", "n2c1w1_o", "n2c1w1_p", "n2c1w1_q", "n2c1w1_r", "n2c1w1_s", "n2c1w1_t", "n2c1w2_a", "n2c1w2_b", "n2c1w2_c", "n2c1w2_d", "n2c1w2_e", "n2c1w2_f", "n2c1w2_g", "n2c1w2_h", "n2c1w2_i", "n2c1w2_j", "n2c1w2_k", "n2c1w2_l", "n2c1w2_m", "n2c1w2_n", "n2c1w2_o", "n2c1w2_p", "n2c1w2_q", "n2c1w2_r", "n2c1w2_s", "n2c1w2_t", "n2c1w4_a", "n2c1w4_b", "n2c1w4_c", "n2c1w4_d", "n2c1w4_e", "n2c1w4_f", "n2c1w4_g", "n2c1w4_h", "n2c1w4_i", "n2c1w4_j", "n2c1w4_k", "n2c1w4_l", "n2c1w4_m", "n2c1w4_n", "n2c1w4_o", "n2c1w4_p", "n2c1w4_q", "n2c1w4_r", "n2c1w4_s", "n2c1w4_t", "n2c2w1_a", "n2c2w1_b", "n2c2w1_c", "n2c2w1_d", "n2c2w1_e", "n2c2w1_f", "n2c2w1_g", "n2c2w1_h", "n2c2w1_i", "n2c2w1_j", "n2c2w1_k", "n2c2w1_l", "n2c2w1_m", "n2c2w1_n", "n2c2w1_o", "n2c2w1_p", "n2c2w1_q", "n2c2w1_r", "n2c2w1_s", "n2c2w1_t", "n2c2w2_a", "n2c2w2_b", "n2c2w2_c", "n2c2w2_d", "n2c2w2_e", "n2c2w2_f", "n2c2w2_g", "n2c2w2_h", "n2c2w2_i", "n2c2w2_j", "n2c2w2_k", "n2c2w2_l", "n2c2w2_m", "n2c2w2_n", "n2c2w2_o", "n2c2w2_p", "n2c2w2_q", "n2c2w2_r", "n2c2w2_s", "n2c2w2_t", "n2c2w4_a", "n2c2w4_b", "n2c2w4_c", "n2c2w4_d", "n2c2w4_e", "n2c2w4_f", "n2c2w4_g", "n2c2w4_h", "n2c2w4_i", "n2c2w4_j", "n2c2w4_k", "n2c2w4_l", "n2c2w4_m", "n2c2w4_n", "n2c2w4_o", "n2c2w4_p", "n2c2w4_q", "n2c2w4_r", "n2c2w4_s", "n2c2w4_t", "n2c3w1_a", "n2c3w1_b", "n2c3w1_c", "n2c3w1_d", "n2c3w1_e", "n2c3w1_f", "n2c3w1_g", "n2c3w1_h", "n2c3w1_i", "n2c3w1_j", "n2c3w1_k", "n2c3w1_l", "n2c3w1_m", "n2c3w1_n", "n2c3w1_o", "n2c3w1_p", "n2c3w1_q", "n2c3w1_r", "n2c3w1_s", "n2c3w1_t", "n2c3w2_a", "n2c3w2_b", "n2c3w2_c", "n2c3w2_d", "n2c3w2_e", "n2c3w2_f", "n2c3w2_g", "n2c3w2_h", "n2c3w2_i", "n2c3w2_j", "n2c3w2_k", "n2c3w2_l", "n2c3w2_m", "n2c3w2_n", "n2c3w2_o", "n2c3w2_p", "n2c3w2_q", "n2c3w2_r", "n2c3w2_s", "n2c3w2_t", "n2c3w4_a", "n2c3w4_b", "n2c3w4_c", "n2c3w4_d", "n2c3w4_e", "n2c3w4_f", "n2c3w4_g", "n2c3w4_h", "n2c3w4_i", "n2c3w4_j", "n2c3w4_k", "n2c3w4_l", "n2c3w4_m", "n2c3w4_n", "n2c3w4_o", "n2c3w4_p", "n2c3w4_q", "n2c3w4_r", "n2c3w4_s", "n2c3w4_t", "n3c1w1_a", "n3c1w1_b", "n3c1w1_c", "n3c1w1_d", "n3c1w1_e", "n3c1w1_f", "n3c1w1_g", "n3c1w1_h", "n3c1w1_i", "n3c1w1_j", "n3c1w1_k", "n3c1w1_l", "n3c1w1_m", "n3c1w1_n", "n3c1w1_o", "n3c1w1_p", "n3c1w1_q", "n3c1w1_r", "n3c1w1_s", "n3c1w1_t", "n3c1w2_a", "n3c1w2_b", "n3c1w2_c", "n3c1w2_d", "n3c1w2_e", "n3c1w2_f", "n3c1w2_g", "n3c1w2_h", "n3c1w2_i", "n3c1w2_j", "n3c1w2_k", "n3c1w2_l", "n3c1w2_m", "n3c1w2_n", "n3c1w2_o", "n3c1w2_p", "n3c1w2_q", "n3c1w2_r", "n3c1w2_s", "n3c1w2_t", "n3c1w4_a", "n3c1w4_b", "n3c1w4_c", "n3c1w4_d", "n3c1w4_e", "n3c1w4_f", "n3c1w4_g", "n3c1w4_h", "n3c1w4_i", "n3c1w4_j", "n3c1w4_k", "n3c1w4_l", "n3c1w4_m", "n3c1w4_n", "n3c1w4_o", "n3c1w4_p", "n3c1w4_q", "n3c1w4_r", "n3c1w4_s", "n3c1w4_t", "n3c2w1_a", "n3c2w1_b", "n3c2w1_c", "n3c2w1_d", "n3c2w1_e", "n3c2w1_f", "n3c2w1_g", "n3c2w1_h", "n3c2w1_i", "n3c2w1_j", "n3c2w1_k", "n3c2w1_l", "n3c2w1_m", "n3c2w1_n", "n3c2w1_o", "n3c2w1_p", "n3c2w1_q", "n3c2w1_r", "n3c2w1_s", "n3c2w1_t", "n3c2w2_a", "n3c2w2_b", "n3c2w2_c", "n3c2w2_d", "n3c2w2_e", "n3c2w2_f", "n3c2w2_g", "n3c2w2_h", "n3c2w2_i", "n3c2w2_j", "n3c2w2_k", "n3c2w2_l", "n3c2w2_m", "n3c2w2_n", "n3c2w2_o", "n3c2w2_p", "n3c2w2_q", "n3c2w2_r", "n3c2w2_s", "n3c2w2_t", "n3c2w4_a", "n3c2w4_b", "n3c2w4_c", "n3c2w4_d", "n3c2w4_e", "n3c2w4_f", "n3c2w4_g", "n3c2w4_h", "n3c2w4_i", "n3c2w4_j", "n3c2w4_k", "n3c2w4_l", "n3c2w4_m", "n3c2w4_n", "n3c2w4_o", "n3c2w4_p", "n3c2w4_q", "n3c2w4_r", "n3c2w4_s", "n3c2w4_t", "n3c3w1_a", "n3c3w1_b", "n3c3w1_c", "n3c3w1_d", "n3c3w1_e", "n3c3w1_f", "n3c3w1_g", "n3c3w1_h", "n3c3w1_i", "n3c3w1_j", "n3c3w1_k", "n3c3w1_l", "n3c3w1_m", "n3c3w1_n", "n3c3w1_o", "n3c3w1_p", "n3c3w1_q", "n3c3w1_r", "n3c3w1_s", "n3c3w1_t", "n3c3w2_a", "n3c3w2_b", "n3c3w2_c", "n3c3w2_d", "n3c3w2_e", "n3c3w2_f", "n3c3w2_g", "n3c3w2_h", "n3c3w2_i", "n3c3w2_j", "n3c3w2_k", "n3c3w2_l", "n3c3w2_m", "n3c3w2_n", "n3c3w2_o", "n3c3w2_p", "n3c3w2_q", "n3c3w2_r", "n3c3w2_s", "n3c3w2_t", "n3c3w4_a", "n3c3w4_b", "n3c3w4_c", "n3c3w4_d", "n3c3w4_e", "n3c3w4_f", "n3c3w4_g", "n3c3w4_h", "n3c3w4_i", "n3c3w4_j", "n3c3w4_k", "n3c3w4_l", "n3c3w4_m", "n3c3w4_n", "n3c3w4_o", "n3c3w4_p", "n3c3w4_q", "n3c3w4_r", "n3c3w4_s", "n3c3w4_t", "n4c1w1_a", "n4c1w1_b", "n4c1w1_c", "n4c1w1_d", "n4c1w1_e", "n4c1w1_f", "n4c1w1_g", "n4c1w1_h", "n4c1w1_i", "n4c1w1_j", "n4c1w1_k", "n4c1w1_l", "n4c1w1_m", "n4c1w1_n", "n4c1w1_o", "n4c1w1_p", "n4c1w1_q", "n4c1w1_r", "n4c1w1_s", "n4c1w1_t", "n4c1w2_a", "n4c1w2_b", "n4c1w2_c", "n4c1w2_d", "n4c1w2_e", "n4c1w2_f", "n4c1w2_g", "n4c1w2_h", "n4c1w2_i", "n4c1w2_j", "n4c1w2_k", "n4c1w2_l", "n4c1w2_m", "n4c1w2_n", "n4c1w2_o", "n4c1w2_p", "n4c1w2_q", "n4c1w2_r", "n4c1w2_s", "n4c1w2_t", "n4c1w4_a", "n4c1w4_b", "n4c1w4_c", "n4c1w4_d", "n4c1w4_e", "n4c1w4_f", "n4c1w4_g", "n4c1w4_h", "n4c1w4_i", "n4c1w4_j", "n4c1w4_k", "n4c1w4_l", "n4c1w4_m", "n4c1w4_n", "n4c1w4_o", "n4c1w4_p", "n4c1w4_q", "n4c1w4_r", "n4c1w4_s", "n4c1w4_t", "n4c2w1_a", "n4c2w1_b", "n4c2w1_c", "n4c2w1_d", "n4c2w1_e", "n4c2w1_f", "n4c2w1_g", "n4c2w1_h", "n4c2w1_i", "n4c2w1_j", "n4c2w1_k", "n4c2w1_l", "n4c2w1_m", "n4c2w1_n", "n4c2w1_o", "n4c2w1_p", "n4c2w1_q", "n4c2w1_r", "n4c2w1_s", "n4c2w1_t", "n4c2w2_a", "n4c2w2_b", "n4c2w2_c", "n4c2w2_d", "n4c2w2_e", "n4c2w2_f", "n4c2w2_g", "n4c2w2_h", "n4c2w2_i", "n4c2w2_j", "n4c2w2_k", "n4c2w2_l", "n4c2w2_m", "n4c2w2_n", "n4c2w2_o", "n4c2w2_p", "n4c2w2_q", "n4c2w2_r", "n4c2w2_s", "n4c2w2_t", "n4c2w4_a", "n4c2w4_b", "n4c2w4_c", "n4c2w4_d", "n4c2w4_e", "n4c2w4_f", "n4c2w4_g", "n4c2w4_h", "n4c2w4_i", "n4c2w4_j", "n4c2w4_k", "n4c2w4_l", "n4c2w4_m", "n4c2w4_n", "n4c2w4_o", "n4c2w4_p", "n4c2w4_q", "n4c2w4_r", "n4c2w4_s", "n4c2w4_t", "n4c3w1_a", "n4c3w1_b", "n4c3w1_c", "n4c3w1_d", "n4c3w1_e", "n4c3w1_f", "n4c3w1_g", "n4c3w1_h", "n4c3w1_i", "n4c3w1_j", "n4c3w1_k", "n4c3w1_l", "n4c3w1_m", "n4c3w1_n", "n4c3w1_o", "n4c3w1_p", "n4c3w1_q", "n4c3w1_r", "n4c3w1_s", "n4c3w1_t", "n4c3w2_a", "n4c3w2_b", "n4c3w2_c", "n4c3w2_d", "n4c3w2_e", "n4c3w2_f", "n4c3w2_g", "n4c3w2_h", "n4c3w2_i", "n4c3w2_j", "n4c3w2_k", "n4c3w2_l", "n4c3w2_m", "n4c3w2_n", "n4c3w2_o", "n4c3w2_p", "n4c3w2_q", "n4c3w2_r", "n4c3w2_s", "n4c3w2_t", "n4c3w4_a", "n4c3w4_b", "n4c3w4_c", "n4c3w4_d", "n4c3w4_e", "n4c3w4_f", "n4c3w4_g", "n4c3w4_h", "n4c3w4_i", "n4c3w4_j", "n4c3w4_k", "n4c3w4_l", "n4c3w4_m", "n4c3w4_n", "n4c3w4_o", "n4c3w4_p", "n4c3w4_q", "n4c3w4_r", "n4c3w4_s", "n4c3w4_t", "n1w1b1r0", "n1w1b1r1", "n1w1b1r2", "n1w1b1r3", "n1w1b1r4", "n1w1b1r5", "n1w1b1r6", "n1w1b1r7", "n1w1b1r8", "n1w1b1r9", "n1w1b2r0", "n1w1b2r1", "n1w1b2r2", "n1w1b2r3", "n1w1b2r4", "n1w1b2r5", "n1w1b2r6", "n1w1b2r7", "n1w1b2r8", "n1w1b2r9", "n1w1b3r0", "n1w1b3r1", "n1w1b3r2", "n1w1b3r3", "n1w1b3r4", "n1w1b3r5", "n1w1b3r6", "n1w1b3r7", "n1w1b3r8", "n1w1b3r9", "n1w2b1r0", "n1w2b1r1", "n1w2b1r2", "n1w2b1r3", "n1w2b1r4", "n1w2b1r5", "n1w2b1r6", "n1w2b1r7", "n1w2b1r8", "n1w2b1r9", "n1w2b2r0", "n1w2b2r1", "n1w2b2r2", "n1w2b2r3", "n1w2b2r4", "n1w2b2r5", "n1w2b2r6", "n1w2b2r7", "n1w2b2r8", "n1w2b2r9", "n1w2b3r0", "n1w2b3r1", "n1w2b3r2", "n1w2b3r3", "n1w2b3r4", "n1w2b3r5", "n1w2b3r6", "n1w2b3r7", "n1w2b3r8", "n1w2b3r9", "n1w3b1r0", "n1w3b1r1", "n1w3b1r2", "n1w3b1r3", "n1w3b1r4", "n1w3b1r5", "n1w3b1r6", "n1w3b1r7", "n1w3b1r8", "n1w3b1r9", "n1w3b2r0", "n1w3b2r1", "n1w3b2r2", "n1w3b2r3", "n1w3b2r4", "n1w3b2r5", "n1w3b2r6", "n1w3b2r7", "n1w3b2r8", "n1w3b2r9", "n1w3b3r0", "n1w3b3r1", "n1w3b3r2", "n1w3b3r3", "n1w3b3r4", "n1w3b3r5", "n1w3b3r6", "n1w3b3r7", "n1w3b3r8", "n1w3b3r9", "n1w4b1r0", "n1w4b1r1", "n1w4b1r2", "n1w4b1r3", "n1w4b1r4", "n1w4b1r5", "n1w4b1r6", "n1w4b1r7", "n1w4b1r8", "n1w4b1r9", "n1w4b2r0", "n1w4b2r1", "n1w4b2r2", "n1w4b2r3", "n1w4b2r4", "n1w4b2r5", "n1w4b2r6", "n1w4b2r7", "n1w4b2r8", "n1w4b2r9", "n1w4b3r0", "n1w4b3r1", "n1w4b3r2", "n1w4b3r3", "n1w4b3r4", "n1w4b3r5", "n1w4b3r6", "n1w4b3r7", "n1w4b3r8", "n1w4b3r9", "n2w1b1r0", "n2w1b1r1", "n2w1b1r2", "n2w1b1r3", "n2w1b1r4", "n2w1b1r5", "n2w1b1r6", "n2w1b1r7", "n2w1b1r8", "n2w1b1r9", "n2w1b2r0", "n2w1b2r1", "n2w1b2r2", "n2w1b2r3", "n2w1b2r4", "n2w1b2r5", "n2w1b2r6", "n2w1b2r7", "n2w1b2r8", "n2w1b2r9", "n2w1b3r0", "n2w1b3r1", "n2w1b3r2", "n2w1b3r3", "n2w1b3r4", "n2w1b3r5", "n2w1b3r6", "n2w1b3r7", "n2w1b3r8", "n2w1b3r9", "n2w2b1r0", "n2w2b1r1", "n2w2b1r2", "n2w2b1r3", "n2w2b1r4", "n2w2b1r5", "n2w2b1r6", "n2w2b1r7", "n2w2b1r8", "n2w2b1r9", "n2w2b2r0", "n2w2b2r1", "n2w2b2r2", "n2w2b2r3", "n2w2b2r4", "n2w2b2r5", "n2w2b2r6", "n2w2b2r7", "n2w2b2r8", "n2w2b2r9", "n2w2b3r0", "n2w2b3r1", "n2w2b3r2", "n2w2b3r3", "n2w2b3r4", "n2w2b3r5", "n2w2b3r6", "n2w2b3r7", "n2w2b3r8", "n2w2b3r9", "n2w3b1r0", "n2w3b1r1", "n2w3b1r2", "n2w3b1r3", "n2w3b1r4", "n2w3b1r5", "n2w3b1r6", "n2w3b1r7", "n2w3b1r8", "n2w3b1r9", "n2w3b2r0", "n2w3b2r1", "n2w3b2r2", "n2w3b2r3", "n2w3b2r4", "n2w3b2r5", "n2w3b2r6", "n2w3b2r7", "n2w3b2r8", "n2w3b2r9", "n2w3b3r0", "n2w3b3r1", "n2w3b3r2", "n2w3b3r3", "n2w3b3r4", "n2w3b3r5", "n2w3b3r6", "n2w3b3r7", "n2w3b3r8", "n2w3b3r9", "n2w4b1r0", "n2w4b1r1", "n2w4b1r2", "n2w4b1r3", "n2w4b1r4", "n2w4b1r5", "n2w4b1r6", "n2w4b1r7", "n2w4b1r8", "n2w4b1r9", "n2w4b2r0", "n2w4b2r1", "n2w4b2r2", "n2w4b2r3", "n2w4b2r4", "n2w4b2r5", "n2w4b2r6", "n2w4b2r7", "n2w4b2r8", "n2w4b2r9", "n2w4b3r0", "n2w4b3r1", "n2w4b3r2", "n2w4b3r3", "n2w4b3r4", "n2w4b3r5", "n2w4b3r6", "n2w4b3r7", "n2w4b3r8", "n2w4b3r9", "n3w1b1r0", "n3w1b1r1", "n3w1b1r2", "n3w1b1r3", "n3w1b1r4", "n3w1b1r5", "n3w1b1r6", "n3w1b1r7", "n3w1b1r8", "n3w1b1r9", "n3w1b2r0", "n3w1b2r1", "n3w1b2r2", "n3w1b2r3", "n3w1b2r4", "n3w1b2r5", "n3w1b2r6", "n3w1b2r7", "n3w1b2r8", "n3w1b2r9", "n3w1b3r0", "n3w1b3r1", "n3w1b3r2", "n3w1b3r3", "n3w1b3r4", "n3w1b3r5", "n3w1b3r6", "n3w1b3r7", "n3w1b3r8", "n3w1b3r9", "n3w2b1r0", "n3w2b1r1", "n3w2b1r2", "n3w2b1r3", "n3w2b1r4", "n3w2b1r5", "n3w2b1r6", "n3w2b1r7", "n3w2b1r8", "n3w2b1r9", "n3w2b2r0", "n3w2b2r1", "n3w2b2r2", "n3w2b2r3", "n3w2b2r4", "n3w2b2r5", "n3w2b2r6", "n3w2b2r7", "n3w2b2r8", "n3w2b2r9", "n3w2b3r0", "n3w2b3r1", "n3w2b3r2", "n3w2b3r3", "n3w2b3r4", "n3w2b3r5", "n3w2b3r6", "n3w2b3r7", "n3w2b3r8", "n3w2b3r9", "n3w3b1r0", "n3w3b1r1", "n3w3b1r2", "n3w3b1r3", "n3w3b1r4", "n3w3b1r5", "n3w3b1r6", "n3w3b1r7", "n3w3b1r8", "n3w3b1r9", "n3w3b2r0", "n3w3b2r1", "n3w3b2r2", "n3w3b2r3", "n3w3b2r4", "n3w3b2r5", "n3w3b2r6", "n3w3b2r7", "n3w3b2r8", "n3w3b2r9", "n3w3b3r0", "n3w3b3r1", "n3w3b3r2", "n3w3b3r3", "n3w3b3r4", "n3w3b3r5", "n3w3b3r6", "n3w3b3r7", "n3w3b3r8", "n3w3b3r9", "n3w4b1r0", "n3w4b1r1", "n3w4b1r2", "n3w4b1r3", "n3w4b1r4", "n3w4b1r5", "n3w4b1r6", "n3w4b1r7", "n3w4b1r8", "n3w4b1r9", "n3w4b2r0", "n3w4b2r1", "n3w4b2r2", "n3w4b2r3", "n3w4b2r4", "n3w4b2r5", "n3w4b2r6", "n3w4b2r7", "n3w4b2r8", "n3w4b2r9", "n3w4b3r0", "n3w4b3r1", "n3w4b3r2", "n3w4b3r3", "n3w4b3r4", "n3w4b3r5", "n3w4b3r6", "n3w4b3r7", "n3w4b3r8", "n3w4b3r9", "n4w1b1r0", "n4w1b1r1", "n4w1b1r2", "n4w1b1r3", "n4w1b1r4", "n4w1b1r5", "n4w1b1r6", "n4w1b1r7", "n4w1b1r8", "n4w1b1r9", "n4w1b2r0", "n4w1b2r1", "n4w1b2r2", "n4w1b2r3", "n4w1b2r4", "n4w1b2r5", "n4w1b2r6", "n4w1b2r7", "n4w1b2r8", "n4w1b2r9", "n4w1b3r0", "n4w1b3r1", "n4w1b3r2", "n4w1b3r3", "n4w1b3r4", "n4w1b3r5", "n4w1b3r6", "n4w1b3r7", "n4w1b3r8", "n4w1b3r9", "n4w2b1r0", "n4w2b1r1", "n4w2b1r2", "n4w2b1r3", "n4w2b1r4", "n4w2b1r5", "n4w2b1r6", "n4w2b1r7", "n4w2b1r8", "n4w2b1r9", "n4w2b2r0", "n4w2b2r1", "n4w2b2r2", "n4w2b2r3", "n4w2b2r4", "n4w2b2r5", "n4w2b2r6", "n4w2b2r7", "n4w2b2r8", "n4w2b2r9", "n4w2b3r0", "n4w2b3r1", "n4w2b3r2", "n4w2b3r3", "n4w2b3r4", "n4w2b3r5", "n4w2b3r6", "n4w2b3r7", "n4w2b3r8", "n4w2b3r9", "n4w3b1r0", "n4w3b1r1", "n4w3b1r2", "n4w3b1r3", "n4w3b1r4", "n4w3b1r5", "n4w3b1r6", "n4w3b1r7", "n4w3b1r8", "n4w3b1r9", "n4w3b2r0", "n4w3b2r1", "n4w3b2r2", "n4w3b2r3", "n4w3b2r4", "n4w3b2r5", "n4w3b2r6", "n4w3b2r7", "n4w3b2r8", "n4w3b2r9", "n4w3b3r0", "n4w3b3r1", "n4w3b3r2", "n4w3b3r3", "n4w3b3r4", "n4w3b3r5", "n4w3b3r6", "n4w3b3r7", "n4w3b3r8", "n4w3b3r9", "n4w4b1r0", "n4w4b1r1", "n4w4b1r2", "n4w4b1r3", "n4w4b1r4", "n4w4b1r5", "n4w4b1r6", "n4w4b1r7", "n4w4b1r8", "n4w4b1r9", "n4w4b2r0", "n4w4b2r1", "n4w4b2r2", "n4w4b2r3", "n4w4b2r4", "n4w4b2r5", "n4w4b2r6", "n4w4b2r7", "n4w4b2r8", "n4w4b2r9", "n4w4b3r0", "n4w4b3r1", "n4w4b3r2", "n4w4b3r3", "n4w4b3r4", "n4w4b3r5", "n4w4b3r6", "n4w4b3r7", "n4w4b3r8", "n4w4b3r9", "hard0", "hard1", "hard2", "hard3", "hard4", "hard5", "hard6", "hard7", "hard8", "hard9", "t60_00", "t60_01", "t60_02", "t60_03", "t60_04", "t60_05", "t60_06", "t60_07", "t60_08", "t60_09", "t60_10", "t60_11", "t60_12", "t60_13", "t60_14", "t60_15", "t60_16", "t60_17", "t60_18", "t60_19", "u120_00", "u120_01", "u120_02", "u120_03", "u120_04", "u120_05", "u120_06", "u120_07", "u120_08", "u120_09", "u120_10", "u120_11", "u120_12", "u120_13", "u120_14", "u120_15", "u120_16", "u120_17", "u120_18", "u120_19", "u250_00", "u250_01", "u250_02", "u250_03", "u250_04", "u250_05", "u250_06", "u250_07", "u250_08", "u250_09", "u250_10", "u250_11", "u250_12", "u250_13", "u250_14", "u250_15", "u250_16", "u250_17", "u250_18", "u250_19", "u500_00", "u500_01", "u500_02", "u500_03", "u500_04", "u500_05", "u500_06", "u500_07", "u500_08", "u500_09", "u500_10", "u500_11", "u500_12", "u500_13", "u500_14", "u500_15", "u500_16", "u500_17", "u500_18", "u500_19", "u1000_00", "u1000_01", "u1000_02", "u1000_03", "u1000_04", "u1000_05", "u1000_06", "u1000_07", "u1000_08", "u1000_09", "u1000_10", "u1000_11", "u1000_12", "u1000_13", "u1000_14", "u1000_15", "u1000_16", "u1000_17", "u1000_18", "u1000_19", "t120_00", "t120_01", "t120_02", "t120_03", "t120_04", "t120_05", "t120_06", "t120_07", "t120_08", "t120_09", "t120_10", "t120_11", "t120_12", "t120_13", "t120_14", "t120_15", "t120_16", "t120_17", "t120_18", "t120_19", "t249_00", "t249_01", "t249_02", "t249_03", "t249_04", "t249_05", "t249_06", "t249_07", "t249_08", "t249_09", "t249_10", "t249_11", "t249_12", "t249_13", "t249_14", "t249_15", "t249_16", "t249_17", "t249_18", "t249_19", "t501_00", "t501_01", "t501_02", "t501_03", "t501_04", "t501_05", "t501_06", "t501_07", "t501_08", "t501_09", "t501_10", "t501_11", "t501_12", "t501_13", "t501_14", "t501_15", "t501_16", "t501_17", "t501_18", "t501_19", NULL }; } // STATISTICS: example-any gecode-4.2.1/examples/black-hole.cpp0000644000175000010010000002417512166527420016422 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Mikael Lagerkvist * * Copyright: * Mikael Lagerkvist, 2006 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include #include using namespace Gecode; namespace { using std::vector; /// Layout of the cards vector > layout; /// information for locating particular cards in the layout vector layer, pile; /** \brief Generates\ref layout. * * This function generates the layeout and intializes \ref layer and * \ref pile from it. The layout is randomly generated from the * supplied seed. */ void generate(int seed) { // The layout consists of 17 piles of 3 cards each layout = vector >(17, vector(3)); // Deck without the Ace of Spades vector deck(51); for (int i = 51; i--; ) deck[i] = i+1; Support::RandomGenerator rnd(seed+1); std::random_shuffle(deck.begin(), deck.end(), rnd); // Place cards from deck int pos = 0; for (int i = 17; i--; ) for (int j = 3; j--; ) layout[i][j] = deck[pos++]; // Location-information for each card layer = vector(52); pile = vector(52); for (int i = 17; i--; ) { for (int j = 3; j--; ) { layer[layout[i][j]] = j; pile[ layout[i][j]] = i; } } } } /** * \brief %Example: Black hole patience * * This example solves instances of the black-hole patience game. * * The model of the problem is mostly taken from "Search in the * Patience Game 'Black Hole'", by Ian P. Gent, Chris Jefferson, Tom * Kelsey, Inês Lynce, Ian Miguel, Peter Nightingale, Barbara * M. Smith, and S. Armagan Tarim. * * The conditional symmetry identified in the above paper can be * eliminated (enabled by default). * * \ingroup Example * */ class BlackHole : public Script { protected: IntVarArray x, ///< Card at position y; ///< Position of card /// Return a string representing the card of value val std::string card(int val) const { const char* suit = "SCHD"; std::ostringstream o; o << std::setw(2) << (1 + (val%13)) << suit[val/13]; return o.str(); } public: /// Symmetry variants enum { SYMMETRY_NONE, ///< No symmetry breaking SYMMETRY_CONDITIONAL ///< Breaking conditional symmetries }; /// Propagation of placement-rules enum { PROPAGATION_REIFIED, ///< Reified propagation PROPAGATION_DFA, ///< Extensional propagation using automatons PROPAGATION_TUPLE_SET ///< Extensional propagation using tables }; /// Actual model BlackHole(const SizeOptions& opt) : x(*this, 52, 0,51), y(*this, 52, 0,51) { // Black ace at bottom rel(*this, x[0], IRT_EQ, 0); // x is order and y is placement channel(*this, x, y, opt.icl()); // The placement rules: the absolute value of the difference // between two consecutive cards is 1 or 12. if (opt.propagation() == PROPAGATION_REIFIED) { // Build table for accessing the rank of a card IntArgs modtable(52); for (int i = 0; i < 52; ++i) { modtable[i] = i%13; } for (int i = 0; i < 51; ++i) { IntVar x1(*this, 0, 12), x2(*this, 0, 12); element(*this, modtable, x[i], x1); element(*this, modtable, x[i+1], x2); const int dr[2] = {1, 12}; IntVar diff(*this, IntSet(dr, 2)); rel(*this, abs(x1-x2) == diff, ICL_DOM); } } else if (opt.propagation() == PROPAGATION_DFA) { // Build table for allowed tuples REG expression; for (int r = 13; r--; ) { for (int s1 = 4; s1--; ) { for (int s2 = 4; s2--; ) { for (int i = -1; i <= 1; i+=2) { REG r1 = REG(r+13*s1); REG r2 = REG((r+i+52+13*s2)%52); REG r = r1 + r2; expression |= r; } } } } DFA table(expression); for (int i = 51; i--; ) extensional(*this, IntVarArgs() << x[i] << x[i+1], table); } else { // opt.propagation() == PROPAGATION_TUPLE_SET) // Build table for allowed tuples TupleSet tupleSet; for (int r = 13; r--; ) for (int s1 = 4; s1--; ) for (int s2 = 4; s2--; ) for (int i = -1; i <= 1; i+=2) { tupleSet.add(IntArgs(2, r+13*s1, (r+i+52+13*s2)%52)); } tupleSet.finalize(); for (int i = 51; i--; ) extensional(*this, IntVarArgs() << x[i] << x[i+1], tupleSet); } // A card must be played before the one under it. for (int i = 17; i--; ) for (int j = 2; j--; ) rel(*this, y[layout[i][j]] < y[layout[i][j+1]]); // Compute and break the conditional symmetries that are dependent // on the current layout. // Two cards with the same rank but different suits are symmetric // with respect to their placement in the black hole if changing // their order does not affect any other card. if (opt.symmetry() == SYMMETRY_CONDITIONAL) { // For all ranks for (int r = 13; r--; ) { // For all pairs of suits for (int s1 = 4; s1--; ) { for (int s2 = s1; s2--; ) { int c1 = 13*s1 + r, c2 = 13*s2 + r; // The ace of spades is already placed if (c1 == 0 || c2 == 0) continue; // Piles are handled by the rules of the game if (pile[c1] == pile[c2]) continue; // Fix the right order of the cards int o1 = c1, o2 = c2; if (pile[c1] > pile[c2] && layer[c2] >= layer[c1]) std::swap(o1, o2); // cond is the condition for the symmetry BoolVarArgs ba; // Both cards played after the ones on top of them for (int i = 0; i < layer[o1]; ++i) ba << expr(*this, (y[layout[pile[o1]][i]] < y[o2])); for (int i = 0; i < layer[o2]; ++i) ba << expr(*this, (y[layout[pile[o2]][i]] < y[o1])); // Both cards played before the ones under them for (int i = layer[o1]+1; i < 3; ++i) ba << expr(*this, (y[o2] < y[layout[pile[o1]][i]])); for (int i = layer[o2]+1; i < 3; ++i) ba << expr(*this, (y[o1] < y[layout[pile[o2]][i]])); // Cond holds when all the above holds BoolVar cond(*this, 0, 1); rel(*this, BOT_AND, ba, cond); // If cond is fulfilled, then we can order the cards // cond -> (y[o1] < y[o2]) rel(*this, !cond || (y[o1] < y[o2])); } } } } // Install custom brancher branch(*this, x, INT_VAR_NONE(), INT_VAL(&val)); } /// Value selection function for branching static int val(const Space&, IntVar x, int) { int v = -1; int w = 4; for (IntVarValues vals(x); vals(); ++vals) if (layer[vals.val()] < w) { v = vals.val(); if ((w = layer[vals.val()]) == 0) break; } assert(v >= 1 && v < 52); return v; } /// Print instance and solution virtual void print(std::ostream& os) const { os << "Layout:" << std::endl; for (int i = 0; i < 17; i++) { for (int j = 0; j < 3; j++) os << card(layout[i][j]) << " "; if ((i+1) % 3 == 0) os << std::endl; else os << " \t"; } os << std::endl << std::endl; os << "Solution:" << std::endl; for (int i = 0; i < 52; ++i) { if (x[i].assigned()) os << card(x[i].val()) << " "; else os << " "; if ((i + 1) % 13 == 0) os << std::endl; } os << std::endl; os << std::endl; } /// Constructor for cloning \a s BlackHole(bool share, BlackHole& s) : Script(share,s) { x.update(*this, share, s.x); y.update(*this, share, s.y); } /// Copy during cloning virtual Space* copy(bool share) { return new BlackHole(share,*this); } }; /** \brief Main-function * \relates BlackHole */ int main(int argc, char* argv[]) { SizeOptions opt("Black Hole patience"); opt.symmetry(BlackHole::SYMMETRY_CONDITIONAL); opt.symmetry(BlackHole::SYMMETRY_NONE,"none", "no symmetry breaking"); opt.symmetry(BlackHole::SYMMETRY_CONDITIONAL,"conditional", "break conditional symmetries"); opt.propagation(BlackHole::PROPAGATION_DFA); opt.propagation(BlackHole::PROPAGATION_REIFIED, "reified", "use reified propagation"); opt.propagation(BlackHole::PROPAGATION_DFA, "dfa", "use DFA-based extensional propagation"); opt.propagation(BlackHole::PROPAGATION_TUPLE_SET, "tuple-set", "use TupleSet-based extensional propagation"); opt.icl(ICL_DOM); opt.parse(argc,argv); // Generates the new board generate(opt.size()); Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/car-sequencing.cpp0000644000175000010010000004226612166527420017326 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Mikael Lagerkvist * * Copyright: * Mikael Lagerkvist, 2009 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include using namespace Gecode; // Problems namespace { // Problem data extern const int* problems[]; // Number of problems extern const unsigned int n_problems; } namespace { /** * \brief %Options for car sequencing problems * * \relates CarSequence */ class CarOptions : public SizeOptions { private: /// Max slack parameter Driver::UnsignedIntOption _maxstall; public: /// Initialize options for example with name \a s CarOptions(const char* s) : SizeOptions(s), _maxstall("-maxstall", "Maximum numbere of stalls", 30) { // Add options add(_maxstall); } /// Parse options from arguments \a argv (number is \a argc) void parse(int& argc, char* argv[]) { SizeOptions::parse(argc,argv); } /// Get max stalls int maxstall(void) const { return _maxstall.value(); } }; /** * \brief Propagator that pushes all occurences of a value to the end. * * This propagator uses a variable array \f$x=\langle * x_1,x_2,\ldots,x_n\rangle\f$, a variable \f$y\f$, and a value * \f$val\f$. It It makes sure that the last \f$y\f$ variables of * \f$x\f$ are assigned the value, and that the value does not * appear in the rest of the array. Furthermore, the constriant * ensure that \$fval\$f isnot adjacent to \$fval-1\$f. * * Since the propagator is custom-made for the car sequencing * example, it relies on the fact that the value will be equal to * the upper bound to speed up computation. For example, it can * safely rely on only subscribing to bound events. * * \relates CarSequence */ template class PushToEnd : public NaryOnePropagator { protected: using NaryOnePropagator::x; using NaryOnePropagator::y; int val; /// Constructor for cloning \a p PushToEnd(Space& home, bool share, PushToEnd& p); /// Constructor for posting PushToEnd(Space& home, ViewArray& x0, View y0, int val0); public: /// Constructor for rewriting \a p during cloning PushToEnd(Space& home, bool share, Propagator& p, ViewArray& x0, View y0, int val0); /// Copy propagator during cloning virtual Actor* copy(Space& home, bool share); /// Perform propagation virtual ExecStatus propagate(Space& home, const ModEventDelta& med); /// Post propagator static ExecStatus post(Space& home, ViewArray& x0, View y0, int val0); }; template inline PushToEnd::PushToEnd(Space& home, ViewArray& x0, View y0, int val0) : NaryOnePropagator(home,x0,y0), val(val0) {} template ExecStatus PushToEnd::post(Space& home, ViewArray& x0, View y0, int val0) { (void) new (home) PushToEnd(home,x0,y0,val0); return ES_OK; } template inline PushToEnd::PushToEnd(Space& home, bool share, PushToEnd& p) : NaryOnePropagator(home,share,p), val(p.val) {} template inline PushToEnd::PushToEnd(Space& home, bool share, Propagator& p, ViewArray& x0, View y0, int val0) : NaryOnePropagator(home,share,p,x0,y0), val(val0) {} template Actor* PushToEnd::copy(Space& home, bool share) { return new (home) PushToEnd(home,share,*this); } template ExecStatus PushToEnd::propagate(Space& home, const ModEventDelta&) { // Find number of required positions int min = 0; for (int i = x.size(); i-- && x[i].min() >= val-1; ) { ++min; } // Find number of possible positions int max = 0; { int i = x.size(); while (i--) { if (x[i].max() != val) break; ++max; if (max >= y.max()) break; } // No variables later than max can have value val while (i--) { GECODE_ME_CHECK(x[i].le(home, val)); } } // Constrain y to be in {min..max} GECODE_ME_CHECK(y.gq(home, min)); GECODE_ME_CHECK(y.lq(home, max)); // At least the y.min() last values have value val for (int i = 0, pos = x.size()-1; i < y.min(); ++i, --pos) { GECODE_ME_CHECK(x[pos].eq(home, val)); } return y.assigned() ? home.ES_SUBSUMED(*this) : ES_FIX; } /** \brief Post PushToEnd propagator. */ void pushtoend(Space& home, IntVarArgs x, IntVar y, int val) { ViewArray vx(home, x); Int::IntView vy(y); GECODE_ES_FAIL(PushToEnd::post(home, vx, vy, val)); } } /** * \brief %Example: Car sequencing * * See problem 1 at http://www.csplib.org/. * * This model uses extra stall-slots instead of violations, as proposed * in "Combining Forces to Solve the Car Sequencing Problem", Perron * and Shaw, CPAIOR 2004. * * \ingroup Example */ class CarSequencing : public Script { public: /// Branching variants enum { BRANCH_INORDER, ///< Branch from left to right BRANCH_MIDDLE ///< Branch from middle out }; /// Propagation variants enum { PROP_REGULAR, ///< Use regular constraints PROP_CUSTOM ///< Use custom constraint }; protected: /// Problem number const int problem; /// Number of cars const int ncars; /// Number of options const int noptions; /// Number of classes const int nclasses; /// Maximum number of stalls const int maxstall; /// Stall number const int stallval; /// End number const int endval; /// Number of stalls (cost to minimize) IntVar nstall; /// Number of end markers IntVar nend; /// Sequence of cars produced IntVarArray s; public: /// Initial model CarSequencing(const CarOptions& opt) : problem(opt.size()), ncars(problems[problem][0]), noptions(problems[problem][1]), nclasses(problems[problem][2]), maxstall(opt.maxstall()), stallval(nclasses), endval(nclasses+1), nstall(*this, 0, maxstall), nend(*this, 0, maxstall), s(*this, ncars+maxstall, 0, nclasses+1) { // Read problem const int* probit = problems[problem] + 3; // Sequence requirements for the options. IntArgs max(noptions), block(noptions); for (int i = 0; i < noptions; ++i ) { max[i] = *probit++; } for (int i = 0; i < noptions; ++i ) { block[i] = *probit++; } // Number of cars per class IntArgs ncc(nclasses); // What classes require an option IntSetArgs classes(noptions); int** cdata = new int*[noptions]; for (int i = noptions; i--; ) cdata[i] = new int[nclasses]; int* n = new int[noptions]; for (int i = noptions; i--; ) n[i] = 0; // Read data for (int c = 0; c < nclasses; ++c) { probit++; ncc[c] = *probit++; for (int o = 0; o < noptions; ++o) { if (*probit++) { cdata[o][n[o]++] = c; } } } // Transfer specification data to int-sets for (int o = noptions; o--; ) { classes[o] = IntSet(cdata[o], n[o]); delete [] cdata[o]; } delete [] cdata; delete [] n; // Count the cars { IntSetArgs c(nclasses+2); for (int i = nclasses; i--; ) { c[i] = IntSet(ncc[i], ncc[i]); } c[stallval] = IntSet(0, maxstall); c[ endval] = IntSet(0, maxstall); count(*this, s, c); } // Count number of end and stalls count(*this, s, stallval, IRT_EQ, nstall); count(*this, s, endval, IRT_EQ, nend); rel(*this, nstall+nend == maxstall); // Make sure nothing is overloaded IntSet one(1, 1); for (int o = noptions; o--; ) { // sb[i] reflects if car s[i] has option o BoolVarArgs sb(s.size()); for (int i = s.size(); i--; ) { BoolVar b(*this, 0, 1); dom(*this, s[i], classes[o], b); sb[i] = b; } sequence(*this, sb, one, block[o], 0, max[o]); } // End-markers located at end only switch (opt.propagation()) { case PROP_REGULAR: { IntArgs notend(nclasses), notstallend(nclasses+1); for (int i = nclasses; i--; ) { notend[i] = i; notstallend[i] = i; } notstallend[nclasses] = stallval; REG r = *REG(notend) + REG(notstallend) + *REG(endval); extensional(*this, s, r); for (int pos = s.size()-1, i = 0; i < maxstall; ++i, --pos) { rel(*this, (nend > i) >> (s[pos]==endval)); } } break; case PROP_CUSTOM: { pushtoend(*this, s, nend, endval); } break; } // Branching switch (opt.branching()) { case BRANCH_INORDER: branch(*this, s, INT_VAR_NONE(), INT_VAL_MIN()); break; case BRANCH_MIDDLE: { IntVarArgs m(s.size()); int mid = s.size() / 2; int pos = 0; m[pos++] = s[mid]; for (int i = 1; i <= m.size()/2; ++i) { if (mid-i >= 0) m[pos++] = s[mid-i]; if (mid+i < s.size()) m[pos++] = s[mid+i]; } assert(pos == m.size()); branch(*this, m, INT_VAR_NONE(), INT_VAL_MIN()); break; } } } /// Return cost virtual void constrain(const Space& _best) { const CarSequencing& best = static_cast(_best); rel(*this, nstall, IRT_LE, best.nstall.val()); } /// Print solution virtual void print(std::ostream& os) const { int width = nclasses > 9 ? 2 : 1; const char* space = nclasses > 9 ? " " : ""; os << "Stall slots=" << nstall << ", End slots=" << nend << std::endl; int i = 0; for (; i < s.size(); ++i) { if (s[i].assigned()) { int v = s[i].val(); if (v == endval) break; if (v == stallval) os << space << "_ "; else os << std::setw(width) << v << " "; } else { os << space << "? "; } if ((i+1)%20 == 0) os << std::endl; } if (i%20) os << std::endl; os << std::endl; } /// Constructor for cloning \a s CarSequencing(bool share, CarSequencing& cs) : Script(share,cs), problem(cs.problem), ncars(cs.ncars), noptions(cs.noptions), nclasses(cs.nclasses), maxstall(cs.maxstall), stallval(cs.stallval), endval(cs.endval) { nstall.update(*this, share, cs.nstall); nend.update(*this, share, cs.nend); s.update(*this, share, cs.s); } /// Copy during cloning virtual Space* copy(bool share) { return new CarSequencing(share,*this); } }; /** \brief Main-function * \relates CarSequencing */ int main(int argc, char* argv[]) { CarOptions opt("CarSequencing"); opt.solutions(0); opt.size(0); opt.branching(CarSequencing::BRANCH_INORDER); opt.branching(CarSequencing::BRANCH_INORDER, "inorder"); opt.branching(CarSequencing::BRANCH_MIDDLE, "middle"); opt.propagation(CarSequencing::PROP_CUSTOM); opt.propagation(CarSequencing::PROP_REGULAR, "regular"); opt.propagation(CarSequencing::PROP_CUSTOM, "custom"); opt.parse(argc,argv); if (opt.size() >= n_problems) { std::cerr << "Error: size must be between 0 and " << n_problems-1 << std::endl; return 1; } Script::run(opt); return 0; } namespace { /// Problems from CSPLib /// Simple initial example const int p0[] = { 10, 5, 6, 1, 2, 1, 2, 1, 2, 3, 3, 5, 5, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 2, 2, 0, 1, 0, 0, 1, 3, 2, 0, 1, 0, 1, 0, 4, 2, 1, 0, 1, 0, 0, 5, 2, 1, 1, 0, 0, 0 }; // --------------------------------- // Problem 4/72 (Regin & Puget // 1) // --------------------------------- const int p1[] = { 100, 5, 22, 1, 2, 1, 2, 1, 2, 3, 3, 5, 5, 0, 6, 1, 0, 0, 1, 0, 1, 10, 1, 1, 1, 0, 0, 2, 2, 1, 1, 0, 0, 1, 3, 2, 0, 1, 1, 0, 0, 4, 8, 0, 0, 0, 1, 0, 5, 15, 0, 1, 0, 0, 0, 6, 1, 0, 1, 1, 1, 0, 7, 5, 0, 0, 1, 1, 0, 8, 2, 1, 0, 1, 1, 0, 9, 3, 0, 0, 1, 0, 0, 10, 2, 1, 0, 1, 0, 0, 11, 1, 1, 1, 1, 0, 1, 12, 8, 0, 1, 0, 1, 0, 13, 3, 1, 0, 0, 1, 1, 14, 10, 1, 0, 0, 0, 0, 15, 4, 0, 1, 0, 0, 1, 16, 4, 0, 0, 0, 0, 1, 17, 2, 1, 0, 0, 0, 1, 18, 4, 1, 1, 0, 0, 0, 19, 6, 1, 1, 0, 1, 0, 20, 1, 1, 0, 1, 0, 1, 21, 1, 1, 1, 1, 1, 1, }; // -------------------------------- // Problem 6/76, (Regin & Puget // 2) // -------------------------------- const int p2[] = { 100, 5, 22, 1, 2, 1, 2, 1, 2, 3, 3, 5, 5, 0, 13, 1, 0, 0, 0, 0, 1, 8, 0, 0, 0, 1, 0, 2, 7, 0, 1, 0, 0, 0, 3, 1, 1, 0, 0, 1, 0, 4, 12, 0, 0, 1, 0, 0, 5, 5, 0, 1, 0, 1, 0, 6, 5, 0, 0, 1, 1, 0, 7, 6, 0, 1, 1, 0, 0, 8, 3, 1, 0, 0, 0, 1, 9, 12, 1, 1, 0, 0, 0, 10, 8, 1, 1, 0, 1, 0, 11, 2, 1, 0, 0, 1, 1, 12, 2, 1, 1, 1, 0, 0, 13, 1, 0, 1, 0, 1, 1, 14, 4, 1, 0, 1, 0, 0, 15, 4, 0, 1, 0, 0, 1, 16, 1, 1, 1, 0, 1, 1, 17, 2, 1, 0, 1, 1, 0, 18, 1, 0, 0, 0, 0, 1, 19, 1, 1, 1, 1, 1, 0, 20, 1, 1, 1, 0, 0, 1, 21, 1, 0, 1, 1, 1, 0, }; // --------------------------------- // Problem 10/93, (Regin & Puget // 3) // --------------------------------- const int p3[] = { 100, 5, 25, 1, 2, 1, 2, 1, 2, 3, 3, 5, 5, 0, 7, 1, 0, 0, 1, 0, 1, 11, 1, 1, 0, 0, 0, 2, 1, 0, 1, 1, 1, 1, 3, 3, 1, 0, 1, 0, 0, 4, 15, 0, 1, 0, 0, 0, 5, 2, 1, 0, 1, 1, 0, 6, 8, 0, 1, 0, 1, 0, 7, 5, 0, 0, 1, 0, 0, 8, 3, 0, 0, 0, 1, 0, 9, 4, 0, 1, 1, 1, 0, 10, 5, 1, 0, 0, 0, 0, 11, 2, 1, 1, 1, 0, 1, 12, 6, 0, 1, 1, 0, 0, 13, 2, 0, 0, 1, 0, 1, 14, 2, 0, 1, 0, 0, 1, 15, 4, 1, 1, 1, 1, 0, 16, 3, 1, 0, 0, 0, 1, 17, 5, 1, 1, 0, 1, 0, 18, 2, 1, 1, 1, 0, 0, 19, 4, 1, 1, 0, 0, 1, 20, 1, 1, 0, 0, 1, 1, 21, 1, 1, 1, 0, 1, 1, 22, 1, 0, 1, 0, 1, 1, 23, 1, 0, 1, 1, 0, 1, 24, 2, 0, 0, 0, 0, 1, }; // -------------- // Problem 16/81, // -------------- const int p4[] = { 100, 5, 26, 1, 2, 1, 2, 1, 2, 3, 3, 5, 5, 0, 10, 1, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 1, 2, 8, 0, 1, 0, 1, 0, 3, 8, 0, 0, 0, 1, 0, 4, 6, 0, 1, 1, 0, 0, 5, 11, 0, 1, 0, 0, 0, 6, 3, 0, 0, 1, 0, 0, 7, 2, 0, 0, 1, 1, 0, 8, 7, 1, 1, 0, 0, 0, 9, 2, 1, 0, 0, 1, 1, 10, 4, 1, 0, 1, 0, 0, 11, 7, 1, 0, 0, 1, 0, 12, 1, 1, 1, 1, 0, 1, 13, 3, 0, 1, 1, 1, 0, 14, 4, 0, 1, 0, 0, 1, 15, 5, 1, 1, 1, 0, 0, 16, 2, 1, 1, 0, 0, 1, 17, 1, 1, 0, 1, 1, 1, 18, 2, 1, 0, 1, 1, 0, 19, 3, 1, 0, 0, 0, 1, 20, 2, 0, 1, 1, 0, 1, 21, 1, 0, 1, 0, 1, 1, 22, 3, 1, 1, 0, 1, 0, 23, 1, 0, 0, 1, 1, 1, 24, 1, 1, 1, 1, 1, 1, 25, 1, 1, 1, 1, 1, 0, }; // ---------------------------------- // Problem 19/71, (Regin & Puget // 4) // ---------------------------------- const int p5[] = { 100, 5, 23, 1, 2, 1, 2, 1, 2, 3, 3, 5, 5, 0, 2, 0, 0, 0, 1, 1, 1, 2, 0, 0, 1, 0, 1, 2, 5, 0, 1, 1, 1, 0, 3, 4, 0, 0, 0, 1, 0, 4, 4, 0, 1, 0, 1, 0, 5, 1, 1, 1, 0, 0, 1, 6, 3, 1, 1, 1, 0, 1, 7, 4, 0, 0, 1, 0, 0, 8, 19, 0, 1, 0, 0, 0, 9, 7, 1, 1, 0, 1, 0, 10, 10, 1, 0, 0, 0, 0, 11, 1, 0, 0, 1, 1, 0, 12, 5, 1, 1, 1, 1, 0, 13, 2, 1, 0, 1, 1, 0, 14, 6, 1, 1, 0, 0, 0, 15, 4, 1, 1, 1, 0, 0, 16, 8, 1, 0, 0, 1, 0, 17, 1, 1, 0, 0, 0, 1, 18, 4, 0, 1, 1, 0, 0, 19, 2, 0, 0, 0, 0, 1, 20, 4, 0, 1, 0, 0, 1, 21, 1, 1, 1, 0, 1, 1, 22, 1, 0, 1, 1, 0, 1, }; const int* problems[] = { &p0[0], &p1[0], &p2[0], &p3[0], &p4[0], &p5[0], }; /// The number of instances const unsigned int n_problems = sizeof(problems)/sizeof(int*); }; // STATISTICS: example-any gecode-4.2.1/examples/cartesian-heart.cpp0000644000175000010010000000727312166527420017473 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Vincent Barichard * * Copyright: * Vincent Barichard, 2012 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** * \brief %Example: Cartesian Heart * * There are many mathematical curves that produce heart shapes. * With a good solving effort, coordinates of a filled heart shape * can be computed by solving the cartesian equation: * * \f[ * x^2+2\left(y-p\times\operatorname{abs}(x)^{\frac{1}{q}}\right)^2 = 1 * \f] * * By setting \f$p=0.5\f$ and \f$q=2\f$, it yields to the equation: * * \f[ * x^2+2\left(y-\frac{\operatorname{abs}(x)^{\frac{1}{2}}}{2}\right)^2 = 1 * \f] * * To get reasonable interval starting sizes, \f$x\f$ and \f$y\f$ * are restricted to \f$[-20;20]\f$. * * \ingroup Example */ class CartesianHeart : public Script { protected: /// The numbers FloatVarArray f; /// Minimum distance between two solutions FloatNum step; public: /// Actual model CartesianHeart(const Options&) : f(*this,2,-20,20), step(0.01) { int q = 2; FloatNum p = 0.5; // Post equation rel(*this, sqr(f[0]) + 2*sqr(f[1]-p*nroot(abs(f[0]),q)) == 1); branch(*this, f[0], FLOAT_VAL_SPLIT_MIN()); branch(*this, f[1], FLOAT_VAL_SPLIT_MIN()); } /// Constructor for cloning \a p CartesianHeart(bool share, CartesianHeart& p) : Script(share,p), step(p.step) { f.update(*this,share,p.f); } /// Copy during cloning virtual Space* copy(bool share) { return new CartesianHeart(share,*this); } /// Add constraints to current model to get next solution (not too close) virtual void constrain(const Space& _b) { const CartesianHeart& b = static_cast(_b); rel(*this, (f[0] >= (b.f[0].max()+step)) || (f[1] >= (b.f[1].max()+step)) || (f[1] <= (b.f[1].min()-step))); } /// Print solution coordinates virtual void print(std::ostream& os) const { os << "XY " << f[0].med() << " " << f[1].med() << std::endl; } }; /** \brief Main-function * \relates CartesianHeart */ int main(int argc, char* argv[]) { Options opt("CartesianHeart"); opt.parse(argc,argv); opt.solutions(0); Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/colored-matrix.cpp0000644000175000010010000006451112166527420017350 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Mikael Lagerkvist * * Copyright: * Mikael Lagerkvist, 2012 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include using namespace Gecode; /** \brief %ColoredMatrixOptions. * * Used in the \ref ColoredMatrix example. */ class ColoredMatrixOptions : public Options { private: /// Height of matrix Driver::UnsignedIntOption _height; /// Width of matrix Driver::UnsignedIntOption _width; /// Size of square matrix Driver::UnsignedIntOption _size; /// Number of colors to use Driver::UnsignedIntOption _colors; /// How to implement the not all equal constraint Driver::StringOption _not_all_equal; /// How to implement the same or 0 constraint Driver::StringOption _same_or_0; /// How to implement the distinct except 0 constraint Driver::StringOption _distinct_except_0; /// How to implement the no monochrome rectangle constraint Driver::StringOption _no_monochrome_rectangle; public: /// Initialize options for example with name \a n ColoredMatrixOptions(const char* n); /// Parse options from arguments \a argv (number is \a argc) void parse(int& argc, char* argv[]) { Options::parse(argc,argv); } /// Return height unsigned int height(void) const { if (_size.value() == 0) return _height.value(); else return _size.value(); } /// Return width unsigned int width(void) const { if (_size.value() == 0) return _width.value(); else return _size.value(); } /// Return number of colors unsigned int colors(void) const { return _colors.value(); } /// Return how to implement not all equals int not_all_equal(void) const { return _not_all_equal.value(); } /// Return how to implement same or 0 int same_or_0(void) const { return _same_or_0.value(); } /// Return how to implement distinct except 0 int distinct_except_0(void) const { return _distinct_except_0.value(); } /// Return how to implement distinct except 0 int no_monochrome_rectangle(void) const { return _no_monochrome_rectangle.value(); } }; namespace { /** \name Constraint description constructors. * * These functions implement constructors for descriptions of * constraints as extensional specifications. * * \relates ColoredMatrix */ //@{ /** Return DFA for the same_or_0 constraint. * * Constraint models the expression \f$(x = y \land z = y) \lor (x * \neq y \land z = 0)\f$ for variables \f$\langle x, y, * zq\rangle\f$. */ DFA same_or_0_dfa(unsigned int colors); /** Return tuple set for the same_or_0 constraint. * * Constraint models the expression \f$(x = y \land z = y) \lor (x * \neq y \land z = 0)\f$ for variables \f$\langle x, y, * zq\rangle\f$. */ TupleSet same_or_0_tuple_set(unsigned int colors); /** Return DFA for the distinct_except_0 constraint. */ DFA distinct_except_0_dfa(unsigned int colors); /** Return DFA for the no monochrome rectangle constraint. */ DFA no_monochrome_rectangle_dfa(unsigned int colors); /** Return counts for using a global cardninality constraint for the distinct exept 0 constraint. */ IntSetArgs distinct_except_0_counts(unsigned int colors, unsigned int size); /** Return DFA for the not all equals constraint. */ DFA not_all_equal_dfa(unsigned int colors); //@} } /** * \brief %Example: Colored matrix example. * * An n by m matrix is to be filled with k colors. It is a valid colored matrix iff * the corners of each rectangle do not have the same color. * * An example 5 by 4 matrix with three colors: * \code * 1 1 1 1 1 * 1 2 2 3 3 * 1 2 3 2 3 * 1 2 3 3 2 * \endcode * * \ingroup Example * */ class ColoredMatrix : public IntMinimizeScript { protected: /** \name Instance specification */ //@{ const ColoredMatrixOptions& opt; ///< Options for model const unsigned int height; ///< Height of matrix const unsigned int width; ///< Width of matrix const unsigned int colors; ///< Number of colors to use //@} /** \name Problem variables */ //@{ /// Array for matrix variables IntVarArray x; /// Maximum color used IntVar max_color; //@} /** Return variable that is zero if a and b differ, or equal to their value if they agree. */ IntVar same_or_0(const IntVar& a, const IntVar& b) { switch (opt.same_or_0()) { case SAME_OR_0_REIFIED: { IntVar result(*this, 0, colors); BoolVar same = expr(*this, (a == b)); rel(*this, result, IRT_EQ, a, same); // Redundant (implied by previous), but improves efficiency rel(*this, result, IRT_NQ, 0, same); return result; } case SAME_OR_0_TUPLE_SET: { static TupleSet table = same_or_0_tuple_set(colors); IntVar result(*this, 0, colors); extensional(*this, IntVarArgs() << a << b << result, table); return result; } case SAME_OR_0_DFA: { static const DFA automaton = same_or_0_dfa(colors); IntVar result(*this, 0, colors); extensional(*this, IntVarArgs() << a << b << result, automaton); return result; } default: GECODE_NEVER; return IntVar(*this, 0, 0); } } /** Post constraint that all values in v different from 0 are distinct. */ void distinct_except_0(const IntVarArgs& v) { switch (opt.distinct_except_0()) { case DISTINCT_EXCEPT_0_REIFIED: for (int i = v.size(); i--; ) { BoolVar viIsZero = expr(*this, v[i] == 0); for (int j = i; j--; ) { rel(*this, viIsZero || (v[i] != v[j])); } } break; case DISTINCT_EXCEPT_0_DFA: { static const DFA automaton = distinct_except_0_dfa(colors); extensional(*this, v, automaton); break; } case DISTINCT_EXCEPT_0_COUNT: { static const IntSetArgs counts = distinct_except_0_counts(colors, std::max(width, height)); count(*this, v, counts, opt.icl()); break; } } } /** Post constraint that not all variables in v are equal. */ void not_all_equal(const IntVarArgs& v) { switch (opt.not_all_equal()) { case NOT_ALL_EQUAL_NQ: { rel(*this, v, IRT_NQ); break; } case NOT_ALL_EQUAL_NAIVE: { // At least one pair must be different. // Bad decomposition since too many disjuncts are created. BoolVarArgs disequalities; for (int i = v.size(); i--; ) for (int j = i; j--; ) disequalities << expr(*this, v[i] != v[j]); rel(*this, BOT_OR, disequalities, 1); break; } case NOT_ALL_EQUAL_REIFIED: { // It must not be the case that all are equal BoolVarArgs equalities; for (int i = 0; i < v.size()-1; ++i) equalities << expr(*this, v[i] == v[i+1]); rel(*this, BOT_AND, equalities, 0); break; } case NOT_ALL_EQUAL_NVALUES: // More than one number nvalues(*this, v, IRT_GR, 1); break; case NOT_ALL_EQUAL_COUNT: // No number in all positions count(*this, v, IntSet(0, v.size()-1), IntArgs::create(colors, 1), opt.icl()); break; case NOT_ALL_EQUAL_DFA: { static const DFA automaton = not_all_equal_dfa(colors); extensional(*this, v, automaton); break; } } } /** Post constraint using same_or_0 and distinct_except_0 that enforces * rows/columns v1 and v2 to have no monochrome rectangle. */ void no_monochrome_rectangle(IntVarArgs v1, IntVarArgs v2) { const unsigned int length = v1.size(); switch (opt.no_monochrome_rectangle()) { case NO_MONOCHROME_DECOMPOSITION: { IntVarArgs z(length); for (unsigned int i = 0; i < length; ++i) { z[i] = same_or_0(v1[i], v2[i]); } distinct_except_0(z); break; } case NO_MONOCHROME_DFA: { static const DFA automaton = no_monochrome_rectangle_dfa(colors); IntVarArgs z(2*length); for (int i = length; i--; ) { z[2*i + 0] = v1[i]; z[2*i + 1] = v2[i]; } extensional(*this, z, automaton); break; } } } public: /// Search modes enum { SEARCH_DFS, ///< Find solution SEARCH_BAB, ///< Find optimal solution }; /// SYmmetry breaking variants enum { SYMMETRY_NONE = 0, ///< No symmetry breaking SYMMETRY_MATRIX = 1, ///< Order rows and columns of matrix SYMMETRY_VALUES = 2, ///< Order value occurences }; /// Model variants enum { MODEL_CORNERS = 1, ///< Use model on corner combinations MODEL_ROWS = 2, ///< Use model on pairs of rows MODEL_COLUMNS = 4, ///< Use model on pairs of columns }; /// Not all equal variants enum { NOT_ALL_EQUAL_NQ, ///< Use direct constraint for implemeting not all equals NOT_ALL_EQUAL_NAIVE, ///< Use naive reification for implemeting not all equals NOT_ALL_EQUAL_REIFIED, ///< Use reification for implemeting not all equals NOT_ALL_EQUAL_NVALUES, ///< Use nvalues for implementing not all equals NOT_ALL_EQUAL_COUNT, ///< Use count for implementing not all equals NOT_ALL_EQUAL_DFA, ///< Use dfa for implementing not all equals }; /// Same or 0 variants enum { SAME_OR_0_REIFIED, ///< Use reification for same or 0 SAME_OR_0_DFA, ///< Use dfa for same or 0 SAME_OR_0_TUPLE_SET, ///< Use tuple set for same or 0 }; /// Distinct except 0 variants enum { DISTINCT_EXCEPT_0_REIFIED, ///< Use reification for distinct except 0 DISTINCT_EXCEPT_0_DFA, ///< Use dfa for distinct except 0 DISTINCT_EXCEPT_0_COUNT, ///< Use count for distinct except 0 }; /// No monochrome rectangle versions enum { NO_MONOCHROME_DECOMPOSITION, ///< Use decomposition for no monochrome rectangle NO_MONOCHROME_DFA, ///< Use dfa for no monochrome rectangle }; /// Actual model ColoredMatrix(const ColoredMatrixOptions& opt0) : opt(opt0), height(opt.height()), width(opt.width()), colors(opt.colors()), x(*this, height*width, 1, colors), max_color(*this, 1, colors) { max(*this, x, max_color); Matrix m(x, width, height); // For each pair of columns and rows, the intersections may not be equal. if (opt.model() & MODEL_CORNERS) { for (unsigned int c1 = 0; c1 < width; ++c1) { for (unsigned int c2 = c1+1; c2 < width; ++c2) { for (unsigned int r1 = 0; r1 < height; ++r1) { for (unsigned int r2 = r1+1; r2 < height; ++r2) { not_all_equal(IntVarArgs() << m(c1,r1) << m(c1,r2) << m(c2,r1) << m(c2,r2)); } } } } } // Given two rows/columns, construct variables representing if // the corresponding places are equal (and if so, what value). // For the new values, no non-zero value may appear more than // once. if (opt.model() & MODEL_ROWS) { for (unsigned int r1 = 0; r1 < height; ++r1) { for (unsigned int r2 = r1+1; r2 < height; ++r2) { no_monochrome_rectangle(m.row(r1), m.row(r2)); } } } if (opt.model() & MODEL_COLUMNS) { for (unsigned int c1 = 0; c1 < width; ++c1) { for (unsigned int c2 = c1+1; c2 < width; ++c2) { no_monochrome_rectangle(m.col(c1), m.col(c2)); } } } // Symmetry breaking constraints. { // Lexical order for all columns and rows (all are interchangable) if (opt.symmetry() & SYMMETRY_MATRIX) { for (unsigned int r = 0; r < height-1; ++r) { rel(*this, m.row(r), IRT_LE, m.row(r+1)); } for (unsigned int c = 0; c < width-1; ++c) { rel(*this, m.col(c), IRT_LE, m.col(c+1)); } } // Value precedence. Compatible with row/column ordering if (opt.symmetry() & SYMMETRY_VALUES) { precede(*this, x, IntArgs::create(colors, 1)); } } branch(*this, x, tiebreak(INT_VAR_MIN_MIN(), INT_VAR_SIZE_MIN()), INT_VAL_MIN()); } /// Return cost virtual IntVar cost(void) const { return max_color; } /// Print solution virtual void print(std::ostream& os) const { Matrix m(x, width, height); for (unsigned int r = 0; r < height; ++r) { os << "\t"; for (unsigned int c = 0; c < width; ++c) { os << m(c, r) << " "; } os << std::endl; } os << std::endl; os << "\tmax color: " << max_color << std::endl; os << std::endl; } /// Constructor for cloning \a s ColoredMatrix(bool share, ColoredMatrix& s) : IntMinimizeScript(share,s), opt(s.opt), height(s.height), width(s.width), colors(s.colors) { x.update(*this, share, s.x); max_color.update(*this, share, s.max_color); } /// Copy during cloning virtual Space* copy(bool share) { return new ColoredMatrix(share,*this); } }; ColoredMatrixOptions::ColoredMatrixOptions(const char* n) : Options(n), _height("-height", "Height of matrix", 8), _width("-width", "Width of matrix", 8), _size("-size", "If different from 0, used as both width and height", 0), _colors("-colors", "Maximum number of colors", 4), _not_all_equal("-not-all-equal", "How to implement the not all equals constraint (used in corners model)", ColoredMatrix::NOT_ALL_EQUAL_NQ), _same_or_0("-same-or-0", "How to implement the same or 0 constraint (used in the decomposed no monochrome rectangle constraint)", ColoredMatrix::SAME_OR_0_DFA), _distinct_except_0("-distinct-except-0", "How to implement the distinct except 0 constraint (used in the decomposed no monochrome rectangle constraint)", ColoredMatrix::DISTINCT_EXCEPT_0_DFA), _no_monochrome_rectangle("-no-monochrome-rectangle", "How to implement no monochrome rectangle (used in the rows model)", ColoredMatrix::NO_MONOCHROME_DFA) { add(_height); add(_width); add(_size); add(_colors); add(_not_all_equal); add(_same_or_0); add(_distinct_except_0); add(_no_monochrome_rectangle); // Add search options _search.add(ColoredMatrix::SEARCH_DFS, "dfs", "Find a solution."); _search.add(ColoredMatrix::SEARCH_BAB, "bab", "Find an optimal solution."); _search.value(ColoredMatrix::SEARCH_DFS); // Add symmetry options _symmetry.add(ColoredMatrix::SYMMETRY_NONE, "none", "Don't use symmetry breaking."); _symmetry.add(ColoredMatrix::SYMMETRY_MATRIX, "matrix", "Order matrix rows and columns"); _symmetry.add(ColoredMatrix::SYMMETRY_VALUES, "values", "Order values"); _symmetry.add(ColoredMatrix::SYMMETRY_MATRIX | ColoredMatrix::SYMMETRY_VALUES, "both", "Order both rows/columns and values"); _symmetry.value(ColoredMatrix::SYMMETRY_MATRIX); // Add model options _model.add(ColoredMatrix::MODEL_CORNERS, "corner", "Use direct corners model with not-all-equal constraints."); _model.add(ColoredMatrix::MODEL_ROWS, "rows", "Use model on pairs of rows (same_or_0 and distinct_except_0 constraints)."); _model.add(ColoredMatrix::MODEL_ROWS | ColoredMatrix::MODEL_CORNERS, "both", "Use both rows and corners model"); _model.add(ColoredMatrix::MODEL_COLUMNS, "columns", "Use model on pairs of columns (same_or_0 and distinct_except_0 constraints)."); _model.add(ColoredMatrix::MODEL_ROWS | ColoredMatrix::MODEL_COLUMNS, "matrix", "Use both rows and columns model"); _model.value(ColoredMatrix::MODEL_CORNERS); // Add not all equal variants _not_all_equal.add(ColoredMatrix::NOT_ALL_EQUAL_NQ, "nq", "Use nq constraint."); _not_all_equal.add(ColoredMatrix::NOT_ALL_EQUAL_NAIVE, "naive", "Use naive reified decomposition."); _not_all_equal.add(ColoredMatrix::NOT_ALL_EQUAL_REIFIED, "reified", "Use reified decomposition."); _not_all_equal.add(ColoredMatrix::NOT_ALL_EQUAL_NVALUES, "nvalues", "Use nvalues."); _not_all_equal.add(ColoredMatrix::NOT_ALL_EQUAL_COUNT, "count", "Use count."); _not_all_equal.add(ColoredMatrix::NOT_ALL_EQUAL_DFA, "dfa", "Use dfa."); // Add same or 0 variants _same_or_0.add(ColoredMatrix::SAME_OR_0_REIFIED, "reified", "Use reified decomposition."); _same_or_0.add(ColoredMatrix::SAME_OR_0_TUPLE_SET, "tuple-set", "Use tuple set representation."); _same_or_0.add(ColoredMatrix::SAME_OR_0_DFA, "dfa", "Use dfa representation."); // Add distinct except 0 variants _distinct_except_0.add(ColoredMatrix::DISTINCT_EXCEPT_0_REIFIED, "reified", "Use reified decomposition."); _distinct_except_0.add(ColoredMatrix::DISTINCT_EXCEPT_0_DFA, "dfa", "Use dfa decomposition."); _distinct_except_0.add(ColoredMatrix::DISTINCT_EXCEPT_0_COUNT, "count", "Use global cardinality."); // Add no monochrome rectangle variants _no_monochrome_rectangle.add(ColoredMatrix::NO_MONOCHROME_DECOMPOSITION, "decompositions", "Use decompositions into same_or_0 and distinct_except_0."); _no_monochrome_rectangle.add(ColoredMatrix::NO_MONOCHROME_DFA, "dfa", "Use DFA as direct implementation."); } /** \brief Main-function * \relates ColoredMatrix */ int main(int argc, char* argv[]) { ColoredMatrixOptions opt("Colored matrix"); opt.parse(argc,argv); if (opt.search() == ColoredMatrix::SEARCH_DFS) { Script::run(opt); } else { Script::run(opt); } return 0; } namespace { DFA same_or_0_dfa(unsigned int colors) { /* DFA over variable sequences (x,y,z) where z equals x/y if x and * y are equal, and z equals 0 otherwise. * * DFA is constructed to contain paths * start -- c --> node -- c --> node' -- c --> end * for all colors c representing the case when x and y * are equal. * * For the cases where x and y are non-equal (c and c'), paths * start -- c --> node -- c' --> not-equal -- 0 --> end * are added. */ const int start_state = 0; const int not_equal_state = 2*colors+1; const int final_state = 2*colors+2; int n_transitions = colors*colors + 2*colors + 2; DFA::Transition* trans = new DFA::Transition[n_transitions]; int current_transition = 0; // From start state for (unsigned int color = 1; color <= colors; ++color) { trans[current_transition++] = DFA::Transition(start_state, color, color); } // From first level states (indices [1..color]) // To second-level if same color, otherwise to not_equal_state for (unsigned int state = 1; state <= colors; ++state) { for (unsigned int color = 1; color <= colors; ++color) { if (color == state) { trans[current_transition++] = DFA::Transition(state, color, colors+state); } else { trans[current_transition++] = DFA::Transition(state, color, not_equal_state); } } } // From second level states (indices [colors+1..colors+colors]) // To final state with the same color for (unsigned int color = 1; color <= colors; ++color) { trans[current_transition++] = DFA::Transition(colors+color, color, final_state); } // From not equal state to final state trans[current_transition++] = DFA::Transition(not_equal_state, 0, final_state); // End sentinel trans[current_transition++] = DFA::Transition(-1, 0, -1); int final_states[] = {final_state, -1}; DFA result(start_state, trans, final_states, true); delete[] trans; return result; } TupleSet same_or_0_tuple_set(unsigned int colors) { TupleSet result; for (unsigned int i = 1; i <= colors; ++i) { for (unsigned int j = 1; j <= colors; ++j) { if (i == j) { result.add(IntArgs(3, i, j, i)); } else { result.add(IntArgs(3, i, j, 0)); } } } result.finalize(); return result; } DFA distinct_except_0_dfa(unsigned int colors) { /* DFA for a sequence that may use each color only once (and all * others are zero). * * For n colors, 2^n nodes are used. For each node, if bit b is one, then * that color has not been used yet. All nodes have self-loops for zero, and * edges for still usable colors to the node with the corresponding bit un-set. * All nodes are final nodes. */ const int nstates = 1 << colors; const int start_state = nstates-1; DFA::Transition* trans = new DFA::Transition[nstates*colors + 1]; int current_transition = 0; for (int state = nstates; state--; ) { trans[current_transition++] = DFA::Transition(state, 0, state); for (unsigned int color = 1; color <= colors; ++color) { const unsigned int color_bit = (1 << (color-1)); if (state & color_bit) { trans[current_transition++] = DFA::Transition(state, color, state & ~color_bit); } } } trans[current_transition++] = DFA::Transition(-1, 0, -1); int* final_states = new int[nstates+1]; final_states[nstates] = -1; for (int i = nstates; i--; ) { final_states[i] = i; } DFA result(start_state, trans, final_states); delete[] trans; delete[] final_states; return result; } DFA no_monochrome_rectangle_dfa(unsigned int colors) { /* DFA for a sequence of pairs, where each monochromatic pair may * only appear once. * * For n colors, there are 2^n base states representing which * monochromatic pairs are still available. For each base state s, * the color seen goes to a new intermediate state. A different * color will go back to state s. Seeing the same color will move * to the next base state with that color combination removed (if * it is still allowed). * * In essence, this DFA represents the combination of same_or_0 * and distinct_except_0 as a single constraint. */ const int base_states = 1 << colors; const int start_state = base_states-1; const int nstates = base_states + colors*base_states; DFA::Transition* trans = new DFA::Transition[nstates*colors + 1]; int current_transition = 0; for (int state = base_states; state--; ) { for (unsigned int color = 1; color <= colors; ++color) { const unsigned int color_bit = (1 << (color-1)); const int color_remembered_state = state + color*base_states; trans[current_transition++] = DFA::Transition(state, color, color_remembered_state); for (unsigned int next_color = 1; next_color <= colors; ++next_color) { if (next_color == color) { // Two equal adjacent, only transition if color still allowed if (state & color_bit) { trans[current_transition++] = DFA::Transition(color_remembered_state, color, state & ~color_bit); } } else { trans[current_transition++] = DFA::Transition(color_remembered_state, next_color, state); } } } } trans[current_transition++] = DFA::Transition(-1, 0, -1); assert(current_transition <= nstates*colors+1); int* final_states = new int[base_states+1]; final_states[base_states] = -1; for (int i = base_states; i--; ) { final_states[i] = i; } DFA result(start_state, trans, final_states); delete[] trans; delete[] final_states; return result; } IntSetArgs distinct_except_0_counts(unsigned int colors, unsigned int size) { IntSetArgs result(colors+1); result[0] = IntSet(0, size); for (unsigned int i = 1; i <= colors; ++i) { result[i] = IntSet(0, 1); } return result; } DFA not_all_equal_dfa(unsigned int colors) { /* DFA for not all equal. * * From the start state, there is a transition for each color to * that colors state. As long as the same color is seen, the * automaton stays in that state. If a different color is seen, * then it goes to the accepting state. */ const int nstates = 1 + colors + 1; const int start_state = 0; const int final_state = nstates-1; DFA::Transition* trans = new DFA::Transition[2*colors + colors*colors + 1]; int current_transition = 0; // Each color to its own state for (unsigned int color = 1; color <= colors; ++color) { trans[current_transition++] = DFA::Transition(start_state, color, color); } // Each colors state loops on itself, and goes to final on all others for (unsigned int state = 1; state <= colors; ++state) { for (unsigned int color = 1; color <= colors; ++color) { if (state == color) { trans[current_transition++] = DFA::Transition(state, color, state); } else { trans[current_transition++] = DFA::Transition(state, color, final_state); } } } // Loop on all colors in final state for (unsigned int color = 1; color <= colors; ++color) { trans[current_transition++] = DFA::Transition(final_state, color, final_state); } trans[current_transition++] = DFA::Transition(-1, 0, -1); int final_states[] = {final_state, -1}; DFA result(start_state, trans, final_states); delete[] trans; return result; } } // STATISTICS: example-any gecode-4.2.1/examples/crew.cpp0000644000175000010010000002066212166527420015356 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * Christian Schulte * * Copyright: * Guido Tack, 2004 * Christian Schulte, 2004 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; namespace { /// The airline employees typedef enum { Tom, David, Jeremy, Ron, Joe, Bill, Fred, Bob, Mario, Ed, Carol, Janet, Tracy, Marilyn, Carolyn, Cathy, Inez, Jean, Heather, Juliet } Employee; const int noOfEmployees = Juliet+1; /// A flight to schedule struct Flight { int staff; ///< Overall number of cabin crew needed int stewards; ///< How many stewards are required int hostesses; ///< How many hostesses are required int french; ///< How many French speaking employees are required int spanish; ///< How many Spanish speaking employees are required int german; ///< How many German speaking employees are required }; const char* employeeToName(Employee e); extern const int stewards[]; extern const int noOfStewards; extern const int hostesses[]; extern const int noOfHostesses; extern const int spanishSpeaking[]; extern const int noOfSpanishSpeaking; extern const int frenchSpeaking[]; extern const int noOfFrenchSpeaking; extern const int germanSpeaking[]; extern const int noOfGermanSpeaking; extern const Flight requiredCrew[]; extern const int noOfFlights; } /** * \brief %Example: Airline crew allocation * * Assign 20 flight attendants to 10 flights. Each flight needs a certain * number of cabin crew, and they have to speak certain languages. * Every cabin crew member has two flights off after an attended flight. * * \ingroup Example * */ class Crew : public Script { public: /// The crew for each flight SetVarArray flight; /// The actual model Crew(const Options&) : flight(*this,noOfFlights,IntSet::empty,0,noOfEmployees-1) { IntSet stewardsDS(stewards,noOfStewards); IntSet hostessesDS(hostesses,noOfHostesses); IntSet spanishDS(spanishSpeaking, noOfSpanishSpeaking); IntSet frenchDS(frenchSpeaking, noOfFrenchSpeaking); IntSet germanDS(germanSpeaking, noOfGermanSpeaking); for (int i=0; i= requiredCrew[i].stewards); rel(*this, cardinality(flight[i] & hostessesDS) >= requiredCrew[i].hostesses); rel(*this, cardinality(flight[i] & spanishDS) >= requiredCrew[i].spanish); rel(*this, cardinality(flight[i] & frenchDS) >= requiredCrew[i].french); rel(*this, cardinality(flight[i] & germanDS) >= requiredCrew[i].german); } // No crew member of flight i works on flights i+1 and i+2 for (int i=0; i(d.val())) << " "; } } else { os << "\tRequired: "; for (SetVarGlbValues d(flight[i]);d();++d) { os << employeeToName(static_cast(d.val())) << " "; } os << std::endl << "\t\t\tPossible: "; for (SetVarUnknownValues d(flight[i]);d();++d) { os << employeeToName(static_cast(d.val())) << " "; } } os << std::endl << std::endl; } } /// Constructor for cloning \a s Crew(bool share, Crew& s) : Script(share,s) { flight.update(*this,share,s.flight); } /// Copy during cloning virtual Space *copy(bool share) { return new Crew(share,*this); } }; /** \brief Main-function * \relates Crew */ int main(int argc, char* argv[]) { Options o("Crew"); o.iterations(100); o.parse(argc,argv); Script::run(o); return 0; } namespace { /// Return name of employee \a e as a string const char* employeeToName(Employee e) { switch(e) { case Tom : return "Tom"; case David : return "David"; case Jeremy: return "Jeremy"; case Ron: return "Ron"; case Joe: return "Joe"; case Bill: return "Bill"; case Fred: return "Fred"; case Bob: return "Bob"; case Mario: return "Mario"; case Ed: return "Ed"; case Carol: return "Carol"; case Janet: return "Janet"; case Tracy: return "Tracy"; case Marilyn: return "Marilyn"; case Carolyn: return "Carolyn"; case Cathy: return "Cathy"; case Inez: return "Inez"; case Jean: return "Jean"; case Heather: return "Heather"; case Juliet: return "Juliet"; default: GECODE_NEVER; return ""; } } // these have to be sorted! /// The stewards const int stewards[] = {Tom, David, Jeremy, Ron, Joe, Bill, Fred, Bob, Mario, Ed}; /// The number of stewards const int noOfStewards = sizeof(stewards) / sizeof(int); /// The hostesses const int hostesses[] = { Carol, Janet, Tracy, Marilyn, Carolyn, Cathy, Inez, Jean, Heather, Juliet }; /// The number of hostesses const int noOfHostesses = sizeof(hostesses) / sizeof(int); /// The French speaking employees const int frenchSpeaking[] = { Bill, Inez, Jean, Juliet }; /// The number of French speaking employees const int noOfFrenchSpeaking = sizeof(frenchSpeaking) / sizeof(int); /// The German speaking employees const int germanSpeaking[] = { Tom, Jeremy, Mario, Cathy, Juliet }; /// The number of German speaking employees const int noOfGermanSpeaking = sizeof(germanSpeaking) / sizeof(int); /// The Spanish speaking employees const int spanishSpeaking[] = { Joe, Bill, Fred, Mario, Marilyn, Inez, Heather }; /// The number of Spanish speaking employees const int noOfSpanishSpeaking = sizeof(spanishSpeaking) / sizeof(int); /// The flights to schedule const Flight requiredCrew[] = { {4,1,1,1,1,1}, {5,1,1,1,1,1}, {5,1,1,1,1,1}, {6,2,2,1,1,1}, {7,3,3,1,1,1}, {4,1,1,1,1,1}, {5,1,1,1,1,1}, {6,1,1,1,1,1}, {6,2,2,1,1,1}, {7,3,3,1,1,1} }; /// The number of flights to schedule const int noOfFlights = sizeof(requiredCrew) / sizeof(Flight); } // STATISTICS: example-any gecode-4.2.1/examples/crossword.cpp0000644000175000010010000055377612166527420016464 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2009 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include "examples/scowl.hpp" using namespace Gecode; // Grid data namespace { // Grid data extern const int* grids[]; // Number of grids extern const unsigned int n_grids; } /** * \brief %Example: %Crossword puzzle * * Fill crossword grids with words, that is construct a crossword * puzzle. For a recent paper on this classical problem, see: * Crossword Puzzles as a Constraint Problem, Anbulagan and Adi Botea, * CP 2008, pages 550-554, Springer Verlag. * * Note that "Modeling and Programming with Gecode" uses this example * as a case study. * * \ingroup Example */ class Crossword : public Script { protected: /// Width of crossword grid const int w; /// Height of crossword grid const int h; /// Letters for grid IntVarArray letters; public: /// Branching to use for model enum { BRANCH_WORDS, ///< Branch on the words BRANCH_LETTERS, ///< Branch on the letters BRANCH_LETTERS_ALL ///< Branch on the letters (try all values) }; /// Actual model Crossword(const SizeOptions& opt) : w(grids[opt.size()][0]), h(grids[opt.size()][1]), letters(*this,w*h,'a','z') { // Pointer into the grid specification (width and height already skipped) const int* g = &grids[opt.size()][2]; // Matrix for letters Matrix ml(letters, w, h); // Set black fields to 0 { IntVar z(*this,0,0); for (int n = *g++; n--; ) { int x=*g++, y=*g++; ml(x,y)=z; } } // Array of all words IntVarArgs allwords; // While words of length w_l to process while (int w_l=*g++) { // Number of words of that length in the dictionary int n_w = dict.words(w_l); // Number of words of that length in the puzzle int n=*g++; if (n > n_w) { fail(); } else { // Array of all words of length w_l IntVarArgs words(*this,n,0,n_w-1); allwords << words; // All words of same length must be different distinct(*this, words, opt.icl()); for (int d=0; d(home); int x = i % c.w, y = i / c.w; o << "letters[" << x << "," << y << "] " << ((a == 0) ? "=" : "!=") << " " << static_cast(n); } /// Print brancher information when branching on words static void printwords(const Space&, const BrancherHandle& bh, unsigned int a, IntVar, int i, const int& n, std::ostream& o) { o << "allwords[" << i << "] " << ((a == 0) ? "<=" : ">") << " " << n; } /// Constructor for cloning \a s Crossword(bool share, Crossword& s) : Script(share,s), w(s.w), h(s.h) { letters.update(*this, share, s.letters); } /// Copy during cloning virtual Space* copy(bool share) { return new Crossword(share,*this); } /// Print solution virtual void print(std::ostream& os) const { // Matrix for letters Matrix ml(letters, w, h); for (int i=0; i(ml(j,i).val()); else os << '?'; os << std::endl; } os << std::endl << std::endl; } }; /** \brief Main-function * \relates WordSquare */ int main(int argc, char* argv[]) { FileSizeOptions opt("Crossword"); opt.size(10); opt.icl(ICL_VAL); opt.branching(Crossword::BRANCH_WORDS); opt.branching(Crossword::BRANCH_WORDS, "words"); opt.branching(Crossword::BRANCH_LETTERS, "letters"); opt.branching(Crossword::BRANCH_LETTERS_ALL, "letters-all"); opt.parse(argc,argv); dict.init(opt.file()); if (opt.size() >= n_grids) { std::cerr << "Error: size must be between 0 and " << n_grids-1 << std::endl; return 1; } Script::run(opt); return 0; } namespace { /* * The Grid data has been provided by Peter Van Beek, to * quote the original README.txt: * * The files in this directory contain templates for crossword * puzzles. Each is a two-dimensional array. A _ indicates * that the associated square in the crossword template is * blank, and a * indicates that it is a black square that * does not need to have a letter inserted. * * The crossword puzzles templates came from the following * sources: * * 15.01, ..., 15.10 * 19.01, ..., 19.10 * 21.01, ..., 21.10 * 23.01, ..., 23.10 * * Herald Tribune Crosswords, Spring, 1999 * * 05.01, ..., 05.10 * * All legal 5 x 5 puzzles. * * puzzle01, ..., puzzle19 * * Ginsberg, M.L., "Dynamic Backtracking," * Journal of Artificial Intelligence Researc (JAIR) * Volume 1, pages 25-46, 1993. * * puzzle20, ..., puzzle22 * * Ginsberg, M.L. et al., "Search Lessons Learned * from Crossword Puzzles," AAAI-90, pages 210-215. * */ /* * Name: 05.01, 5 x 5 * (_ _ _ _ _) * (_ _ _ _ _) * (_ _ _ _ _) * (_ _ _ _ _) * (_ _ _ _ _) */ const int g0[] = { // Width and height of crossword grid 5, 5, // Number of black fields 0, // Black field coordinates // Length and number of words of that length 5, 10, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,3,0, 0,4,0, 1,0,1, 2,0,1, 3,0,1, 4,0,1, // End marker 0 }; /* * Name: 05.02, 5 x 5 * (_ _ _ _ *) * (_ _ _ _ _) * (_ _ _ _ _) * (_ _ _ _ _) * (* _ _ _ _) */ const int g1[] = { // Width and height of crossword grid 5, 5, // Number of black fields 2, // Black field coordinates 0,4, 4,0, // Length and number of words of that length 5, 6, // Coordinates where words start and direction (0 = horizontal) 0,1,0, 0,2,0, 0,3,0, 1,0,1, 2,0,1, 3,0,1, // Length and number of words of that length 4, 4, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 1,4,0, 4,1,1, // End marker 0 }; /* * Name: 05.03, 5 x 5 * (_ _ _ _ *) * (_ _ _ _ *) * (_ _ _ _ _) * (* _ _ _ _) * (* _ _ _ _) */ const int g2[] = { // Width and height of crossword grid 5, 5, // Number of black fields 4, // Black field coordinates 0,3, 0,4, 4,0, 4,1, // Length and number of words of that length 5, 4, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 1,0,1, 2,0,1, 3,0,1, // Length and number of words of that length 4, 4, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,1,0, 1,3,0, 1,4,0, // Length and number of words of that length 3, 2, // Coordinates where words start and direction (0 = horizontal) 0,0,1, 4,2,1, // End marker 0 }; /* * Name: 05.04, 5 x 5 * (_ _ _ * *) * (_ _ _ _ *) * (_ _ _ _ _) * (* _ _ _ _) * (* * _ _ _) */ const int g3[] = { // Width and height of crossword grid 5, 5, // Number of black fields 6, // Black field coordinates 0,3, 0,4, 1,4, 3,0, 4,0, 4,1, // Length and number of words of that length 5, 2, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 2,0,1, // Length and number of words of that length 4, 4, // Coordinates where words start and direction (0 = horizontal) 0,1,0, 1,0,1, 1,3,0, 3,1,1, // Length and number of words of that length 3, 4, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 2,4,0, 4,2,1, // End marker 0 }; /* * Name: 05.05, 5 x 5 * (_ _ _ * *) * (_ _ _ * *) * (_ _ _ _ _) * (* * _ _ _) * (* * _ _ _) */ const int g4[] = { // Width and height of crossword grid 5, 5, // Number of black fields 8, // Black field coordinates 0,3, 0,4, 1,3, 1,4, 3,0, 3,1, 4,0, 4,1, // Length and number of words of that length 5, 2, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 2,0,1, // Length and number of words of that length 3, 8, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 1,0,1, 2,3,0, 2,4,0, 3,2,1, 4,2,1, // End marker 0 }; /* * Name: 05.06, 5 x 5 * (* _ _ _ _) * (_ _ _ _ _) * (_ _ _ _ _) * (_ _ _ _ _) * (_ _ _ _ *) */ const int g5[] = { // Width and height of crossword grid 5, 5, // Number of black fields 2, // Black field coordinates 0,0, 4,4, // Length and number of words of that length 5, 6, // Coordinates where words start and direction (0 = horizontal) 0,1,0, 0,2,0, 0,3,0, 1,0,1, 2,0,1, 3,0,1, // Length and number of words of that length 4, 4, // Coordinates where words start and direction (0 = horizontal) 0,1,1, 0,4,0, 1,0,0, 4,0,1, // End marker 0 }; /* * Name: 05.07, 5 x 5 * (* _ _ _ _) * (* _ _ _ _) * (_ _ _ _ _) * (_ _ _ _ *) * (_ _ _ _ *) */ const int g6[] = { // Width and height of crossword grid 5, 5, // Number of black fields 4, // Black field coordinates 0,0, 0,1, 4,3, 4,4, // Length and number of words of that length 5, 4, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 1,0,1, 2,0,1, 3,0,1, // Length and number of words of that length 4, 4, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,4,0, 1,0,0, 1,1,0, // Length and number of words of that length 3, 2, // Coordinates where words start and direction (0 = horizontal) 0,2,1, 4,0,1, // End marker 0 }; /* * Name: 05.08, 5 x 5 * (* _ _ _ *) * (_ _ _ _ _) * (_ _ _ _ _) * (_ _ _ _ _) * (* _ _ _ *) */ const int g7[] = { // Width and height of crossword grid 5, 5, // Number of black fields 4, // Black field coordinates 0,0, 0,4, 4,0, 4,4, // Length and number of words of that length 5, 6, // Coordinates where words start and direction (0 = horizontal) 0,1,0, 0,2,0, 0,3,0, 1,0,1, 2,0,1, 3,0,1, // Length and number of words of that length 3, 4, // Coordinates where words start and direction (0 = horizontal) 0,1,1, 1,0,0, 1,4,0, 4,1,1, // End marker 0 }; /* * Name: 05.09, 5 x 5 * (* * _ _ _) * (* _ _ _ _) * (_ _ _ _ _) * (_ _ _ _ *) * (_ _ _ * *) */ const int g8[] = { // Width and height of crossword grid 5, 5, // Number of black fields 6, // Black field coordinates 0,0, 0,1, 1,0, 3,4, 4,3, 4,4, // Length and number of words of that length 5, 2, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 2,0,1, // Length and number of words of that length 4, 4, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 1,1,0, 1,1,1, 3,0,1, // Length and number of words of that length 3, 4, // Coordinates where words start and direction (0 = horizontal) 0,2,1, 0,4,0, 2,0,0, 4,0,1, // End marker 0 }; /* * Name: 05.10, 5 x 5 * (* * _ _ _) * (* * _ _ _) * (_ _ _ _ _) * (_ _ _ * *) * (_ _ _ * *) */ const int g9[] = { // Width and height of crossword grid 5, 5, // Number of black fields 8, // Black field coordinates 0,0, 0,1, 1,0, 1,1, 3,3, 3,4, 4,3, 4,4, // Length and number of words of that length 5, 2, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 2,0,1, // Length and number of words of that length 3, 8, // Coordinates where words start and direction (0 = horizontal) 0,2,1, 0,3,0, 0,4,0, 1,2,1, 2,0,0, 2,1,0, 3,0,1, 4,0,1, // End marker 0 }; /* * Name: 15.01, 15 x 15 * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ * * _ _ _ _ _ _) * (* * * _ _ _ * _ _ _ _ _ _ * *) * (_ _ _ _ _ * _ _ _ * _ _ _ _ _) * (_ _ _ * _ _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ _ * _ _ _) * (_ _ _ _ _ * _ _ _ * _ _ _ _ _) * (* * _ _ _ _ _ _ * _ _ _ * * *) * (_ _ _ _ _ _ * * _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) */ const int g10[] = { // Width and height of crossword grid 15, 15, // Number of black fields 36, // Black field coordinates 0,4, 0,10, 1,4, 1,10, 2,4, 3,6, 3,7, 4,0, 4,1, 4,8, 4,12, 4,13, 4,14, 5,5, 5,9, 6,4, 6,11, 7,3, 7,11, 8,3, 8,10, 9,5, 9,9, 10,0, 10,1, 10,2, 10,6, 10,13, 10,14, 11,7, 11,8, 12,10, 13,4, 13,10, 14,4, 14,10, // Length and number of words of that length 10, 4, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 2,5,1, 5,12,0, 12,0,1, // Length and number of words of that length 7, 6, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 3,8,1, 4,7,0, 7,4,1, 8,11,0, 11,0,1, // Length and number of words of that length 6, 12, // Coordinates where words start and direction (0 = horizontal) 0,11,0, 2,10,0, 3,0,1, 4,2,1, 4,6,0, 5,8,0, 6,5,1, 7,4,0, 8,4,1, 9,3,0, 10,7,1, 11,9,1, // Length and number of words of that length 5, 16, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,5,1, 0,9,0, 1,5,1, 5,0,0, 5,0,1, 5,1,0, 5,10,1, 5,13,0, 5,14,0, 9,0,1, 9,10,1, 10,5,0, 10,9,0, 13,5,1, 14,5,1, // Length and number of words of that length 4, 24, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,8,0, 0,11,1, 0,12,0, 0,13,0, 0,14,0, 1,0,1, 1,11,1, 2,0,1, 6,0,1, 8,11,1, 11,0,0, 11,1,0, 11,2,0, 11,6,0, 11,13,0, 11,14,0, 12,11,1, 13,0,1, 13,11,1, 14,0,1, 14,11,1, // Length and number of words of that length 3, 16, // Coordinates where words start and direction (0 = horizontal) 0,6,0, 0,7,0, 3,4,0, 4,9,1, 5,6,1, 6,5,0, 6,9,0, 6,12,1, 7,0,1, 7,12,1, 8,0,1, 9,6,1, 9,10,0, 10,3,1, 12,7,0, 12,8,0, // End marker 0 }; /* * Name: 15.02, 15 x 15 * (_ _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ _ _ _ _ _) * (_ _ _ * _ _ _ _ * _ _ _ * * *) * (* * * _ _ _ _ * _ _ _ * _ _ _) * (_ _ _ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _ _ _) * (_ _ _ * _ _ _ * _ _ _ _ * * *) * (* * * _ _ _ * _ _ _ _ * _ _ _) * (_ _ _ _ _ _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ _) */ const int g11[] = { // Width and height of crossword grid 15, 15, // Number of black fields 34, // Black field coordinates 0,5, 0,10, 1,5, 1,10, 2,5, 2,10, 3,4, 3,9, 4,3, 4,8, 4,13, 4,14, 5,0, 5,7, 6,6, 6,10, 7,5, 7,9, 8,4, 8,8, 9,7, 9,14, 10,0, 10,1, 10,6, 10,11, 11,5, 11,10, 12,4, 12,9, 13,4, 13,9, 14,4, 14,9, // Length and number of words of that length 15, 2, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 0,12,0, // Length and number of words of that length 10, 4, // Coordinates where words start and direction (0 = horizontal) 0,1,0, 0,11,0, 5,3,0, 5,13,0, // Length and number of words of that length 7, 2, // Coordinates where words start and direction (0 = horizontal) 5,8,1, 9,0,1, // Length and number of words of that length 6, 6, // Coordinates where words start and direction (0 = horizontal) 0,6,0, 5,1,1, 6,0,1, 8,9,1, 9,8,0, 9,8,1, // Length and number of words of that length 5, 14, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,7,0, 1,0,1, 2,0,1, 3,10,1, 7,0,1, 7,10,1, 10,7,0, 10,14,0, 11,0,1, 12,10,1, 13,10,1, 14,10,1, // Length and number of words of that length 4, 36, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,6,1, 0,8,0, 0,11,1, 0,13,0, 0,14,0, 1,6,1, 1,11,1, 2,6,1, 2,11,1, 3,0,1, 3,5,0, 3,5,1, 4,4,0, 4,4,1, 4,9,1, 5,14,0, 6,0,0, 6,11,1, 7,10,0, 8,0,1, 8,9,0, 10,2,1, 10,7,1, 11,0,0, 11,1,0, 11,6,0, 11,6,1, 11,11,0, 11,11,1, 12,0,1, 12,5,1, 13,0,1, 13,5,1, 14,0,1, 14,5,1, // Length and number of words of that length 3, 16, // Coordinates where words start and direction (0 = horizontal) 0,4,0, 0,9,0, 3,10,0, 4,0,1, 4,9,0, 5,8,0, 6,7,0, 6,7,1, 7,6,0, 7,6,1, 8,5,0, 8,5,1, 9,4,0, 10,12,1, 12,5,0, 12,10,0, // End marker 0 }; /* * Name: 15.03, 15 x 15 * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) */ const int g12[] = { // Width and height of crossword grid 15, 15, // Number of black fields 36, // Black field coordinates 0,4, 0,10, 1,4, 1,10, 2,4, 2,10, 3,8, 4,0, 4,1, 4,2, 4,7, 4,12, 4,13, 4,14, 5,6, 6,5, 6,11, 7,4, 7,10, 8,3, 8,9, 9,8, 10,0, 10,1, 10,2, 10,7, 10,12, 10,13, 10,14, 11,6, 12,4, 12,10, 13,4, 13,10, 14,4, 14,10, // Length and number of words of that length 8, 8, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,9,0, 3,0,1, 5,7,1, 7,5,0, 7,11,0, 9,0,1, 11,7,1, // Length and number of words of that length 6, 8, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,11,0, 3,9,1, 5,0,1, 9,3,0, 9,9,0, 9,9,1, 11,0,1, // Length and number of words of that length 5, 22, // Coordinates where words start and direction (0 = horizontal) 0,5,1, 0,6,0, 1,5,1, 2,5,1, 4,8,0, 5,0,0, 5,1,0, 5,2,0, 5,7,0, 5,12,0, 5,13,0, 5,14,0, 6,0,1, 6,6,0, 6,6,1, 7,5,1, 8,4,1, 8,10,1, 10,8,0, 12,5,1, 13,5,1, 14,5,1, // Length and number of words of that length 4, 36, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,7,0, 0,11,1, 0,12,0, 0,13,0, 0,14,0, 1,0,1, 1,11,1, 2,0,1, 2,11,1, 3,4,0, 3,10,0, 4,3,1, 4,8,1, 7,0,1, 7,11,1, 8,4,0, 8,10,0, 10,3,1, 10,8,1, 11,0,0, 11,1,0, 11,2,0, 11,7,0, 11,12,0, 11,13,0, 11,14,0, 12,0,1, 12,11,1, 13,0,1, 13,11,1, 14,0,1, 14,11,1, // Length and number of words of that length 3, 4, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 6,12,1, 8,0,1, 12,6,0, // End marker 0 }; /* * Name: 15.04, 15 x 15 * (_ _ _ * _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _) * (* * * _ _ _ * _ _ _ _ _ * * *) * (_ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _) * (* * * _ _ _ _ _ * _ _ _ * * *) * (_ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ * _ _ _) */ const int g13[] = { // Width and height of crossword grid 15, 15, // Number of black fields 32, // Black field coordinates 0,4, 0,10, 1,4, 1,10, 2,4, 2,10, 3,0, 3,5, 3,11, 4,6, 5,3, 5,9, 6,4, 6,8, 6,13, 6,14, 8,0, 8,1, 8,6, 8,10, 9,5, 9,11, 10,8, 11,3, 11,9, 11,14, 12,4, 12,10, 13,4, 13,10, 14,4, 14,10, // Length and number of words of that length 15, 4, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 0,7,0, 0,12,0, 7,0,1, // Length and number of words of that length 8, 4, // Coordinates where words start and direction (0 = horizontal) 0,1,0, 4,7,1, 7,13,0, 10,0,1, // Length and number of words of that length 6, 8, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 0,13,0, 0,14,0, 4,0,1, 9,0,0, 9,1,0, 9,6,0, 10,9,1, // Length and number of words of that length 5, 22, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,5,1, 0,9,0, 1,5,1, 2,5,1, 3,6,1, 3,10,0, 4,5,0, 4,11,0, 5,4,1, 5,10,1, 6,3,0, 6,9,0, 7,4,0, 9,0,1, 9,6,1, 10,5,0, 10,11,0, 11,4,1, 12,5,1, 13,5,1, 14,5,1, // Length and number of words of that length 4, 22, // Coordinates where words start and direction (0 = horizontal) 0,0,1, 0,6,0, 0,11,1, 1,0,1, 1,11,1, 2,0,1, 2,11,1, 3,1,1, 4,0,0, 6,0,1, 6,9,1, 7,14,0, 8,2,1, 8,11,1, 11,8,0, 11,10,1, 12,0,1, 12,11,1, 13,0,1, 13,11,1, 14,0,1, 14,11,1, // Length and number of words of that length 3, 16, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,5,0, 0,11,0, 3,4,0, 3,12,1, 5,0,1, 5,6,0, 6,5,1, 7,8,0, 8,7,1, 9,10,0, 9,12,1, 11,0,1, 12,3,0, 12,9,0, 12,14,0, // End marker 0 }; /* * Name: 15.05, 15 x 15 * (_ _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (* * * * _ _ _ * * * _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ * * * *) * (_ _ _ _ _ * * _ _ _ _ _ _ _ *) * (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _) * (* _ _ _ _ _ _ _ * * _ _ _ _ _) * (* * * * _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ * * * _ _ _ * * * *) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ _) */ const int g14[] = { // Width and height of crossword grid 15, 15, // Number of black fields 44, // Black field coordinates 0,4, 0,8, 0,9, 1,4, 1,9, 2,4, 2,9, 3,4, 3,9, 4,3, 4,11, 4,12, 4,13, 4,14, 5,0, 5,1, 5,6, 5,10, 6,5, 6,6, 6,10, 7,4, 7,10, 8,4, 8,8, 8,9, 9,4, 9,8, 9,13, 9,14, 10,0, 10,1, 10,2, 10,3, 10,11, 11,5, 11,10, 12,5, 12,10, 13,5, 13,10, 14,5, 14,6, 14,10, // Length and number of words of that length 15, 1, // Coordinates where words start and direction (0 = horizontal) 0,7,0, // Length and number of words of that length 10, 2, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 5,12,0, // Length and number of words of that length 7, 4, // Coordinates where words start and direction (0 = horizontal) 1,8,0, 4,4,1, 7,6,0, 10,4,1, // Length and number of words of that length 6, 2, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 9,9,0, // Length and number of words of that length 5, 21, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,1,0, 0,6,0, 0,10,0, 0,10,1, 1,10,1, 2,10,1, 3,10,1, 5,3,0, 5,11,0, 6,0,1, 7,5,1, 8,10,1, 10,4,0, 10,8,0, 10,13,0, 10,14,0, 11,0,1, 12,0,1, 13,0,1, 14,0,1, // Length and number of words of that length 4, 38, // Coordinates where words start and direction (0 = horizontal) 0,0,1, 0,3,0, 0,11,0, 0,12,0, 0,13,0, 0,14,0, 1,0,1, 1,5,1, 2,0,1, 2,5,1, 3,0,1, 3,5,1, 4,9,0, 5,2,1, 5,11,1, 5,13,0, 5,14,0, 6,0,0, 6,1,0, 6,11,1, 7,0,1, 7,5,0, 7,11,1, 8,0,1, 9,0,1, 9,9,1, 11,0,0, 11,1,0, 11,2,0, 11,3,0, 11,6,1, 11,11,0, 11,11,1, 12,6,1, 12,11,1, 13,6,1, 13,11,1, 14,11,1, // Length and number of words of that length 3, 10, // Coordinates where words start and direction (0 = horizontal) 0,5,1, 4,0,1, 4,4,0, 5,7,1, 6,7,1, 8,5,1, 8,10,0, 9,5,1, 10,12,1, 14,7,1, // End marker 0 }; /* * Name: 15.06, 15 x 15 * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (* * * _ _ _ * _ _ _ _ _ * * *) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ * _ _ _ _ _ _ _ * _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ _) * (* * * _ _ _ _ _ * _ _ _ * * *) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _) */ const int g15[] = { // Width and height of crossword grid 15, 15, // Number of black fields 30, // Black field coordinates 0,4, 0,10, 1,4, 1,10, 2,4, 2,10, 3,7, 4,3, 4,11, 5,8, 6,4, 6,9, 7,0, 7,1, 7,2, 7,12, 7,13, 7,14, 8,5, 8,10, 9,6, 10,3, 10,11, 11,7, 12,4, 12,10, 13,4, 13,10, 14,4, 14,10, // Length and number of words of that length 9, 3, // Coordinates where words start and direction (0 = horizontal) 0,6,0, 6,8,0, 7,3,1, // Length and number of words of that length 8, 4, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 5,0,1, 7,9,0, 9,7,1, // Length and number of words of that length 7, 19, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,1,0, 0,2,0, 0,12,0, 0,13,0, 0,14,0, 3,0,1, 3,8,1, 4,4,1, 4,7,0, 8,0,0, 8,1,0, 8,2,0, 8,12,0, 8,13,0, 8,14,0, 10,4,1, 11,0,1, 11,8,1, // Length and number of words of that length 6, 4, // Coordinates where words start and direction (0 = horizontal) 0,9,0, 5,9,1, 9,0,1, 9,5,0, // Length and number of words of that length 5, 14, // Coordinates where words start and direction (0 = horizontal) 0,5,1, 0,8,0, 1,5,1, 2,5,1, 3,10,0, 5,3,0, 5,11,0, 6,10,1, 7,4,0, 8,0,1, 10,6,0, 12,5,1, 13,5,1, 14,5,1, // Length and number of words of that length 4, 20, // Coordinates where words start and direction (0 = horizontal) 0,0,1, 0,3,0, 0,11,0, 0,11,1, 1,0,1, 1,11,1, 2,0,1, 2,11,1, 6,0,1, 6,5,1, 8,6,1, 8,11,1, 11,3,0, 11,11,0, 12,0,1, 12,11,1, 13,0,1, 13,11,1, 14,0,1, 14,11,1, // Length and number of words of that length 3, 8, // Coordinates where words start and direction (0 = horizontal) 0,7,0, 3,4,0, 4,0,1, 4,12,1, 9,10,0, 10,0,1, 10,12,1, 12,7,0, // End marker 0 }; /* * Name: 15.07, 15 x 15 * (_ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (* * _ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ * * *) * (_ _ _ _ * _ _ _ _ _ _ _ _ _ _) * (_ _ _ * _ _ _ _ _ _ _ * _ _ _) * (_ _ _ _ _ _ _ _ _ _ * _ _ _ _) * (* * * _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _ * *) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _) */ const int g16[] = { // Width and height of crossword grid 15, 15, // Number of black fields 32, // Black field coordinates 0,4, 0,9, 1,4, 1,9, 2,9, 3,7, 4,0, 4,1, 4,6, 4,10, 5,5, 5,12, 5,13, 5,14, 6,4, 7,3, 7,11, 8,10, 9,0, 9,1, 9,2, 9,9, 10,4, 10,8, 10,13, 10,14, 11,7, 12,5, 13,5, 13,10, 14,5, 14,10, // Length and number of words of that length 10, 4, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 5,6,0, 6,5,1, 8,0,1, // Length and number of words of that length 9, 4, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 2,0,1, 6,12,0, 12,6,1, // Length and number of words of that length 7, 10, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,11,0, 3,0,1, 3,8,1, 4,7,0, 7,4,1, 8,3,0, 8,11,0, 11,0,1, 11,8,1, // Length and number of words of that length 6, 4, // Coordinates where words start and direction (0 = horizontal) 3,9,0, 5,6,1, 6,5,0, 9,3,1, // Length and number of words of that length 5, 16, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,10,1, 0,12,0, 0,13,0, 0,14,0, 1,10,1, 2,10,1, 5,0,1, 9,10,1, 10,0,0, 10,1,0, 10,2,0, 10,9,0, 12,0,1, 13,0,1, 14,0,1, // Length and number of words of that length 4, 28, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,5,1, 0,6,0, 0,10,0, 1,0,1, 1,5,1, 2,4,0, 4,2,1, 4,11,1, 5,0,0, 5,1,0, 6,0,1, 6,13,0, 6,14,0, 8,11,1, 9,10,0, 10,0,1, 10,9,1, 11,4,0, 11,8,0, 11,13,0, 11,14,0, 13,6,1, 13,11,1, 14,6,1, 14,11,1, // Length and number of words of that length 3, 8, // Coordinates where words start and direction (0 = horizontal) 0,7,0, 4,7,1, 5,10,0, 7,0,1, 7,4,0, 7,12,1, 10,5,1, 12,7,0, // End marker 0 }; /* * Name: 15.08, 15 x 15 * (_ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _) * (* * * _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ _ _ _ * * *) * (_ _ _ _ * _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ * _ _ _ _) * (* * * _ _ _ _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ * * *) * (_ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _) */ const int g17[] = { // Width and height of crossword grid 15, 15, // Number of black fields 39, // Black field coordinates 0,4, 0,9, 1,4, 1,9, 2,4, 2,9, 3,5, 3,11, 4,0, 4,1, 4,2, 4,6, 4,10, 5,3, 5,12, 5,13, 5,14, 6,4, 6,8, 7,7, 8,6, 8,10, 9,0, 9,1, 9,2, 9,11, 10,4, 10,8, 10,12, 10,13, 10,14, 11,3, 11,9, 12,5, 12,10, 13,5, 13,10, 14,5, 14,10, // Length and number of words of that length 8, 4, // Coordinates where words start and direction (0 = horizontal) 3,9,0, 4,5,0, 5,4,1, 9,3,1, // Length and number of words of that length 7, 4, // Coordinates where words start and direction (0 = horizontal) 0,7,0, 7,0,1, 7,8,1, 8,7,0, // Length and number of words of that length 6, 4, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 6,9,1, 8,0,1, 9,6,0, // Length and number of words of that length 5, 20, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,10,1, 0,12,0, 0,13,0, 0,14,0, 1,10,1, 2,10,1, 3,0,1, 3,6,1, 4,11,0, 6,3,0, 10,0,0, 10,1,0, 10,2,0, 10,11,0, 11,4,1, 11,10,1, 12,0,1, 13,0,1, 14,0,1, // Length and number of words of that length 4, 32, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,5,1, 0,6,0, 0,10,0, 1,0,1, 1,5,1, 2,0,1, 2,5,1, 4,11,1, 5,0,0, 5,1,0, 5,2,0, 6,0,1, 6,12,0, 6,13,0, 6,14,0, 8,11,1, 10,0,1, 11,4,0, 11,8,0, 11,12,0, 11,13,0, 11,14,0, 12,6,1, 12,11,1, 13,6,1, 13,11,1, 14,6,1, 14,11,1, // Length and number of words of that length 3, 20, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,11,0, 3,4,0, 3,12,1, 4,3,1, 4,7,1, 5,0,1, 5,6,0, 5,10,0, 6,5,1, 7,4,0, 7,8,0, 8,7,1, 9,10,0, 9,12,1, 10,5,1, 10,9,1, 11,0,1, 12,3,0, 12,9,0, // End marker 0 }; /* * Name: 15.09, 15 x 15 * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (* * * _ _ _ * _ _ _ _ _ * * *) * (_ _ _ _ _ * _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _ _ _) * (_ _ _ * _ _ _ _ _ _ _ * _ _ _) * (_ _ _ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ * _ _ _ _ _) * (* * * _ _ _ _ _ * _ _ _ * * *) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) */ const int g18[] = { // Width and height of crossword grid 15, 15, // Number of black fields 38, // Black field coordinates 0,4, 0,10, 1,4, 1,10, 2,4, 2,10, 3,7, 4,0, 4,1, 4,2, 4,6, 4,12, 4,13, 4,14, 5,5, 5,9, 6,4, 6,8, 7,3, 7,11, 8,6, 8,10, 9,5, 9,9, 10,0, 10,1, 10,2, 10,8, 10,12, 10,13, 10,14, 11,7, 12,4, 12,10, 13,4, 13,10, 14,4, 14,10, // Length and number of words of that length 7, 10, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,11,0, 3,0,1, 3,8,1, 4,7,0, 7,4,1, 8,3,0, 8,11,0, 11,0,1, 11,8,1, // Length and number of words of that length 6, 4, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 6,9,1, 8,0,1, 9,6,0, // Length and number of words of that length 5, 24, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,5,1, 0,9,0, 1,5,1, 2,5,1, 3,10,0, 4,7,1, 5,0,0, 5,0,1, 5,1,0, 5,2,0, 5,10,1, 5,12,0, 5,13,0, 5,14,0, 7,4,0, 9,0,1, 9,10,1, 10,3,1, 10,5,0, 10,9,0, 12,5,1, 13,5,1, 14,5,1, // Length and number of words of that length 4, 28, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,6,0, 0,11,1, 0,12,0, 0,13,0, 0,14,0, 1,0,1, 1,11,1, 2,0,1, 2,11,1, 6,0,1, 8,11,1, 11,0,0, 11,1,0, 11,2,0, 11,8,0, 11,12,0, 11,13,0, 11,14,0, 12,0,1, 12,11,1, 13,0,1, 13,11,1, 14,0,1, 14,11,1, // Length and number of words of that length 3, 16, // Coordinates where words start and direction (0 = horizontal) 0,7,0, 3,4,0, 4,3,1, 5,6,0, 5,6,1, 6,5,0, 6,5,1, 6,9,0, 7,0,1, 7,8,0, 7,12,1, 8,7,1, 9,6,1, 9,10,0, 10,9,1, 12,7,0, // End marker 0 }; /* * Name: 15.10, 15 x 15 * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ * _ _ _ _) * (* * * * _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ * * _ _ _ _ _ * * *) * (_ _ _ _ * _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ * _ _ _ _) * (* * * _ _ _ _ _ * * _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ * * * *) * (_ _ _ _ * _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) */ const int g19[] = { // Width and height of crossword grid 15, 15, // Number of black fields 35, // Black field coordinates 0,4, 0,9, 1,4, 1,9, 2,4, 2,9, 3,4, 4,0, 4,1, 4,6, 4,11, 4,12, 4,13, 4,14, 5,5, 6,5, 6,10, 7,7, 8,4, 8,9, 9,9, 10,0, 10,1, 10,2, 10,3, 10,8, 10,13, 10,14, 11,10, 12,5, 12,10, 13,5, 13,10, 14,5, 14,10, // Length and number of words of that length 10, 8, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 0,3,0, 0,8,0, 3,5,1, 5,6,0, 5,11,0, 5,12,0, 11,0,1, // Length and number of words of that length 9, 2, // Coordinates where words start and direction (0 = horizontal) 5,6,1, 9,0,1, // Length and number of words of that length 7, 4, // Coordinates where words start and direction (0 = horizontal) 0,7,0, 7,0,1, 7,8,1, 8,7,0, // Length and number of words of that length 6, 2, // Coordinates where words start and direction (0 = horizontal) 0,10,0, 9,4,0, // Length and number of words of that length 5, 18, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,10,1, 1,10,1, 2,10,1, 3,9,0, 5,0,0, 5,0,1, 5,1,0, 5,13,0, 5,14,0, 6,0,1, 7,5,0, 8,10,1, 9,10,1, 10,9,0, 12,0,1, 13,0,1, 14,0,1, // Length and number of words of that length 4, 38, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,5,1, 0,6,0, 0,11,0, 0,12,0, 0,13,0, 0,14,0, 1,0,1, 1,5,1, 2,0,1, 2,5,1, 3,0,1, 4,2,1, 4,4,0, 4,7,1, 6,6,1, 6,11,1, 7,10,0, 8,0,1, 8,5,1, 10,4,1, 10,9,1, 11,0,0, 11,1,0, 11,2,0, 11,3,0, 11,8,0, 11,11,1, 11,13,0, 11,14,0, 12,6,1, 12,11,1, 13,6,1, 13,11,1, 14,6,1, 14,11,1, // End marker 0 }; /* * Name: 19.01, 19 x 19 * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ * _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (* * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * *) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ * _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) */ const int g20[] = { // Width and height of crossword grid 19, 19, // Number of black fields 60, // Black field coordinates 0,4, 0,9, 0,14, 1,4, 1,9, 1,14, 2,4, 2,14, 3,7, 3,12, 4,0, 4,1, 4,6, 4,11, 4,17, 4,18, 5,5, 5,10, 6,4, 6,9, 6,15, 7,3, 7,8, 7,14, 8,7, 8,13, 9,0, 9,1, 9,2, 9,6, 9,12, 9,16, 9,17, 9,18, 10,5, 10,11, 11,4, 11,10, 11,15, 12,3, 12,9, 12,14, 13,8, 13,13, 14,0, 14,1, 14,7, 14,12, 14,17, 14,18, 15,6, 15,11, 16,4, 16,14, 17,4, 17,9, 17,14, 18,4, 18,9, 18,14, // Length and number of words of that length 9, 6, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 0,16,0, 2,5,1, 10,2,0, 10,16,0, 16,5,1, // Length and number of words of that length 8, 4, // Coordinates where words start and direction (0 = horizontal) 0,13,0, 5,11,1, 11,5,0, 13,0,1, // Length and number of words of that length 7, 8, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,8,0, 3,0,1, 8,0,1, 10,12,1, 12,10,0, 12,15,0, 15,12,1, // Length and number of words of that length 6, 4, // Coordinates where words start and direction (0 = horizontal) 0,15,0, 3,13,1, 13,3,0, 15,0,1, // Length and number of words of that length 5, 24, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,10,0, 4,12,0, 4,12,1, 5,0,1, 5,11,0, 6,10,0, 6,10,1, 7,9,0, 7,9,1, 8,8,0, 8,8,1, 8,14,1, 9,7,0, 9,7,1, 10,0,1, 10,6,0, 10,6,1, 11,5,1, 12,4,1, 13,14,1, 14,2,1, 14,8,0, 14,13,0, // Length and number of words of that length 4, 70, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,5,1, 0,6,0, 0,10,1, 0,11,0, 0,15,1, 0,17,0, 0,18,0, 1,0,1, 1,5,1, 1,10,1, 1,15,1, 2,0,1, 2,9,0, 2,15,1, 3,8,1, 3,14,0, 4,2,1, 4,7,0, 4,7,1, 5,0,0, 5,1,0, 5,6,0, 5,6,1, 5,17,0, 5,18,0, 6,0,1, 6,5,0, 6,5,1, 7,4,0, 7,4,1, 7,15,0, 7,15,1, 8,3,0, 8,14,0, 9,13,0, 10,0,0, 10,1,0, 10,12,0, 10,17,0, 10,18,0, 11,0,1, 11,11,0, 11,11,1, 12,4,0, 12,10,1, 12,15,1, 13,9,0, 13,9,1, 14,8,1, 14,13,1, 15,0,0, 15,1,0, 15,7,0, 15,7,1, 15,12,0, 15,17,0, 15,18,0, 16,0,1, 16,15,1, 17,0,1, 17,5,1, 17,10,1, 17,15,1, 18,0,1, 18,5,1, 18,10,1, 18,15,1, // Length and number of words of that length 3, 12, // Coordinates where words start and direction (0 = horizontal) 0,7,0, 0,12,0, 3,4,0, 6,16,1, 7,0,1, 9,3,1, 9,13,1, 11,16,1, 12,0,1, 13,14,0, 16,6,0, 16,11,0, // End marker 0 }; /* * Name: 19.02, 19 x 19 * (_ _ _ _ _ * * _ _ _ _ _ * * _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * * _ _ _ _ _ _ _) * (* * * _ _ _ _ _ _ * _ _ _ _ _ _ _ * *) * (_ _ _ _ _ _ _ * * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * * _ _ _ _ _ _ _ * * _ _ _) * (_ _ _ * * _ _ _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * * * _ _ _ _ _ _) * (* * _ _ _ _ _ _ _ * _ _ _ _ _ _ _ * *) * (_ _ _ _ _ _ * * * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ _ _ * * _ _ _) * (_ _ _ * * _ _ _ _ _ _ _ * * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * * _ _ _ _ _ _ _) * (* * _ _ _ _ _ _ _ * _ _ _ _ _ _ * * *) * (_ _ _ _ _ _ _ * * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ * * _ _ _ _ _ * * _ _ _ _ _) */ const int g21[] = { // Width and height of crossword grid 19, 19, // Number of black fields 65, // Black field coordinates 0,4, 0,9, 0,14, 1,4, 1,9, 1,14, 2,4, 3,7, 3,12, 4,3, 4,7, 4,8, 4,12, 4,13, 5,0, 5,1, 5,6, 5,11, 5,16, 5,17, 5,18, 6,0, 6,6, 6,10, 6,18, 7,5, 7,10, 7,15, 8,5, 8,10, 8,15, 9,4, 9,9, 9,14, 10,3, 10,8, 10,13, 11,3, 11,8, 11,13, 12,0, 12,8, 12,12, 12,18, 13,0, 13,1, 13,2, 13,7, 13,12, 13,17, 13,18, 14,5, 14,6, 14,10, 14,11, 14,15, 15,6, 15,11, 16,14, 17,4, 17,9, 17,14, 18,4, 18,9, 18,14, // Length and number of words of that length 14, 2, // Coordinates where words start and direction (0 = horizontal) 2,5,1, 16,0,1, // Length and number of words of that length 13, 2, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 6,16,0, // Length and number of words of that length 8, 2, // Coordinates where words start and direction (0 = horizontal) 5,7,0, 6,11,0, // Length and number of words of that length 7, 16, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,15,0, 2,9,0, 2,14,0, 3,0,1, 5,12,0, 6,1,0, 6,11,1, 6,17,0, 7,6,0, 10,4,0, 10,9,0, 12,1,1, 12,3,0, 12,13,0, 15,12,1, // Length and number of words of that length 6, 6, // Coordinates where words start and direction (0 = horizontal) 0,10,0, 3,4,0, 3,13,1, 10,14,0, 13,8,0, 15,0,1, // Length and number of words of that length 5, 30, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,1,0, 0,6,0, 0,11,0, 0,16,0, 0,17,0, 0,18,0, 4,14,1, 5,3,0, 5,8,0, 5,13,0, 6,1,1, 7,0,0, 7,0,1, 7,18,0, 8,0,1, 9,5,0, 9,10,0, 9,15,0, 10,14,1, 11,14,1, 12,13,1, 14,0,0, 14,0,1, 14,1,0, 14,2,0, 14,7,0, 14,12,0, 14,17,0, 14,18,0, // Length and number of words of that length 4, 44, // Coordinates where words start and direction (0 = horizontal) 0,0,1, 0,3,0, 0,5,1, 0,8,0, 0,10,1, 0,13,0, 0,15,1, 1,0,1, 1,5,1, 1,10,1, 1,15,1, 2,0,1, 3,8,1, 5,2,1, 5,7,1, 5,12,1, 7,6,1, 7,11,1, 8,6,1, 8,11,1, 9,0,1, 9,5,1, 9,10,1, 9,15,1, 10,4,1, 10,9,1, 11,4,1, 11,9,1, 13,3,1, 13,8,1, 13,13,1, 15,5,0, 15,7,1, 15,10,0, 15,15,0, 16,15,1, 17,0,1, 17,5,1, 17,10,1, 17,15,1, 18,0,1, 18,5,1, 18,10,1, 18,15,1, // Length and number of words of that length 3, 16, // Coordinates where words start and direction (0 = horizontal) 0,7,0, 0,12,0, 4,0,1, 4,4,1, 4,9,1, 6,7,1, 7,16,1, 8,16,1, 10,0,1, 11,0,1, 12,9,1, 14,7,1, 14,12,1, 14,16,1, 16,6,0, 16,11,0, // End marker 0 }; /* * Name: 19.03, 19 x 19 * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _) * (* * * _ _ _ _ _ * _ _ _ _ _ _ _ * * *) * (_ _ _ _ _ _ _ * _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ * * _ _ _ _ _ _ _ _ _ * * _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ * _ _ _ _ _ _ _) * (* * * _ _ _ _ _ _ _ * _ _ _ _ _ * * *) * (_ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) */ const int g22[] = { // Width and height of crossword grid 19, 19, // Number of black fields 54, // Black field coordinates 0,6, 0,12, 1,6, 1,12, 2,6, 2,12, 3,3, 3,9, 3,15, 4,4, 4,9, 4,14, 5,5, 5,13, 6,0, 6,1, 6,2, 6,8, 6,16, 6,17, 6,18, 7,7, 7,11, 8,6, 8,10, 9,3, 9,4, 9,14, 9,15, 10,8, 10,12, 11,7, 11,11, 12,0, 12,1, 12,2, 12,10, 12,16, 12,17, 12,18, 13,5, 13,13, 14,4, 14,9, 14,14, 15,3, 15,9, 15,15, 16,6, 16,12, 17,6, 17,12, 18,6, 18,12, // Length and number of words of that length 9, 2, // Coordinates where words start and direction (0 = horizontal) 5,9,0, 9,5,1, // Length and number of words of that length 8, 4, // Coordinates where words start and direction (0 = horizontal) 0,10,0, 8,11,1, 10,0,1, 11,8,0, // Length and number of words of that length 7, 16, // Coordinates where words start and direction (0 = horizontal) 0,7,0, 0,11,0, 3,12,0, 5,6,1, 6,5,0, 6,9,1, 6,13,0, 7,0,1, 7,12,1, 9,6,0, 11,0,1, 11,12,1, 12,3,1, 12,7,0, 12,11,0, 13,6,1, // Length and number of words of that length 6, 28, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,8,0, 0,13,1, 0,16,0, 0,17,0, 0,18,0, 1,0,1, 1,13,1, 2,0,1, 2,13,1, 8,0,1, 10,13,1, 13,0,0, 13,1,0, 13,2,0, 13,10,0, 13,16,0, 13,17,0, 13,18,0, 16,0,1, 16,13,1, 17,0,1, 17,13,1, 18,0,1, 18,13,1, // Length and number of words of that length 5, 32, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,7,1, 0,13,0, 1,7,1, 2,7,1, 3,4,1, 3,6,0, 3,10,1, 4,3,0, 4,15,0, 5,0,1, 5,14,1, 6,3,1, 7,0,0, 7,1,0, 7,2,0, 7,16,0, 7,17,0, 7,18,0, 10,3,0, 10,15,0, 11,12,0, 12,11,1, 13,0,1, 13,14,1, 14,5,0, 14,13,0, 15,4,1, 15,10,1, 16,7,1, 17,7,1, 18,7,1, // Length and number of words of that length 4, 16, // Coordinates where words start and direction (0 = horizontal) 0,4,0, 0,14,0, 4,0,1, 4,5,1, 4,10,1, 4,15,1, 5,4,0, 5,14,0, 10,4,0, 10,14,0, 14,0,1, 14,5,1, 14,10,1, 14,15,1, 15,4,0, 15,14,0, // Length and number of words of that length 3, 20, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,9,0, 0,15,0, 3,0,1, 3,16,1, 7,8,0, 7,8,1, 8,7,0, 8,7,1, 8,11,0, 9,0,1, 9,10,0, 9,16,1, 10,9,1, 11,8,1, 15,0,1, 15,16,1, 16,3,0, 16,9,0, 16,15,0, // End marker 0 }; /* * Name: 19.04, 19 x 19 * (_ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ * _ _ _ * _ _ _ * _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ * * * _ _ _ * _ _ _ _) * (* * * _ _ _ _ _ _ _ _ _ _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ * _ _ _ * _ _ _ * _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ * * * _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ * _ _ _ * _ _ _ * _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ _ _ _ _ _ _ _ _ _ * * *) * (_ _ _ _ * _ _ _ * * * _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ * _ _ _ * _ _ _ * _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _) */ const int g23[] = { // Width and height of crossword grid 19, 19, // Number of black fields 65, // Black field coordinates 0,5, 0,13, 1,5, 1,13, 2,5, 2,13, 3,3, 3,7, 3,11, 3,15, 4,4, 4,8, 4,9, 4,10, 4,14, 5,0, 5,1, 5,2, 5,16, 5,17, 5,18, 6,6, 6,12, 7,3, 7,7, 7,11, 7,15, 8,4, 8,9, 8,14, 9,4, 9,8, 9,9, 9,10, 9,14, 10,4, 10,9, 10,14, 11,3, 11,7, 11,11, 11,15, 12,6, 12,12, 13,0, 13,1, 13,2, 13,16, 13,17, 13,18, 14,4, 14,8, 14,9, 14,10, 14,14, 15,3, 15,7, 15,11, 15,15, 16,5, 16,13, 17,5, 17,13, 18,5, 18,13, // Length and number of words of that length 13, 4, // Coordinates where words start and direction (0 = horizontal) 3,5,0, 3,13,0, 5,3,1, 13,3,1, // Length and number of words of that length 7, 12, // Coordinates where words start and direction (0 = horizontal) 0,6,1, 1,6,1, 2,6,1, 6,0,0, 6,1,0, 6,2,0, 6,16,0, 6,17,0, 6,18,0, 16,6,1, 17,6,1, 18,6,1, // Length and number of words of that length 6, 8, // Coordinates where words start and direction (0 = horizontal) 0,6,0, 0,12,0, 6,0,1, 6,13,1, 12,0,1, 12,13,1, 13,6,0, 13,12,0, // Length and number of words of that length 5, 28, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,14,1, 0,16,0, 0,17,0, 0,18,0, 1,0,1, 1,14,1, 2,0,1, 2,14,1, 6,7,1, 7,6,0, 7,12,0, 12,7,1, 14,0,0, 14,1,0, 14,2,0, 14,16,0, 14,17,0, 14,18,0, 16,0,1, 16,14,1, 17,0,1, 17,14,1, 18,0,1, 18,14,1, // Length and number of words of that length 4, 28, // Coordinates where words start and direction (0 = horizontal) 0,4,0, 0,8,0, 0,9,0, 0,10,0, 0,14,0, 4,0,1, 4,15,1, 5,8,0, 5,10,0, 8,0,1, 8,5,1, 8,10,1, 8,15,1, 9,0,1, 9,15,1, 10,0,1, 10,5,1, 10,8,0, 10,10,0, 10,10,1, 10,15,1, 14,0,1, 14,15,1, 15,4,0, 15,8,0, 15,9,0, 15,10,0, 15,14,0, // Length and number of words of that length 3, 52, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,7,0, 0,11,0, 0,15,0, 3,0,1, 3,4,1, 3,8,1, 3,12,1, 3,16,1, 4,3,0, 4,5,1, 4,7,0, 4,11,0, 4,11,1, 4,15,0, 5,4,0, 5,9,0, 5,14,0, 7,0,1, 7,4,1, 7,8,1, 7,12,1, 7,16,1, 8,3,0, 8,7,0, 8,11,0, 8,15,0, 9,5,1, 9,11,1, 11,0,1, 11,4,0, 11,4,1, 11,8,1, 11,9,0, 11,12,1, 11,14,0, 11,16,1, 12,3,0, 12,7,0, 12,11,0, 12,15,0, 14,5,1, 14,11,1, 15,0,1, 15,4,1, 15,8,1, 15,12,1, 15,16,1, 16,3,0, 16,7,0, 16,11,0, 16,15,0, // End marker 0 }; /* * Name: 19.05, 19 x 19 * (_ _ _ _ * * _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ * _ _ _ _ * * *) * (* * * _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ * * _ _ _ _ _) * (_ _ _ * _ _ _ _ * _ _ _ _ * * _ _ _ _) * (_ _ _ _ * _ _ _ _ * * _ _ _ _ * _ _ _) * (_ _ _ _ * * _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ * * _ _ _ _) * (_ _ _ * _ _ _ _ * * _ _ _ _ * _ _ _ _) * (_ _ _ _ * * _ _ _ _ * _ _ _ _ * _ _ _) * (_ _ _ _ _ * * _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ * * *) * (* * * _ _ _ _ * _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ * * _ _ _ _) */ const int g24[] = { // Width and height of crossword grid 19, 19, // Number of black fields 70, // Black field coordinates 0,4, 0,10, 0,15, 1,4, 1,10, 1,15, 2,4, 2,10, 2,15, 3,6, 3,11, 4,0, 4,1, 4,2, 4,7, 4,8, 4,12, 4,16, 4,17, 4,18, 5,0, 5,8, 5,12, 5,13, 6,5, 6,13, 7,3, 7,10, 7,15, 8,6, 8,11, 9,0, 9,1, 9,2, 9,7, 9,11, 9,16, 9,17, 9,18, 10,7, 10,12, 11,3, 11,8, 11,15, 12,5, 12,13, 13,5, 13,6, 13,10, 13,18, 14,0, 14,1, 14,2, 14,6, 14,10, 14,11, 14,16, 14,17, 14,18, 15,7, 15,12, 16,3, 16,8, 16,14, 17,3, 17,8, 17,14, 18,3, 18,8, 18,14, // Length and number of words of that length 19, 1, // Coordinates where words start and direction (0 = horizontal) 0,9,0, // Length and number of words of that length 16, 2, // Coordinates where words start and direction (0 = horizontal) 0,14,0, 3,4,0, // Length and number of words of that length 7, 10, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 3,12,1, 5,1,1, 6,6,1, 8,12,1, 10,0,1, 12,6,1, 12,15,0, 13,11,1, 15,0,1, // Length and number of words of that length 6, 8, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 3,0,1, 7,4,1, 8,0,1, 10,13,1, 11,9,1, 13,13,0, 15,13,1, // Length and number of words of that length 5, 18, // Coordinates where words start and direction (0 = horizontal) 0,5,1, 0,13,0, 1,5,1, 2,5,1, 5,14,1, 6,0,1, 6,8,0, 6,14,1, 7,5,0, 7,13,0, 8,10,0, 12,0,1, 12,14,1, 13,0,1, 14,5,0, 16,9,1, 17,9,1, 18,9,1, // Length and number of words of that length 4, 62, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,7,0, 0,8,0, 0,11,1, 0,12,0, 0,16,0, 0,17,0, 0,18,0, 1,0,1, 1,11,1, 2,0,1, 2,11,1, 3,7,1, 3,10,0, 3,15,0, 4,3,1, 4,6,0, 4,11,0, 5,1,0, 5,2,0, 5,7,0, 5,16,0, 5,17,0, 5,18,0, 6,12,0, 7,11,1, 8,7,1, 9,3,1, 9,6,0, 9,12,1, 10,0,0, 10,1,0, 10,2,0, 10,8,1, 10,11,0, 10,16,0, 10,17,0, 11,4,1, 11,7,0, 11,12,0, 12,3,0, 12,8,0, 14,12,1, 15,0,0, 15,1,0, 15,2,0, 15,6,0, 15,8,1, 15,10,0, 15,11,0, 15,16,0, 15,17,0, 15,18,0, 16,4,1, 16,15,1, 17,4,1, 17,15,1, 18,4,1, 18,15,1, // Length and number of words of that length 3, 25, // Coordinates where words start and direction (0 = horizontal) 0,6,0, 0,11,0, 0,16,1, 1,16,1, 2,16,1, 4,9,1, 4,13,1, 5,9,1, 6,0,0, 7,0,1, 7,16,1, 8,3,0, 8,15,0, 9,8,1, 10,18,0, 11,0,1, 11,16,1, 13,7,1, 14,3,1, 14,7,1, 16,0,1, 16,7,0, 16,12,0, 17,0,1, 18,0,1, // End marker 0 }; /* * Name: 19.06, 19 x 19 * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (* _ _ _ * _ _ _ _ _ _ _ _ _ _ _ * * *) * (* * * _ _ _ * * _ _ _ * * _ _ _ _ * *) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _ _ * * _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (* * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * *) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ * * _ _ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (* * _ _ _ _ * * _ _ _ * * _ _ _ * * *) * (* * * _ _ _ _ _ _ _ _ _ _ _ * _ _ _ *) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) */ const int g25[] = { // Width and height of crossword grid 19, 19, // Number of black fields 74, // Black field coordinates 0,3, 0,4, 0,9, 0,14, 0,15, 1,4, 1,9, 1,14, 1,15, 2,4, 2,15, 3,11, 3,12, 4,0, 4,1, 4,2, 4,3, 4,7, 4,11, 4,16, 4,17, 4,18, 5,5, 5,6, 5,10, 6,4, 6,9, 6,14, 7,4, 7,8, 7,14, 8,7, 8,13, 9,0, 9,1, 9,2, 9,6, 9,12, 9,16, 9,17, 9,18, 10,5, 10,11, 11,4, 11,10, 11,14, 12,4, 12,9, 12,14, 13,8, 13,12, 13,13, 14,0, 14,1, 14,2, 14,7, 14,11, 14,15, 14,16, 14,17, 14,18, 15,6, 15,7, 16,3, 16,14, 17,3, 17,4, 17,9, 17,14, 18,3, 18,4, 18,9, 18,14, 18,15, // Length and number of words of that length 11, 4, // Coordinates where words start and direction (0 = horizontal) 3,0,1, 3,15,0, 5,3,0, 15,8,1, // Length and number of words of that length 10, 2, // Coordinates where words start and direction (0 = horizontal) 2,5,1, 16,4,1, // Length and number of words of that length 8, 4, // Coordinates where words start and direction (0 = horizontal) 0,13,0, 5,11,1, 11,5,0, 13,0,1, // Length and number of words of that length 7, 4, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 8,0,1, 10,12,1, 12,10,0, // Length and number of words of that length 6, 2, // Coordinates where words start and direction (0 = horizontal) 3,13,1, 15,0,1, // Length and number of words of that length 5, 22, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,6,0, 0,10,0, 4,12,0, 5,0,1, 5,11,0, 6,10,0, 7,9,0, 7,9,1, 8,8,0, 8,8,1, 8,14,1, 9,7,0, 9,7,1, 10,0,1, 10,6,0, 10,6,1, 11,5,1, 13,14,1, 14,8,0, 14,12,0, 14,13,0, // Length and number of words of that length 4, 58, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,1,0, 0,2,0, 0,5,1, 0,7,0, 0,10,1, 0,16,0, 0,17,0, 0,18,0, 1,0,1, 1,5,1, 1,10,1, 2,0,1, 2,9,0, 2,14,0, 4,12,1, 5,0,0, 5,1,0, 5,2,0, 5,16,0, 5,17,0, 5,18,0, 6,0,1, 6,5,0, 6,5,1, 6,10,1, 6,15,1, 7,0,1, 7,15,1, 9,13,0, 10,0,0, 10,1,0, 10,2,0, 10,16,0, 10,17,0, 10,18,0, 11,0,1, 11,15,1, 12,0,1, 12,5,1, 12,10,1, 12,15,1, 13,4,0, 13,9,0, 14,3,1, 15,0,0, 15,1,0, 15,2,0, 15,11,0, 15,16,0, 15,17,0, 15,18,0, 16,15,1, 17,5,1, 17,10,1, 17,15,1, 18,5,1, 18,10,1, // Length and number of words of that length 3, 32, // Coordinates where words start and direction (0 = horizontal) 0,0,1, 0,11,0, 0,12,0, 0,16,1, 1,3,0, 1,16,1, 2,16,1, 3,4,0, 4,4,1, 4,8,1, 5,7,0, 5,7,1, 6,6,0, 7,5,1, 8,4,0, 8,14,0, 9,3,1, 9,13,1, 10,12,0, 11,11,0, 11,11,1, 13,9,1, 13,14,0, 14,8,1, 14,12,1, 15,15,0, 16,0,1, 16,6,0, 16,7,0, 17,0,1, 18,0,1, 18,16,1, // End marker 0 }; /* * Name: 19.07, 19 x 19 * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ * _ _ _) * (_ _ _ * _ _ _ _ * _ _ _ _ * * _ _ _ _) * (* * * * _ _ _ * _ _ _ _ * _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ * * _ _ _ * * _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ * * _ _ _ * * _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ * _ _ _ _ * _ _ _ * * * *) * (_ _ _ _ * * _ _ _ _ * _ _ _ _ * _ _ _) * (_ _ _ * _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ _) */ const int g26[] = { // Width and height of crossword grid 19, 19, // Number of black fields 70, // Black field coordinates 0,4, 0,9, 0,14, 1,4, 1,9, 1,14, 2,4, 2,9, 2,14, 3,3, 3,4, 3,16, 3,17, 3,18, 4,7, 4,11, 4,15, 5,0, 5,1, 5,6, 5,11, 5,15, 6,5, 6,10, 6,14, 7,4, 7,8, 7,9, 7,13, 8,3, 8,7, 8,12, 8,17, 8,18, 9,7, 9,11, 10,0, 10,1, 10,6, 10,11, 10,15, 11,5, 11,9, 11,10, 11,14, 12,4, 12,8, 12,13, 13,3, 13,7, 13,12, 13,17, 13,18, 14,3, 14,7, 14,11, 15,0, 15,1, 15,2, 15,14, 15,15, 16,4, 16,9, 16,14, 17,4, 17,9, 17,14, 18,4, 18,9, 18,14, // Length and number of words of that length 15, 2, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 4,16,0, // Length and number of words of that length 11, 2, // Coordinates where words start and direction (0 = horizontal) 3,5,1, 15,3,1, // Length and number of words of that length 8, 2, // Coordinates where words start and direction (0 = horizontal) 0,12,0, 11,6,0, // Length and number of words of that length 7, 8, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 0,13,0, 4,0,1, 9,0,1, 9,12,1, 12,5,0, 12,10,0, 14,12,1, // Length and number of words of that length 6, 4, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,10,0, 13,8,0, 13,13,0, // Length and number of words of that length 5, 10, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,1,0, 0,6,0, 6,0,1, 7,14,1, 11,0,1, 12,14,1, 14,12,0, 14,17,0, 14,18,0, // Length and number of words of that length 4, 66, // Coordinates where words start and direction (0 = horizontal) 0,0,1, 0,5,1, 0,7,0, 0,10,1, 0,11,0, 0,15,0, 0,15,1, 1,0,1, 1,5,1, 1,10,1, 1,15,1, 2,0,1, 2,5,1, 2,10,1, 2,15,1, 3,9,0, 4,3,0, 4,17,0, 4,18,0, 5,2,1, 5,7,1, 6,0,0, 6,1,0, 6,6,0, 6,6,1, 6,15,0, 6,15,1, 7,0,1, 7,5,0, 7,10,0, 7,14,0, 8,4,0, 8,8,0, 8,8,1, 8,13,0, 8,13,1, 9,3,0, 9,12,0, 9,17,0, 9,18,0, 10,2,1, 10,7,1, 11,0,0, 11,1,0, 11,15,0, 11,15,1, 12,0,1, 12,9,0, 12,9,1, 13,8,1, 13,13,1, 15,3,0, 15,7,0, 15,11,0, 16,0,1, 16,5,1, 16,10,1, 16,15,1, 17,0,1, 17,5,1, 17,10,1, 17,15,1, 18,0,1, 18,5,1, 18,10,1, 18,15,1, // Length and number of words of that length 3, 40, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,16,0, 0,17,0, 0,18,0, 3,0,1, 3,14,0, 4,4,0, 4,8,1, 4,12,1, 4,16,1, 5,7,0, 5,12,1, 5,16,1, 6,11,0, 6,11,1, 7,5,1, 7,10,1, 8,0,1, 8,4,1, 8,9,0, 9,8,1, 10,7,0, 10,12,1, 10,16,1, 11,6,1, 11,11,0, 11,11,1, 12,5,1, 12,14,0, 13,0,1, 13,4,0, 13,4,1, 14,0,1, 14,4,1, 14,8,1, 15,16,1, 16,0,0, 16,1,0, 16,2,0, 16,15,0, // End marker 0 }; /* * Name: 19.08, 19 x 19 * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _) * (* * * _ _ _ * * _ _ _ _ * _ _ _ * * *) * (_ _ _ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (* * * _ _ _ * _ _ _ _ _ * _ _ _ * * *) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _ _ _) * (* * * _ _ _ * _ _ _ _ * * _ _ _ * * *) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) */ const int g27[] = { // Width and height of crossword grid 19, 19, // Number of black fields 66, // Black field coordinates 0,4, 0,9, 0,14, 1,4, 1,9, 1,14, 2,4, 2,9, 2,14, 3,6, 4,0, 4,1, 4,2, 4,7, 4,11, 4,12, 4,16, 4,17, 4,18, 5,8, 5,13, 6,4, 6,9, 6,14, 7,4, 7,10, 8,5, 8,11, 8,15, 9,0, 9,1, 9,2, 9,6, 9,12, 9,16, 9,17, 9,18, 10,3, 10,7, 10,13, 11,8, 11,14, 12,4, 12,9, 12,14, 13,5, 13,10, 14,0, 14,1, 14,2, 14,6, 14,7, 14,11, 14,16, 14,17, 14,18, 15,12, 16,4, 16,9, 16,14, 17,4, 17,9, 17,14, 18,4, 18,9, 18,14, // Length and number of words of that length 12, 2, // Coordinates where words start and direction (0 = horizontal) 3,7,1, 15,0,1, // Length and number of words of that length 10, 2, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 9,15,0, // Length and number of words of that length 8, 8, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,15,0, 5,0,1, 7,11,1, 11,0,1, 11,3,0, 11,13,0, 13,11,1, // Length and number of words of that length 7, 2, // Coordinates where words start and direction (0 = horizontal) 0,10,0, 12,8,0, // Length and number of words of that length 6, 2, // Coordinates where words start and direction (0 = horizontal) 3,0,1, 15,13,1, // Length and number of words of that length 5, 20, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 0,13,0, 4,6,0, 5,7,0, 5,14,1, 6,8,0, 7,5,1, 7,9,0, 8,0,1, 8,6,1, 8,10,0, 9,7,1, 9,11,0, 10,8,1, 10,12,0, 10,14,1, 11,9,1, 13,0,1, 14,5,0, 14,10,0, // Length and number of words of that length 4, 74, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,5,1, 0,7,0, 0,10,1, 0,11,0, 0,12,0, 0,15,1, 0,16,0, 0,17,0, 0,18,0, 1,0,1, 1,5,1, 1,10,1, 1,15,1, 2,0,1, 2,5,1, 2,10,1, 2,15,1, 4,3,1, 5,0,0, 5,1,0, 5,2,0, 5,9,1, 5,12,0, 5,16,0, 5,17,0, 5,18,0, 6,0,1, 6,5,1, 6,10,1, 6,13,0, 6,15,1, 7,0,1, 7,14,0, 8,4,0, 9,5,0, 10,0,0, 10,1,0, 10,2,0, 10,6,0, 10,16,0, 10,17,0, 10,18,0, 11,15,1, 12,0,1, 12,5,1, 12,10,1, 12,15,1, 13,6,1, 14,12,1, 15,0,0, 15,1,0, 15,2,0, 15,6,0, 15,7,0, 15,11,0, 15,16,0, 15,17,0, 15,18,0, 16,0,1, 16,5,1, 16,10,1, 16,15,1, 17,0,1, 17,5,1, 17,10,1, 17,15,1, 18,0,1, 18,5,1, 18,10,1, 18,15,1, // Length and number of words of that length 3, 20, // Coordinates where words start and direction (0 = horizontal) 0,6,0, 3,4,0, 3,9,0, 3,14,0, 4,8,1, 4,13,1, 5,11,0, 8,12,1, 8,16,1, 9,3,1, 9,13,1, 10,0,1, 10,4,1, 11,7,0, 13,4,0, 13,9,0, 13,14,0, 14,3,1, 14,8,1, 16,12,0, // End marker 0 }; /* * Name: 19.09, 19 x 19 * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ * _ _ _) * (* * * _ _ _ _ * _ _ _ * * _ _ _ _ * *) * (_ _ _ _ _ _ * _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ * * _ _ _ * _ _ _ _ _ * * _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (* * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * *) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ * * _ _ _ _ _ * _ _ _ * * _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ * _ _ _ _ _ _) * (* * _ _ _ _ * * _ _ _ * _ _ _ _ * * *) * (_ _ _ * _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) */ const int g28[] = { // Width and height of crossword grid 19, 19, // Number of black fields 66, // Black field coordinates 0,4, 0,9, 0,14, 1,4, 1,9, 1,14, 2,4, 3,7, 3,11, 3,15, 4,0, 4,1, 4,2, 4,7, 4,11, 4,12, 4,16, 4,17, 4,18, 5,6, 5,10, 6,5, 6,9, 6,14, 7,4, 7,8, 7,14, 8,7, 8,13, 9,0, 9,1, 9,2, 9,6, 9,12, 9,16, 9,17, 9,18, 10,5, 10,11, 11,4, 11,10, 11,14, 12,4, 12,9, 12,13, 13,8, 13,12, 14,0, 14,1, 14,2, 14,6, 14,7, 14,11, 14,16, 14,17, 14,18, 15,3, 15,7, 15,11, 16,14, 17,4, 17,9, 17,14, 18,4, 18,9, 18,14, // Length and number of words of that length 15, 2, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 4,15,0, // Length and number of words of that length 14, 2, // Coordinates where words start and direction (0 = horizontal) 2,5,1, 16,0,1, // Length and number of words of that length 8, 4, // Coordinates where words start and direction (0 = horizontal) 0,13,0, 5,11,1, 11,5,0, 13,0,1, // Length and number of words of that length 7, 6, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 3,0,1, 8,0,1, 10,12,1, 12,10,0, 15,12,1, // Length and number of words of that length 6, 4, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 5,0,1, 13,13,0, 13,13,1, // Length and number of words of that length 5, 18, // Coordinates where words start and direction (0 = horizontal) 0,6,0, 0,10,0, 5,11,0, 6,0,1, 6,10,0, 7,9,0, 7,9,1, 8,8,0, 8,8,1, 8,14,1, 9,7,0, 9,7,1, 10,0,1, 10,6,1, 11,5,1, 12,14,1, 14,8,0, 14,12,0, // Length and number of words of that length 4, 62, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,5,1, 0,10,1, 0,12,0, 0,15,1, 0,16,0, 0,17,0, 0,18,0, 1,0,1, 1,5,1, 1,10,1, 1,15,1, 2,0,1, 2,9,0, 2,14,0, 3,4,0, 4,3,1, 5,0,0, 5,1,0, 5,2,0, 5,12,0, 5,16,0, 5,17,0, 5,18,0, 6,10,1, 6,15,1, 7,0,1, 7,15,1, 10,0,0, 10,1,0, 10,2,0, 10,6,0, 10,16,0, 10,17,0, 10,18,0, 11,0,1, 11,15,1, 12,0,1, 12,5,1, 12,14,0, 13,4,0, 13,9,0, 14,12,1, 15,0,0, 15,1,0, 15,2,0, 15,6,0, 15,16,0, 15,17,0, 15,18,0, 16,15,1, 17,0,1, 17,5,1, 17,10,1, 17,15,1, 18,0,1, 18,5,1, 18,10,1, 18,15,1, // Length and number of words of that length 3, 32, // Coordinates where words start and direction (0 = horizontal) 0,7,0, 0,11,0, 0,15,0, 3,8,1, 3,12,1, 3,16,1, 4,8,1, 4,13,1, 5,7,0, 5,7,1, 6,6,0, 6,6,1, 7,5,0, 7,5,1, 8,4,0, 8,14,0, 9,3,1, 9,13,0, 9,13,1, 10,12,0, 11,11,0, 11,11,1, 12,10,1, 13,9,1, 14,3,1, 14,8,1, 15,0,1, 15,4,1, 15,8,1, 16,3,0, 16,7,0, 16,11,0, // End marker 0 }; /* * Name: 19.10, 19 x 19 * (_ _ _ * * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ * * _ _ _ _ *) * (* * * _ _ _ * _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * * _ _ _) * (_ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (* _ _ _ _ _ _ * _ _ _ _ * * _ _ _ _ _) * (* * * _ _ _ _ _ _ _ _ _ _ _ _ _ * * *) * (_ _ _ _ _ * * _ _ _ _ * _ _ _ _ _ _ *) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _) * (_ _ _ * * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ * _ _ _ * * *) * (* _ _ _ _ * * _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * * _ _ _) */ const int g29[] = { // Width and height of crossword grid 19, 19, // Number of black fields 70, // Black field coordinates 0,4, 0,8, 0,9, 0,14, 0,15, 1,4, 1,9, 1,14, 2,4, 2,9, 2,14, 3,0, 3,7, 3,12, 4,0, 4,1, 4,6, 4,11, 4,12, 4,17, 4,18, 5,5, 5,10, 5,15, 6,4, 6,10, 6,15, 7,3, 7,8, 7,14, 8,7, 8,13, 9,0, 9,1, 9,6, 9,12, 9,17, 9,18, 10,5, 10,11, 11,4, 11,10, 11,15, 12,3, 12,8, 12,14, 13,3, 13,8, 13,13, 14,0, 14,1, 14,6, 14,7, 14,12, 14,17, 14,18, 15,6, 15,11, 15,18, 16,4, 16,9, 16,14, 17,4, 17,9, 17,14, 18,3, 18,4, 18,9, 18,10, 18,14, // Length and number of words of that length 19, 2, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 0,16,0, // Length and number of words of that length 13, 1, // Coordinates where words start and direction (0 = horizontal) 3,9,0, // Length and number of words of that length 8, 2, // Coordinates where words start and direction (0 = horizontal) 0,13,0, 11,5,0, // Length and number of words of that length 7, 4, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 8,0,1, 10,12,1, 12,15,0, // Length and number of words of that length 6, 6, // Coordinates where words start and direction (0 = horizontal) 1,8,0, 3,1,1, 3,13,1, 12,10,0, 15,0,1, 15,12,1, // Length and number of words of that length 5, 17, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,10,0, 5,0,1, 5,11,0, 6,5,1, 7,9,1, 8,8,1, 8,14,1, 9,7,0, 9,7,1, 10,0,1, 10,6,1, 11,5,1, 12,9,1, 13,14,1, 14,8,0, 14,13,0, // Length and number of words of that length 4, 78, // Coordinates where words start and direction (0 = horizontal) 0,0,1, 0,1,0, 0,6,0, 0,10,1, 0,11,0, 0,17,0, 0,18,0, 1,0,1, 1,5,1, 1,10,1, 1,15,0, 1,15,1, 2,0,1, 2,5,1, 2,10,1, 2,15,1, 3,8,1, 3,14,0, 4,2,1, 4,7,0, 4,7,1, 4,13,1, 5,0,0, 5,1,0, 5,6,0, 5,6,1, 5,11,1, 5,12,0, 5,17,0, 5,18,0, 6,0,1, 6,5,0, 6,11,1, 7,4,0, 7,4,1, 7,10,0, 7,15,0, 7,15,1, 8,3,0, 8,8,0, 8,14,0, 9,2,1, 9,13,0, 9,13,1, 10,0,0, 10,1,0, 10,6,0, 10,12,0, 10,17,0, 10,18,0, 11,0,1, 11,11,0, 11,11,1, 12,4,0, 12,4,1, 12,15,1, 13,4,1, 13,9,1, 14,2,1, 14,3,0, 14,8,1, 14,13,1, 15,0,0, 15,1,0, 15,7,0, 15,7,1, 15,12,0, 15,17,0, 16,0,1, 16,5,1, 16,10,1, 16,15,1, 17,0,1, 17,5,1, 17,10,1, 17,15,1, 18,5,1, 18,15,1, // Length and number of words of that length 3, 18, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,5,1, 0,7,0, 0,12,0, 0,16,1, 3,4,0, 5,16,1, 6,16,1, 7,0,1, 11,16,1, 12,0,1, 13,0,1, 13,14,0, 16,6,0, 16,11,0, 16,18,0, 18,0,1, 18,11,1, // End marker 0 }; /* * Name: 21.01, 21 x 21 * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ * * * _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ * * _ _ _ _ _ _) * (* * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * *) * (_ _ _ _ _ _ * * _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ * * * _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _) */ const int g30[] = { // Width and height of crossword grid 21, 21, // Number of black fields 68, // Black field coordinates 0,4, 0,10, 0,16, 1,4, 1,10, 1,16, 2,4, 2,16, 3,8, 3,14, 4,0, 4,1, 4,7, 4,13, 5,6, 5,19, 5,20, 6,5, 6,11, 6,17, 7,4, 7,10, 7,11, 7,12, 7,16, 8,3, 8,9, 8,15, 9,7, 9,13, 10,0, 10,1, 10,2, 10,7, 10,13, 10,18, 10,19, 10,20, 11,7, 11,13, 12,5, 12,11, 12,17, 13,4, 13,8, 13,9, 13,10, 13,16, 14,3, 14,9, 14,15, 15,0, 15,1, 15,14, 16,7, 16,13, 16,19, 16,20, 17,6, 17,12, 18,4, 18,16, 19,4, 19,10, 19,16, 20,4, 20,10, 20,16, // Length and number of words of that length 12, 2, // Coordinates where words start and direction (0 = horizontal) 5,7,1, 15,2,1, // Length and number of words of that length 11, 4, // Coordinates where words start and direction (0 = horizontal) 2,5,1, 4,14,0, 6,6,0, 18,5,1, // Length and number of words of that length 10, 4, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 0,18,0, 11,2,0, 11,18,0, // Length and number of words of that length 9, 2, // Coordinates where words start and direction (0 = horizontal) 4,8,0, 8,12,0, // Length and number of words of that length 8, 8, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,9,0, 0,15,0, 3,0,1, 13,5,0, 13,11,0, 13,17,0, 17,13,1, // Length and number of words of that length 7, 8, // Coordinates where words start and direction (0 = horizontal) 0,12,0, 4,14,1, 9,0,1, 9,14,1, 11,0,1, 11,14,1, 14,8,0, 16,0,1, // Length and number of words of that length 6, 10, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,11,0, 0,17,0, 3,15,1, 5,0,1, 15,3,0, 15,9,0, 15,15,0, 15,15,1, 17,0,1, // Length and number of words of that length 5, 50, // Coordinates where words start and direction (0 = horizontal) 0,5,1, 0,6,0, 0,11,1, 0,19,0, 0,20,0, 1,5,1, 1,11,1, 2,10,0, 3,9,1, 4,2,1, 4,8,1, 5,0,0, 5,1,0, 6,0,1, 6,6,1, 6,12,1, 7,5,0, 7,5,1, 7,17,0, 8,4,0, 8,4,1, 8,10,0, 8,10,1, 8,16,0, 8,16,1, 9,3,0, 9,8,1, 9,15,0, 10,8,1, 11,8,1, 11,19,0, 11,20,0, 12,0,1, 12,6,1, 12,12,1, 13,11,1, 14,4,1, 14,10,0, 14,10,1, 14,16,1, 16,0,0, 16,1,0, 16,8,1, 16,14,0, 16,14,1, 17,7,1, 19,5,1, 19,11,1, 20,5,1, 20,11,1, // Length and number of words of that length 4, 40, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,7,0, 0,13,0, 0,17,1, 1,0,1, 1,17,1, 2,0,1, 2,17,1, 3,4,0, 3,16,0, 5,7,0, 5,13,0, 6,19,0, 6,20,0, 7,0,1, 7,17,1, 8,11,0, 9,9,0, 10,3,1, 10,14,1, 11,0,0, 11,1,0, 12,7,0, 12,13,0, 13,0,1, 13,17,1, 14,4,0, 14,16,0, 17,7,0, 17,13,0, 17,19,0, 17,20,0, 18,0,1, 18,17,1, 19,0,1, 19,17,1, 20,0,1, 20,17,1, // Length and number of words of that length 3, 10, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 0,14,0, 6,18,1, 7,13,1, 8,0,1, 12,18,1, 13,5,1, 14,0,1, 18,6,0, 18,12,0, // End marker 0 }; /* * Name: 21.02, 21 x 21 * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ _ _) * (* * * _ _ _ _ _ * _ _ _ * _ _ _ _ _ * * *) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ * _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ * _ _ _ _ _ _ _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ _ _ _ _ _ _ * _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ * _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (* * * _ _ _ _ _ * _ _ _ * _ _ _ _ _ * * *) * (_ _ _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) */ const int g31[] = { // Width and height of crossword grid 21, 21, // Number of black fields 72, // Black field coordinates 0,4, 0,10, 0,16, 1,4, 1,10, 1,16, 2,4, 2,10, 2,16, 3,9, 3,15, 4,0, 4,1, 4,2, 4,8, 4,12, 4,18, 4,19, 4,20, 5,3, 5,7, 5,13, 6,6, 6,14, 7,5, 7,10, 7,15, 8,4, 8,9, 8,16, 9,8, 9,17, 10,0, 10,1, 10,2, 10,7, 10,13, 10,18, 10,19, 10,20, 11,3, 11,12, 12,4, 12,11, 12,16, 13,5, 13,10, 13,15, 14,6, 14,14, 15,7, 15,13, 15,17, 16,0, 16,1, 16,2, 16,8, 16,12, 16,18, 16,19, 16,20, 17,5, 17,11, 18,4, 18,10, 18,16, 19,4, 19,10, 19,16, 20,4, 20,10, 20,16, // Length and number of words of that length 12, 2, // Coordinates where words start and direction (0 = horizontal) 0,11,0, 9,9,0, // Length and number of words of that length 9, 4, // Coordinates where words start and direction (0 = horizontal) 0,17,0, 3,0,1, 12,3,0, 17,12,1, // Length and number of words of that length 8, 4, // Coordinates where words start and direction (0 = horizontal) 9,0,1, 9,9,1, 11,4,1, 11,13,1, // Length and number of words of that length 7, 8, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 5,14,1, 6,7,1, 7,6,0, 7,14,0, 14,7,1, 14,15,0, 15,0,1, // Length and number of words of that length 6, 12, // Coordinates where words start and direction (0 = horizontal) 0,6,0, 0,14,0, 5,12,0, 6,0,1, 6,15,1, 8,10,1, 10,8,0, 12,5,1, 14,0,1, 14,15,1, 15,6,0, 15,14,0, // Length and number of words of that length 5, 54, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,5,1, 0,7,0, 0,11,1, 0,13,0, 1,5,1, 1,11,1, 2,5,1, 2,11,1, 3,4,0, 3,10,1, 3,16,0, 3,16,1, 4,3,1, 4,13,1, 5,0,0, 5,1,0, 5,2,0, 5,8,1, 5,18,0, 5,19,0, 5,20,0, 6,3,0, 7,0,1, 7,16,1, 8,5,0, 8,10,0, 8,15,0, 10,8,1, 10,17,0, 11,0,0, 11,1,0, 11,2,0, 11,18,0, 11,19,0, 11,20,0, 13,0,1, 13,4,0, 13,16,0, 13,16,1, 15,8,1, 16,3,1, 16,7,0, 16,13,0, 16,13,1, 16,17,0, 17,0,1, 17,6,1, 18,5,1, 18,11,1, 19,5,1, 19,11,1, 20,5,1, 20,11,1, // Length and number of words of that length 4, 50, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,8,0, 0,12,0, 0,17,1, 0,18,0, 0,19,0, 0,20,0, 1,0,1, 1,17,1, 2,0,1, 2,17,1, 3,10,0, 4,9,0, 5,8,0, 6,7,0, 6,13,0, 7,6,1, 7,11,1, 8,0,1, 8,5,1, 8,17,1, 10,3,1, 10,14,1, 11,7,0, 11,13,0, 12,0,1, 12,12,0, 12,12,1, 12,17,1, 13,6,1, 13,11,0, 13,11,1, 14,10,0, 17,0,0, 17,1,0, 17,2,0, 17,8,0, 17,12,0, 17,18,0, 17,19,0, 17,20,0, 18,0,1, 18,17,1, 19,0,1, 19,17,1, 20,0,1, 20,17,1, // Length and number of words of that length 3, 16, // Coordinates where words start and direction (0 = horizontal) 0,9,0, 0,15,0, 4,9,1, 4,15,0, 5,0,1, 5,4,1, 9,4,0, 9,16,0, 9,18,1, 11,0,1, 14,5,0, 15,14,1, 15,18,1, 16,9,1, 18,5,0, 18,11,0, // End marker 0 }; /* * Name: 21.03, 21 x 21 * (_ _ _ _ * * _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ * _ _ _ _ _ * * _ _ _ _ _ _ _ _ * *) * (_ _ _ _ _ * _ _ _ _ _ * * _ _ _ _ * _ _ _) * (* * _ _ _ * _ _ _ _ _ * _ _ _ _ * * _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _ * _ _ _ _ _ _ *) * (_ _ _ _ * _ _ _ _ * _ _ _ _ _ _ _ _ * * *) * (_ _ _ * _ _ _ _ _ _ * _ _ _ _ _ _ * _ _ _) * (* * * _ _ _ _ _ _ _ _ * _ _ _ _ * _ _ _ _) * (* _ _ _ _ _ _ * _ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ * * _ _ _ _ * _ _ _ _ _ * _ _ _ * *) * (_ _ _ * _ _ _ _ * * _ _ _ _ _ * _ _ _ _ _) * (* * _ _ _ _ _ _ _ _ * * _ _ _ _ _ * _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ * * _ _ _ _) */ const int g32[] = { // Width and height of crossword grid 21, 21, // Number of black fields 79, // Black field coordinates 0,5, 0,11, 0,12, 0,17, 1,5, 1,11, 1,17, 2,11, 3,3, 3,10, 3,15, 3,16, 4,0, 4,1, 4,2, 4,8, 4,9, 4,15, 5,0, 5,4, 5,5, 5,14, 5,18, 5,19, 5,20, 6,6, 6,13, 7,7, 7,12, 8,8, 8,16, 9,0, 9,1, 9,2, 9,3, 9,9, 9,15, 9,16, 10,3, 10,10, 10,17, 11,4, 11,5, 11,11, 11,17, 11,18, 11,19, 11,20, 12,4, 12,12, 13,8, 13,13, 14,7, 14,14, 15,0, 15,1, 15,2, 15,6, 15,15, 15,16, 15,20, 16,5, 16,11, 16,12, 16,18, 16,19, 16,20, 17,4, 17,5, 17,10, 17,17, 18,9, 19,3, 19,9, 19,15, 20,3, 20,8, 20,9, 20,15, // Length and number of words of that length 11, 2, // Coordinates where words start and direction (0 = horizontal) 2,0,1, 18,10,1, // Length and number of words of that length 9, 2, // Coordinates where words start and direction (0 = horizontal) 2,12,1, 18,0,1, // Length and number of words of that length 8, 12, // Coordinates where words start and direction (0 = horizontal) 2,17,0, 3,11,0, 5,6,1, 6,14,0, 7,6,0, 7,13,1, 8,0,1, 10,9,0, 11,3,0, 12,13,1, 13,0,1, 15,7,1, // Length and number of words of that length 7, 8, // Coordinates where words start and direction (0 = horizontal) 0,7,0, 6,14,1, 7,0,1, 8,9,1, 12,5,1, 13,14,1, 14,0,1, 14,13,0, // Length and number of words of that length 6, 18, // Coordinates where words start and direction (0 = horizontal) 0,6,0, 0,13,0, 1,12,0, 3,4,1, 4,10,0, 6,0,1, 6,7,1, 7,13,0, 8,7,0, 10,4,1, 10,11,1, 11,10,0, 14,8,0, 14,8,1, 14,15,1, 15,7,0, 15,14,0, 17,11,1, // Length and number of words of that length 5, 42, // Coordinates where words start and direction (0 = horizontal) 0,0,1, 0,4,0, 0,6,1, 0,14,0, 0,18,0, 0,19,0, 0,20,0, 1,0,1, 1,6,1, 1,12,1, 4,3,0, 4,3,1, 4,10,1, 4,16,1, 6,4,0, 6,5,0, 6,18,0, 6,19,0, 6,20,0, 9,4,1, 9,10,1, 10,0,0, 10,1,0, 10,2,0, 10,15,0, 10,16,0, 11,6,1, 11,12,1, 12,17,0, 16,0,0, 16,0,1, 16,1,0, 16,2,0, 16,6,0, 16,6,1, 16,13,1, 16,16,0, 19,4,1, 19,10,1, 19,16,1, 20,10,1, 20,16,1, // Length and number of words of that length 4, 34, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,1,0, 0,2,0, 0,8,0, 0,9,0, 0,13,1, 3,11,1, 3,17,1, 4,16,0, 5,1,0, 5,2,0, 5,9,0, 5,15,0, 7,8,1, 8,12,0, 8,17,1, 9,8,0, 9,17,1, 11,0,1, 12,0,1, 12,5,0, 12,11,0, 12,18,0, 12,19,0, 13,4,0, 13,9,1, 17,0,1, 17,6,1, 17,11,0, 17,12,0, 17,18,0, 17,19,0, 17,20,0, 20,4,1, // Length and number of words of that length 3, 26, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,10,0, 0,15,0, 0,16,0, 0,18,1, 1,18,1, 2,5,0, 3,0,1, 5,1,1, 5,8,0, 5,15,1, 6,0,0, 10,0,1, 10,18,1, 12,20,0, 13,12,0, 15,3,1, 15,17,1, 16,15,0, 17,18,1, 18,4,0, 18,5,0, 18,10,0, 18,17,0, 19,0,1, 20,0,1, // End marker 0 }; /* * Name: 21.04, 21 x 21 * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ * _ _ _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ _ _ * _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) */ const int g33[] = { // Width and height of crossword grid 21, 21, // Number of black fields 63, // Black field coordinates 0,7, 0,13, 1,7, 1,13, 2,7, 2,13, 3,3, 3,11, 3,17, 4,4, 4,10, 4,16, 5,5, 5,9, 5,15, 6,8, 6,12, 7,0, 7,1, 7,2, 7,7, 7,13, 7,18, 7,19, 7,20, 8,6, 8,14, 9,5, 9,11, 9,17, 10,4, 10,10, 10,16, 11,3, 11,9, 11,15, 12,6, 12,14, 13,0, 13,1, 13,2, 13,7, 13,13, 13,18, 13,19, 13,20, 14,8, 14,12, 15,5, 15,11, 15,15, 16,4, 16,10, 16,16, 17,3, 17,9, 17,17, 18,7, 18,13, 19,7, 19,13, 20,7, 20,13, // Length and number of words of that length 8, 8, // Coordinates where words start and direction (0 = horizontal) 0,6,0, 0,14,0, 6,0,1, 6,13,1, 13,6,0, 13,14,0, 14,0,1, 14,13,1, // Length and number of words of that length 7, 32, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,14,1, 0,18,0, 0,19,0, 0,20,0, 1,0,1, 1,14,1, 2,0,1, 2,14,1, 3,4,1, 4,3,0, 7,8,0, 7,12,0, 8,7,1, 10,17,0, 12,7,1, 14,0,0, 14,1,0, 14,2,0, 14,18,0, 14,19,0, 14,20,0, 17,10,1, 18,0,1, 18,14,1, 19,0,1, 19,14,1, 20,0,1, 20,14,1, // Length and number of words of that length 6, 8, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 0,12,0, 8,0,1, 8,15,1, 12,0,1, 12,15,1, 15,8,0, 15,12,0, // Length and number of words of that length 5, 56, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,8,1, 0,9,0, 0,15,0, 1,8,1, 2,8,1, 3,12,1, 4,5,1, 4,11,0, 4,11,1, 4,17,0, 5,0,1, 5,4,0, 5,10,0, 5,10,1, 5,16,0, 5,16,1, 6,9,0, 6,15,0, 7,8,1, 8,0,0, 8,1,0, 8,2,0, 8,7,0, 8,13,0, 8,18,0, 8,19,0, 8,20,0, 9,0,1, 9,6,1, 9,12,1, 10,5,0, 10,5,1, 10,11,0, 10,11,1, 11,4,0, 11,4,1, 11,10,0, 11,10,1, 11,16,0, 11,16,1, 12,3,0, 12,9,0, 13,8,1, 15,0,1, 15,6,1, 15,16,1, 16,5,0, 16,5,1, 16,11,0, 16,11,1, 16,15,0, 17,4,1, 18,8,1, 19,8,1, 20,8,1, // Length and number of words of that length 4, 20, // Coordinates where words start and direction (0 = horizontal) 0,4,0, 0,10,0, 0,16,0, 3,7,0, 3,13,0, 4,0,1, 4,17,1, 7,3,1, 7,14,1, 10,0,1, 10,17,1, 13,3,1, 13,14,1, 14,7,0, 14,13,0, 16,0,1, 16,17,1, 17,4,0, 17,10,0, 17,16,0, // Length and number of words of that length 3, 20, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,11,0, 0,17,0, 3,0,1, 3,18,1, 5,6,1, 6,5,0, 6,9,1, 9,6,0, 9,14,0, 9,18,1, 11,0,1, 12,15,0, 14,9,1, 15,12,1, 17,0,1, 17,18,1, 18,3,0, 18,9,0, 18,17,0, // End marker 0 }; /* * Name: 21.05, 21 x 21 * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (* * * _ _ _ * * * _ _ _ * * * _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ * _ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * * * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _ * _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ * * * _ _ _ * * * _ _ _ * * *) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) */ const int g34[] = { // Width and height of crossword grid 21, 21, // Number of black fields 73, // Black field coordinates 0,6, 0,14, 1,6, 1,14, 2,6, 2,14, 3,3, 3,9, 3,17, 4,4, 4,10, 4,16, 5,5, 5,11, 5,15, 6,0, 6,1, 6,2, 6,6, 6,7, 6,8, 6,12, 6,13, 6,14, 6,18, 6,19, 6,20, 7,6, 7,14, 8,6, 8,14, 9,5, 9,10, 9,17, 10,4, 10,9, 10,10, 10,11, 10,16, 11,3, 11,10, 11,15, 12,6, 12,14, 13,6, 13,14, 14,0, 14,1, 14,2, 14,6, 14,7, 14,8, 14,12, 14,13, 14,14, 14,18, 14,19, 14,20, 15,5, 15,9, 15,15, 16,4, 16,10, 16,16, 17,3, 17,11, 17,17, 18,6, 18,14, 19,6, 19,14, 20,6, 20,14, // Length and number of words of that length 7, 24, // Coordinates where words start and direction (0 = horizontal) 0,7,1, 1,7,1, 2,7,1, 3,10,1, 4,3,0, 7,0,0, 7,1,0, 7,2,0, 7,7,0, 7,7,1, 7,8,0, 7,12,0, 7,13,0, 7,18,0, 7,19,0, 7,20,0, 8,7,1, 10,17,0, 12,7,1, 13,7,1, 17,4,1, 18,7,1, 19,7,1, 20,7,1, // Length and number of words of that length 6, 44, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,7,0, 0,8,0, 0,12,0, 0,13,0, 0,15,1, 0,18,0, 0,19,0, 0,20,0, 1,0,1, 1,15,1, 2,0,1, 2,15,1, 4,9,0, 7,0,1, 7,15,1, 8,0,1, 8,15,1, 9,11,1, 11,4,1, 11,11,0, 12,0,1, 12,15,1, 13,0,1, 13,15,1, 15,0,0, 15,1,0, 15,2,0, 15,7,0, 15,8,0, 15,12,0, 15,13,0, 15,18,0, 15,19,0, 15,20,0, 18,0,1, 18,15,1, 19,0,1, 19,15,1, 20,0,1, 20,15,1, // Length and number of words of that length 5, 28, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,11,0, 0,15,0, 3,4,1, 4,5,1, 4,11,1, 4,17,0, 5,0,1, 5,4,0, 5,6,1, 5,16,0, 5,16,1, 6,15,0, 9,0,1, 10,5,0, 11,4,0, 11,16,0, 11,16,1, 12,3,0, 15,0,1, 15,10,1, 15,16,1, 16,5,0, 16,5,1, 16,9,0, 16,11,1, 16,15,0, 17,12,1, // Length and number of words of that length 4, 20, // Coordinates where words start and direction (0 = horizontal) 0,4,0, 0,10,0, 0,16,0, 4,0,1, 4,17,1, 5,10,0, 6,11,0, 9,6,1, 10,0,1, 10,5,1, 10,12,1, 10,17,1, 11,9,0, 11,11,1, 12,10,0, 16,0,1, 16,17,1, 17,4,0, 17,10,0, 17,16,0, // Length and number of words of that length 3, 28, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,9,0, 0,17,0, 3,0,1, 3,6,0, 3,14,0, 3,18,1, 5,12,1, 6,3,1, 6,5,0, 6,9,1, 6,15,1, 9,6,0, 9,14,0, 9,18,1, 11,0,1, 12,15,0, 14,3,1, 14,9,1, 14,15,1, 15,6,0, 15,6,1, 15,14,0, 17,0,1, 17,18,1, 18,3,0, 18,11,0, 18,17,0, // End marker 0 }; /* * Name: 21.06, 21 x 21 * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ _ _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ * _ _ _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (* * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * *) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ _ _ * _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ _ _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) */ const int g35[] = { // Width and height of crossword grid 21, 21, // Number of black fields 68, // Black field coordinates 0,4, 0,10, 0,16, 1,4, 1,10, 1,16, 2,4, 2,16, 3,8, 3,12, 4,0, 4,1, 4,2, 4,7, 4,13, 4,18, 4,19, 4,20, 5,6, 5,14, 6,5, 6,11, 6,15, 7,4, 7,10, 7,16, 8,3, 8,9, 8,17, 9,6, 9,12, 10,0, 10,1, 10,7, 10,13, 10,19, 10,20, 11,8, 11,14, 12,3, 12,11, 12,17, 13,4, 13,10, 13,16, 14,5, 14,9, 14,15, 15,6, 15,14, 16,0, 16,1, 16,2, 16,7, 16,13, 16,18, 16,19, 16,20, 17,8, 17,12, 18,4, 18,16, 19,4, 19,10, 19,16, 20,4, 20,10, 20,16, // Length and number of words of that length 11, 4, // Coordinates where words start and direction (0 = horizontal) 2,5,1, 5,2,0, 5,18,0, 18,5,1, // Length and number of words of that length 8, 12, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,9,0, 0,17,0, 3,0,1, 3,13,1, 9,13,1, 11,0,1, 13,3,0, 13,11,0, 13,17,0, 17,0,1, 17,13,1, // Length and number of words of that length 7, 8, // Coordinates where words start and direction (0 = horizontal) 4,8,0, 5,7,1, 7,5,0, 7,15,0, 8,10,1, 10,12,0, 12,4,1, 15,7,1, // Length and number of words of that length 6, 12, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,11,0, 0,15,0, 5,0,1, 5,15,1, 9,0,1, 11,15,1, 15,0,1, 15,5,0, 15,9,0, 15,15,0, 15,15,1, // Length and number of words of that length 5, 54, // Coordinates where words start and direction (0 = horizontal) 0,5,1, 0,6,0, 0,11,1, 0,14,0, 1,5,1, 1,11,1, 2,10,0, 4,8,1, 4,12,0, 5,0,0, 5,1,0, 5,7,0, 5,13,0, 5,19,0, 5,20,0, 6,0,1, 6,6,1, 6,14,0, 6,16,1, 7,5,1, 7,11,0, 7,11,1, 8,4,0, 8,4,1, 8,10,0, 8,16,0, 9,7,1, 9,9,0, 10,2,1, 10,6,0, 10,8,1, 10,14,1, 11,0,0, 11,1,0, 11,7,0, 11,9,1, 11,13,0, 11,19,0, 11,20,0, 12,8,0, 12,12,1, 13,5,1, 13,11,1, 14,0,1, 14,10,0, 14,10,1, 14,16,1, 16,6,0, 16,8,1, 16,14,0, 19,5,1, 19,11,1, 20,5,1, 20,11,1, // Length and number of words of that length 4, 40, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,7,0, 0,13,0, 0,17,1, 0,18,0, 0,19,0, 0,20,0, 1,0,1, 1,17,1, 2,0,1, 2,17,1, 3,4,0, 3,16,0, 4,3,1, 4,14,1, 7,0,1, 7,17,1, 13,0,1, 13,17,1, 14,4,0, 14,16,0, 16,3,1, 16,14,1, 17,0,0, 17,1,0, 17,2,0, 17,7,0, 17,13,0, 17,18,0, 17,19,0, 17,20,0, 18,0,1, 18,17,1, 19,0,1, 19,17,1, 20,0,1, 20,17,1, // Length and number of words of that length 3, 16, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 0,12,0, 3,9,1, 6,6,0, 6,12,1, 8,0,1, 8,18,1, 9,3,0, 9,17,0, 12,0,1, 12,14,0, 12,18,1, 14,6,1, 17,9,1, 18,8,0, 18,12,0, // End marker 0 }; /* * Name: 21.07, 21 x 21 * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (* * _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ * *) * (_ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ * _ _ _ * _ _ _ _ _ _) * (_ _ _ * _ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (* * * _ _ _ _ _ * * * * * _ _ _ _ _ * * *) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _ * _ _ _) * (_ _ _ _ _ _ * _ _ _ * _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _) * (* * _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ * *) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) */ const int g36[] = { // Width and height of crossword grid 21, 21, // Number of black fields 73, // Black field coordinates 0,4, 0,10, 0,16, 1,4, 1,10, 1,16, 2,10, 3,5, 3,9, 3,15, 4,0, 4,1, 4,6, 4,14, 4,19, 4,20, 5,3, 5,11, 5,17, 6,4, 6,8, 6,12, 6,16, 7,7, 7,13, 8,6, 8,10, 8,14, 9,3, 9,10, 9,15, 10,0, 10,1, 10,2, 10,8, 10,9, 10,10, 10,11, 10,12, 10,18, 10,19, 10,20, 11,5, 11,10, 11,17, 12,6, 12,10, 12,14, 13,7, 13,13, 14,4, 14,8, 14,12, 14,16, 15,3, 15,9, 15,17, 16,0, 16,1, 16,6, 16,14, 16,19, 16,20, 17,5, 17,11, 17,15, 18,10, 19,4, 19,10, 19,16, 20,4, 20,10, 20,16, // Length and number of words of that length 10, 8, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 0,18,0, 2,0,1, 2,11,1, 11,2,0, 11,18,0, 18,0,1, 18,11,1, // Length and number of words of that length 7, 16, // Coordinates where words start and direction (0 = horizontal) 0,7,0, 0,13,0, 4,5,0, 4,7,1, 5,4,1, 7,0,1, 7,4,0, 7,14,1, 7,16,0, 10,15,0, 13,0,1, 13,14,1, 14,7,0, 14,13,0, 15,10,1, 16,7,1, // Length and number of words of that length 6, 12, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 0,12,0, 4,9,0, 8,0,1, 8,15,1, 9,4,1, 11,11,0, 11,11,1, 12,0,1, 12,15,1, 15,8,0, 15,12,0, // Length and number of words of that length 5, 44, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,5,1, 0,11,0, 0,11,1, 0,17,0, 1,5,1, 1,11,1, 3,0,1, 3,10,0, 3,10,1, 3,16,1, 4,15,0, 5,0,0, 5,1,0, 5,12,1, 5,19,0, 5,20,0, 6,17,0, 7,8,1, 8,7,0, 8,13,0, 9,16,1, 10,3,0, 10,3,1, 10,13,1, 11,0,0, 11,0,1, 11,1,0, 11,19,0, 11,20,0, 12,5,0, 13,8,1, 13,10,0, 15,4,1, 16,3,0, 16,9,0, 16,17,0, 17,0,1, 17,6,1, 17,16,1, 19,5,1, 19,11,1, 20,5,1, 20,11,1, // Length and number of words of that length 4, 36, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,6,0, 0,14,0, 0,17,1, 0,19,0, 0,20,0, 1,0,1, 1,17,1, 2,4,0, 2,16,0, 4,2,1, 4,15,1, 6,0,1, 6,11,0, 6,17,1, 9,11,1, 11,6,1, 11,9,0, 14,0,1, 14,17,1, 15,4,0, 15,16,0, 16,2,1, 16,15,1, 17,0,0, 17,1,0, 17,6,0, 17,14,0, 17,19,0, 17,20,0, 19,0,1, 19,17,1, 20,0,1, 20,17,1, // Length and number of words of that length 3, 36, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,9,0, 0,15,0, 3,6,1, 5,0,1, 5,6,0, 5,14,0, 5,18,1, 6,3,0, 6,5,1, 6,9,1, 6,13,1, 7,8,0, 7,12,0, 8,7,1, 8,11,1, 9,0,1, 9,6,0, 9,14,0, 11,8,0, 11,12,0, 11,18,1, 12,7,1, 12,11,1, 12,17,0, 13,6,0, 13,14,0, 14,5,1, 14,9,1, 14,13,1, 15,0,1, 15,18,1, 17,12,1, 18,5,0, 18,11,0, 18,15,0, // End marker 0 }; /* * Name: 21.08, 21 x 21 * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ _ * * _ _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ * * _ _ _ * * _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ _ * * _ _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) */ const int g37[] = { // Width and height of crossword grid 21, 21, // Number of black fields 76, // Black field coordinates 0,4, 0,10, 0,16, 1,4, 1,10, 1,16, 2,4, 2,10, 2,16, 3,8, 3,14, 4,0, 4,1, 4,2, 4,7, 4,13, 4,18, 4,19, 4,20, 5,6, 5,12, 6,5, 6,6, 6,11, 6,17, 7,4, 7,10, 7,16, 8,3, 8,10, 8,15, 9,8, 9,9, 9,14, 10,0, 10,1, 10,2, 10,7, 10,13, 10,18, 10,19, 10,20, 11,6, 11,11, 11,12, 12,5, 12,10, 12,17, 13,4, 13,10, 13,16, 14,3, 14,9, 14,14, 14,15, 15,8, 15,14, 16,0, 16,1, 16,2, 16,7, 16,13, 16,18, 16,19, 16,20, 17,6, 17,12, 18,4, 18,10, 18,16, 19,4, 19,10, 19,16, 20,4, 20,10, 20,16, // Length and number of words of that length 9, 2, // Coordinates where words start and direction (0 = horizontal) 0,9,0, 12,11,0, // Length and number of words of that length 8, 10, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,15,0, 3,0,1, 5,13,1, 9,0,1, 11,13,1, 13,5,0, 13,17,0, 15,0,1, 17,13,1, // Length and number of words of that length 6, 14, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,11,0, 0,17,0, 3,15,1, 5,0,1, 8,4,1, 9,15,1, 11,0,1, 12,11,1, 15,3,0, 15,9,0, 15,15,0, 15,15,1, 17,0,1, // Length and number of words of that length 5, 61, // Coordinates where words start and direction (0 = horizontal) 0,5,1, 0,6,0, 0,11,1, 0,12,0, 1,5,1, 1,11,1, 2,5,1, 2,11,1, 3,9,1, 4,8,0, 4,8,1, 4,14,0, 5,0,0, 5,1,0, 5,2,0, 5,7,0, 5,7,1, 5,13,0, 5,18,0, 5,19,0, 5,20,0, 6,0,1, 6,12,0, 6,12,1, 7,5,0, 7,5,1, 7,11,1, 7,17,0, 8,4,0, 8,16,0, 8,16,1, 9,3,0, 9,15,0, 10,8,0, 10,8,1, 11,0,0, 11,1,0, 11,2,0, 11,7,0, 11,13,0, 11,18,0, 11,19,0, 11,20,0, 12,0,1, 12,6,0, 12,12,0, 13,5,1, 13,11,1, 14,4,1, 14,16,1, 15,9,1, 16,8,0, 16,8,1, 16,14,0, 17,7,1, 18,5,1, 18,11,1, 19,5,1, 19,11,1, 20,5,1, 20,11,1, // Length and number of words of that length 4, 54, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,7,0, 0,13,0, 0,17,1, 0,18,0, 0,19,0, 0,20,0, 1,0,1, 1,17,1, 2,0,1, 2,17,1, 3,4,0, 3,10,0, 3,16,0, 4,3,1, 4,14,1, 6,7,1, 7,0,1, 7,6,0, 7,11,0, 7,17,1, 8,11,1, 9,10,1, 10,3,1, 10,9,0, 10,14,0, 10,14,1, 11,7,1, 12,6,1, 13,0,1, 13,17,1, 14,4,0, 14,10,0, 14,10,1, 14,16,0, 16,3,1, 16,14,1, 17,0,0, 17,1,0, 17,2,0, 17,7,0, 17,13,0, 17,18,0, 17,19,0, 17,20,0, 18,0,1, 18,17,1, 19,0,1, 19,17,1, 20,0,1, 20,17,1, // Length and number of words of that length 3, 9, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 0,14,0, 6,18,1, 8,0,1, 9,10,0, 12,18,1, 14,0,1, 18,6,0, 18,12,0, // End marker 0 }; /* * Name: 21.09, 21 x 21 * (* * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * *) * (* _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ *) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (* _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ *) * (* * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * *) */ const int g38[] = { // Width and height of crossword grid 21, 21, // Number of black fields 75, // Black field coordinates 0,0, 0,1, 0,7, 0,13, 0,19, 0,20, 1,0, 1,7, 1,13, 1,20, 2,7, 2,13, 3,3, 3,11, 3,17, 4,4, 4,10, 4,16, 5,5, 5,9, 5,15, 6,8, 6,14, 7,0, 7,1, 7,2, 7,7, 7,13, 7,18, 7,19, 7,20, 8,6, 8,12, 9,5, 9,11, 9,17, 10,4, 10,10, 10,16, 11,3, 11,9, 11,15, 12,8, 12,14, 13,0, 13,1, 13,2, 13,7, 13,13, 13,18, 13,19, 13,20, 14,6, 14,12, 15,5, 15,11, 15,15, 16,4, 16,10, 16,16, 17,3, 17,9, 17,17, 18,7, 18,13, 19,0, 19,7, 19,13, 19,20, 20,0, 20,1, 20,7, 20,13, 20,19, 20,20, // Length and number of words of that length 8, 8, // Coordinates where words start and direction (0 = horizontal) 0,6,0, 0,12,0, 6,0,1, 8,13,1, 12,0,1, 13,8,0, 13,14,0, 14,13,1, // Length and number of words of that length 7, 12, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 0,18,0, 2,0,1, 2,14,1, 3,4,1, 4,3,0, 10,17,0, 14,2,0, 14,18,0, 17,10,1, 18,0,1, 18,14,1, // Length and number of words of that length 6, 16, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 0,14,0, 1,1,0, 1,1,1, 1,14,1, 1,19,0, 6,15,1, 8,0,1, 12,15,1, 14,0,1, 14,1,0, 14,19,0, 15,6,0, 15,12,0, 19,1,1, 19,14,1, // Length and number of words of that length 5, 72, // Coordinates where words start and direction (0 = horizontal) 0,2,1, 0,5,0, 0,8,1, 0,9,0, 0,14,1, 0,15,0, 1,8,1, 2,0,0, 2,8,1, 2,20,0, 3,12,1, 4,5,1, 4,11,0, 4,11,1, 4,17,0, 5,0,1, 5,4,0, 5,10,0, 5,10,1, 5,16,0, 5,16,1, 6,9,0, 6,9,1, 6,15,0, 7,8,0, 7,8,1, 7,14,0, 8,0,0, 8,1,0, 8,2,0, 8,7,0, 8,7,1, 8,13,0, 8,18,0, 8,19,0, 8,20,0, 9,0,1, 9,6,0, 9,6,1, 9,12,0, 9,12,1, 10,5,0, 10,5,1, 10,11,0, 10,11,1, 11,4,0, 11,4,1, 11,10,0, 11,10,1, 11,16,0, 11,16,1, 12,3,0, 12,9,0, 12,9,1, 13,8,1, 14,0,0, 14,7,1, 14,20,0, 15,0,1, 15,6,1, 15,16,1, 16,5,0, 16,5,1, 16,11,0, 16,11,1, 16,15,0, 17,4,1, 18,8,1, 19,8,1, 20,2,1, 20,8,1, 20,14,1, // Length and number of words of that length 4, 20, // Coordinates where words start and direction (0 = horizontal) 0,4,0, 0,10,0, 0,16,0, 3,7,0, 3,13,0, 4,0,1, 4,17,1, 7,3,1, 7,14,1, 10,0,1, 10,17,1, 13,3,1, 13,14,1, 14,7,0, 14,13,0, 16,0,1, 16,17,1, 17,4,0, 17,10,0, 17,16,0, // Length and number of words of that length 3, 16, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,11,0, 0,17,0, 3,0,1, 3,18,1, 5,6,1, 6,5,0, 9,18,1, 11,0,1, 12,15,0, 15,12,1, 17,0,1, 17,18,1, 18,3,0, 18,9,0, 18,17,0, // End marker 0 }; /* * Name: 21.10, 21 x 21 * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ * _ _ _ _ _ _ _ _ _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ * _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ _ _ * _ _ _ _ _ _ _ _ * * *) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _) * (* * * _ _ _ _ _ _ _ _ * _ _ _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ * _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ _ _ _ _ _ _ _ _ * _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) */ const int g39[] = { // Width and height of crossword grid 21, 21, // Number of black fields 58, // Black field coordinates 0,7, 0,13, 1,7, 1,13, 2,7, 2,13, 3,3, 3,17, 4,4, 4,12, 4,16, 5,5, 5,11, 5,15, 6,6, 6,10, 6,14, 7,0, 7,1, 7,2, 7,9, 7,18, 7,19, 7,20, 8,8, 8,16, 9,7, 9,15, 10,6, 10,14, 11,5, 11,13, 12,4, 12,12, 13,0, 13,1, 13,2, 13,11, 13,18, 13,19, 13,20, 14,6, 14,10, 14,14, 15,5, 15,9, 15,15, 16,4, 16,8, 16,16, 17,3, 17,17, 18,7, 18,13, 19,7, 19,13, 20,7, 20,13, // Length and number of words of that length 13, 4, // Coordinates where words start and direction (0 = horizontal) 3,4,1, 4,3,0, 4,17,0, 17,4,1, // Length and number of words of that length 8, 8, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 3,13,0, 7,10,1, 8,0,1, 10,7,0, 12,13,1, 13,3,1, 13,12,0, // Length and number of words of that length 7, 42, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,9,0, 0,14,1, 0,18,0, 0,19,0, 0,20,0, 1,0,1, 1,14,1, 2,0,1, 2,14,1, 4,5,1, 5,4,0, 5,12,0, 6,11,0, 7,10,0, 8,9,0, 8,9,1, 9,0,1, 9,8,0, 9,8,1, 9,16,0, 10,7,1, 11,6,1, 11,14,1, 12,5,1, 14,0,0, 14,1,0, 14,2,0, 14,11,0, 14,18,0, 14,19,0, 14,20,0, 16,9,1, 18,0,1, 18,14,1, 19,0,1, 19,14,1, 20,0,1, 20,14,1, // Length and number of words of that length 6, 16, // Coordinates where words start and direction (0 = horizontal) 0,6,0, 0,10,0, 0,14,0, 3,7,0, 6,0,1, 6,15,1, 7,3,1, 10,0,1, 10,15,1, 12,13,0, 13,12,1, 14,0,1, 14,15,1, 15,6,0, 15,10,0, 15,14,0, // Length and number of words of that length 5, 28, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,8,1, 0,11,0, 0,15,0, 1,8,1, 2,8,1, 5,0,1, 5,6,1, 5,16,1, 6,5,0, 8,0,0, 8,1,0, 8,2,0, 8,18,0, 8,19,0, 8,20,0, 9,16,1, 10,15,0, 11,0,1, 15,0,1, 15,10,1, 15,16,1, 16,5,0, 16,9,0, 16,15,0, 18,8,1, 19,8,1, 20,8,1, // Length and number of words of that length 4, 12, // Coordinates where words start and direction (0 = horizontal) 0,4,0, 0,12,0, 0,16,0, 4,0,1, 4,17,1, 8,17,1, 12,0,1, 16,0,1, 16,17,1, 17,4,0, 17,8,0, 17,16,0, // Length and number of words of that length 3, 24, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,17,0, 3,0,1, 3,18,1, 4,13,1, 5,12,1, 5,16,0, 6,7,1, 6,11,1, 6,15,0, 7,6,0, 7,14,0, 11,6,0, 11,14,0, 12,5,0, 13,4,0, 14,7,1, 14,11,1, 15,6,1, 16,5,1, 17,0,1, 17,18,1, 18,3,0, 18,17,0, // End marker 0 }; /* * Name: 23.01, 23 x 23 * (_ _ _ _ _ _ * _ _ _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ * * _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ * _ _ _ _ _ _ _ _ _ _ _ * * _ _ _ _ _ _) * (* * * * _ _ _ * _ _ _ * _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ * * * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ * * _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ * _ _ _ _) * (* * * _ _ _ _ _ _ _ * * * _ _ _ _ _ _ _ * * *) * (_ _ _ _ * _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ * * _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * * * _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ * _ _ _ * _ _ _ * * * *) * (_ _ _ _ _ _ * * _ _ _ _ _ _ _ _ _ _ _ * _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ * * _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ _ _ * _ _ _ _ _ _) */ const int g40[] = { // Width and height of crossword grid 23, 23, // Number of black fields 89, // Black field coordinates 0,5, 0,11, 0,17, 1,5, 1,11, 1,17, 2,5, 2,11, 2,17, 3,4, 3,5, 4,3, 4,8, 4,12, 4,16, 4,21, 4,22, 5,7, 5,15, 6,0, 6,1, 6,6, 6,10, 6,14, 6,18, 7,5, 7,9, 7,13, 7,17, 7,18, 8,3, 8,8, 8,12, 8,19, 9,3, 9,8, 9,21, 9,22, 10,6, 10,11, 10,16, 11,5, 11,6, 11,7, 11,11, 11,15, 11,16, 11,17, 12,6, 12,11, 12,16, 13,0, 13,1, 13,14, 13,19, 14,3, 14,10, 14,14, 14,19, 15,4, 15,5, 15,9, 15,13, 15,17, 16,4, 16,8, 16,12, 16,16, 16,21, 16,22, 17,7, 17,15, 18,0, 18,1, 18,6, 18,10, 18,14, 18,19, 19,17, 19,18, 20,5, 20,11, 20,17, 21,5, 21,11, 21,17, 22,5, 22,11, 22,17, // Length and number of words of that length 23, 2, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 0,20,0, // Length and number of words of that length 17, 2, // Coordinates where words start and direction (0 = horizontal) 3,6,1, 19,0,1, // Length and number of words of that length 12, 2, // Coordinates where words start and direction (0 = horizontal) 9,9,1, 13,2,1, // Length and number of words of that length 11, 2, // Coordinates where words start and direction (0 = horizontal) 4,4,0, 8,18,0, // Length and number of words of that length 8, 2, // Coordinates where words start and direction (0 = horizontal) 0,19,0, 15,3,0, // Length and number of words of that length 7, 16, // Coordinates where words start and direction (0 = horizontal) 0,9,0, 0,13,0, 3,11,0, 5,0,1, 5,8,1, 5,16,1, 7,10,0, 8,9,0, 8,13,0, 9,12,0, 13,11,0, 16,9,0, 16,13,0, 17,0,1, 17,8,1, 17,16,1, // Length and number of words of that length 6, 24, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,1,0, 0,6,0, 0,10,0, 0,14,0, 0,18,0, 7,0,0, 7,1,0, 7,14,0, 8,13,1, 10,0,1, 10,8,0, 10,17,1, 10,21,0, 10,22,0, 12,0,1, 12,17,1, 14,4,1, 17,4,0, 17,8,0, 17,12,0, 17,16,0, 17,21,0, 17,22,0, // Length and number of words of that length 5, 38, // Coordinates where words start and direction (0 = horizontal) 0,0,1, 0,6,1, 0,7,0, 0,12,1, 0,15,0, 0,18,1, 1,0,1, 1,6,1, 1,12,1, 1,18,1, 2,0,1, 2,6,1, 2,12,1, 2,18,1, 5,16,0, 6,7,0, 6,15,0, 7,0,1, 11,0,1, 11,18,1, 12,7,0, 12,15,0, 13,6,0, 15,18,1, 18,7,0, 18,15,0, 20,0,1, 20,6,1, 20,12,1, 20,18,1, 21,0,1, 21,6,1, 21,12,1, 21,18,1, 22,0,1, 22,6,1, 22,12,1, 22,18,1, // Length and number of words of that length 4, 40, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,8,0, 0,12,0, 0,16,0, 0,21,0, 0,22,0, 3,0,1, 3,17,0, 4,4,1, 4,17,1, 5,21,0, 5,22,0, 6,2,1, 6,19,1, 7,19,1, 8,4,1, 9,4,1, 9,19,0, 10,3,0, 10,7,1, 10,12,1, 12,7,1, 12,12,1, 13,15,1, 14,0,0, 14,1,0, 14,15,1, 15,0,1, 16,0,1, 16,5,0, 16,17,1, 18,2,1, 18,15,1, 19,0,0, 19,1,0, 19,6,0, 19,10,0, 19,14,0, 19,19,0, 19,19,1, // Length and number of words of that length 3, 44, // Coordinates where words start and direction (0 = horizontal) 0,4,0, 4,0,1, 4,5,0, 4,9,1, 4,13,1, 5,3,0, 5,8,0, 5,12,0, 6,7,1, 6,11,1, 6,15,1, 7,6,0, 7,6,1, 7,10,1, 7,14,1, 8,0,1, 8,5,0, 8,9,1, 8,17,0, 8,20,1, 9,0,1, 11,8,1, 11,12,1, 12,5,0, 12,17,0, 13,16,0, 13,20,1, 14,0,1, 14,11,1, 14,20,1, 15,6,1, 15,10,0, 15,10,1, 15,14,0, 15,14,1, 15,19,0, 16,5,1, 16,9,1, 16,13,1, 16,17,0, 18,7,1, 18,11,1, 18,20,1, 20,18,0, // End marker 0 }; /* * Name: 23.02, 23 x 23 * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ *) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ * * _ _ _ _ _ _ _ _ _ * _ _ _ _ * _ _ _) * (_ _ _ _ _ _ _ * * _ _ _ _ * _ _ _ _ * _ _ _ _) * (* * * _ _ _ * _ _ _ _ * * _ _ _ * * _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _) * (* * _ _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ _ * *) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ * * _ _ _ * * _ _ _ _ * _ _ _ * * *) * (_ _ _ _ * _ _ _ _ * _ _ _ _ * * _ _ _ _ _ _ _) * (_ _ _ * _ _ _ _ * _ _ _ _ _ _ _ _ _ * * _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (* _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _ _ _) */ const int g41[] = { // Width and height of crossword grid 23, 23, // Number of black fields 94, // Black field coordinates 0,5, 0,10, 0,16, 0,22, 1,5, 1,10, 1,16, 2,5, 2,16, 3,3, 3,9, 3,14, 3,19, 4,3, 4,7, 4,8, 4,13, 4,18, 5,0, 5,1, 5,6, 5,12, 5,17, 6,5, 6,17, 6,21, 6,22, 7,4, 7,10, 7,11, 7,15, 7,16, 8,4, 8,9, 8,19, 9,8, 9,13, 9,14, 9,18, 10,0, 10,1, 10,2, 10,6, 10,7, 10,12, 10,17, 11,5, 11,17, 12,5, 12,10, 12,15, 12,16, 12,20, 12,21, 12,22, 13,4, 13,8, 13,9, 13,14, 14,3, 14,13, 14,18, 15,6, 15,7, 15,11, 15,12, 15,18, 16,0, 16,1, 16,5, 16,17, 17,5, 17,10, 17,16, 17,21, 17,22, 18,4, 18,9, 18,14, 18,15, 18,19, 19,3, 19,8, 19,13, 19,19, 20,6, 20,17, 21,6, 21,12, 21,17, 22,0, 22,6, 22,12, 22,17, // Length and number of words of that length 12, 2, // Coordinates where words start and direction (0 = horizontal) 0,20,0, 11,2,0, // Length and number of words of that length 11, 3, // Coordinates where words start and direction (0 = horizontal) 6,6,1, 11,6,1, 16,6,1, // Length and number of words of that length 10, 4, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 2,6,1, 13,20,0, 20,7,1, // Length and number of words of that length 9, 4, // Coordinates where words start and direction (0 = horizontal) 5,3,0, 8,10,1, 9,19,0, 14,4,1, // Length and number of words of that length 8, 2, // Coordinates where words start and direction (0 = horizontal) 9,0,1, 13,15,1, // Length and number of words of that length 7, 7, // Coordinates where words start and direction (0 = horizontal) 0,4,0, 0,11,0, 0,15,0, 8,11,0, 16,7,0, 16,11,0, 16,18,0, // Length and number of words of that length 6, 8, // Coordinates where words start and direction (0 = horizontal) 0,21,0, 1,17,1, 2,17,1, 7,17,1, 15,0,1, 17,1,0, 20,0,1, 21,0,1, // Length and number of words of that length 5, 48, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,6,0, 0,11,1, 0,12,0, 0,17,0, 0,17,1, 1,0,1, 1,11,1, 1,22,0, 2,0,1, 2,10,0, 3,4,1, 4,14,0, 5,7,0, 5,7,1, 5,18,1, 6,0,1, 7,5,1, 7,21,0, 7,22,0, 10,18,1, 11,0,0, 11,0,1, 11,1,0, 11,18,1, 12,0,1, 13,15,0, 14,8,0, 15,13,1, 16,12,0, 16,18,1, 17,0,0, 17,0,1, 17,11,1, 18,5,0, 18,10,0, 18,16,0, 18,21,0, 18,22,0, 19,14,1, 20,18,1, 21,7,1, 21,18,1, 22,1,1, 22,7,1, 22,18,1, // Length and number of words of that length 4, 72, // Coordinates where words start and direction (0 = horizontal) 0,6,1, 0,7,0, 0,8,0, 0,13,0, 0,18,0, 1,6,1, 3,10,1, 3,15,1, 3,16,0, 4,9,0, 4,9,1, 4,14,1, 4,19,0, 4,19,1, 5,2,1, 5,8,0, 5,13,0, 5,13,1, 5,18,0, 6,0,0, 6,1,0, 6,6,0, 6,12,0, 7,0,1, 7,5,0, 8,0,1, 8,5,1, 8,10,0, 8,15,0, 8,16,0, 9,4,0, 9,9,0, 9,9,1, 9,19,1, 10,8,1, 10,13,0, 10,13,1, 10,18,0, 11,6,0, 11,7,0, 11,12,0, 12,6,1, 12,11,1, 12,17,0, 13,0,1, 13,10,0, 13,10,1, 13,16,0, 13,21,0, 13,22,0, 14,4,0, 14,9,0, 14,14,0, 14,14,1, 14,19,1, 15,3,0, 15,13,0, 15,19,1, 16,6,0, 17,6,1, 17,17,1, 18,0,1, 18,5,1, 18,10,1, 19,4,0, 19,4,1, 19,9,0, 19,9,1, 19,14,0, 19,15,0, 21,13,1, 22,13,1, // Length and number of words of that length 3, 32, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,9,0, 0,14,0, 0,19,0, 3,0,1, 3,5,0, 3,20,1, 4,0,1, 4,4,1, 6,18,1, 7,12,1, 7,17,0, 8,20,1, 9,15,1, 10,3,1, 10,8,0, 10,14,0, 12,17,1, 13,5,0, 13,5,1, 14,0,1, 15,8,1, 16,2,1, 17,17,0, 18,16,1, 18,20,1, 19,0,1, 19,20,1, 20,3,0, 20,8,0, 20,13,0, 20,19,0, // End marker 0 }; /* * Name: 23.03, 23 x 23 * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ * * _ _ _ * * * _ _ _ _ _ _ _ * _ _ _ _) * (* * * _ _ _ _ _ _ _ * _ _ _ _ _ * * _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ * _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ * * _ _ _ _ _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ * * _ _ _ _ _ * _ _ _ _ _ _) * (* * _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ * *) * (_ _ _ _ _ _ * _ _ _ _ _ * * _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ _ _ _ _ * * _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ * _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ * * _ _ _ _ _ * _ _ _ _ _ _ _ * * *) * (_ _ _ _ * _ _ _ _ _ _ _ * * * _ _ _ * * _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) */ const int g42[] = { // Width and height of crossword grid 23, 23, // Number of black fields 89, // Black field coordinates 0,5, 0,11, 0,16, 1,5, 1,11, 1,16, 2,5, 2,16, 3,4, 3,10, 3,15, 4,4, 4,8, 4,13, 4,14, 4,18, 4,19, 5,11, 5,17, 5,21, 5,22, 6,0, 6,1, 6,6, 6,7, 6,12, 6,17, 7,3, 7,9, 7,16, 8,4, 8,9, 9,4, 9,10, 9,14, 9,19, 10,4, 10,5, 10,10, 10,15, 10,20, 10,21, 10,22, 11,6, 11,11, 11,16, 12,0, 12,1, 12,2, 12,7, 12,12, 12,17, 12,18, 13,3, 13,8, 13,12, 13,18, 14,13, 14,18, 15,6, 15,13, 15,19, 16,5, 16,10, 16,15, 16,16, 16,21, 16,22, 17,0, 17,1, 17,5, 17,11, 18,3, 18,4, 18,8, 18,9, 18,14, 18,18, 19,7, 19,12, 19,18, 20,6, 20,17, 21,6, 21,11, 21,17, 22,6, 22,11, 22,17, // Length and number of words of that length 13, 2, // Coordinates where words start and direction (0 = horizontal) 8,10,1, 14,0,1, // Length and number of words of that length 12, 2, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 11,20,0, // Length and number of words of that length 11, 2, // Coordinates where words start and direction (0 = horizontal) 5,0,1, 17,12,1, // Length and number of words of that length 10, 4, // Coordinates where words start and direction (0 = horizontal) 0,20,0, 2,6,1, 13,2,0, 20,7,1, // Length and number of words of that length 9, 2, // Coordinates where words start and direction (0 = horizontal) 5,13,0, 9,9,0, // Length and number of words of that length 8, 2, // Coordinates where words start and direction (0 = horizontal) 5,8,0, 10,14,0, // Length and number of words of that length 7, 10, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,9,0, 3,5,0, 3,16,1, 5,18,0, 11,4,0, 13,17,0, 16,13,0, 16,19,0, 19,0,1, // Length and number of words of that length 6, 24, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,1,0, 0,6,0, 0,7,0, 0,12,0, 0,17,1, 1,17,1, 2,17,1, 4,15,0, 7,10,1, 7,17,1, 11,0,1, 11,17,1, 13,7,0, 15,0,1, 15,7,1, 17,10,0, 17,15,0, 17,16,0, 17,21,0, 17,22,0, 20,0,1, 21,0,1, 22,0,1, // Length and number of words of that length 5, 42, // Coordinates where words start and direction (0 = horizontal) 0,0,1, 0,6,1, 0,17,0, 0,21,0, 0,22,0, 1,0,1, 1,6,1, 2,0,1, 3,5,1, 4,10,0, 5,12,1, 6,11,0, 6,18,1, 7,0,0, 7,1,0, 7,4,1, 7,7,0, 7,12,0, 7,17,0, 8,3,0, 9,5,1, 10,19,0, 11,5,0, 11,10,0, 11,15,0, 11,21,0, 11,22,0, 12,11,0, 13,13,1, 14,12,0, 15,14,1, 16,0,1, 17,6,1, 18,0,0, 18,1,0, 18,5,0, 19,13,1, 20,18,1, 21,12,1, 21,18,1, 22,12,1, 22,18,1, // Length and number of words of that length 4, 58, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 0,12,1, 0,13,0, 0,14,0, 0,18,0, 0,19,0, 1,12,1, 3,0,1, 3,11,1, 3,16,0, 4,0,1, 4,9,1, 5,14,0, 5,19,0, 6,2,1, 6,8,1, 6,13,1, 6,21,0, 6,22,0, 7,6,0, 8,0,1, 8,5,1, 9,0,1, 9,15,1, 10,0,1, 10,6,1, 10,11,1, 10,16,1, 11,7,1, 11,12,1, 12,3,1, 12,8,1, 12,13,1, 12,16,0, 12,19,1, 13,0,0, 13,1,0, 13,4,1, 13,19,1, 14,3,0, 14,8,0, 14,14,1, 14,19,1, 16,6,0, 16,6,1, 16,11,1, 16,17,1, 18,10,1, 18,19,1, 19,3,0, 19,4,0, 19,8,0, 19,8,1, 19,9,0, 19,14,0, 19,19,1, 21,7,1, 22,7,1, // Length and number of words of that length 3, 26, // Coordinates where words start and direction (0 = horizontal) 0,4,0, 0,10,0, 0,15,0, 2,11,0, 4,5,1, 4,15,1, 4,20,1, 5,4,0, 5,18,1, 7,0,1, 8,16,0, 9,11,1, 9,20,1, 12,6,0, 13,0,1, 13,9,1, 15,18,0, 15,20,1, 17,2,1, 18,0,1, 18,5,1, 18,11,0, 18,15,1, 20,7,0, 20,12,0, 20,18,0, // End marker 0 }; /* * Name: 23.04, 23 x 23 * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ * _ _ _ * _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ * _ _ _ * _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) */ const int g43[] = { // Width and height of crossword grid 23, 23, // Number of black fields 80, // Black field coordinates 0,5, 0,11, 0,17, 1,5, 1,11, 1,17, 2,5, 2,11, 2,17, 3,9, 3,13, 4,8, 4,14, 5,0, 5,1, 5,2, 5,7, 5,15, 5,20, 5,21, 5,22, 6,6, 6,10, 6,16, 7,5, 7,11, 7,17, 8,4, 8,12, 8,18, 9,3, 9,9, 9,13, 9,19, 10,8, 10,16, 11,0, 11,1, 11,2, 11,7, 11,15, 11,20, 11,21, 11,22, 12,6, 12,14, 13,3, 13,9, 13,13, 13,19, 14,4, 14,10, 14,18, 15,5, 15,11, 15,17, 16,6, 16,12, 16,16, 17,0, 17,1, 17,2, 17,7, 17,15, 17,20, 17,21, 17,22, 18,8, 18,14, 19,9, 19,13, 20,5, 20,11, 20,17, 21,5, 21,11, 21,17, 22,5, 22,11, 22,17, // Length and number of words of that length 9, 8, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,19,0, 3,0,1, 3,14,1, 14,3,0, 14,19,0, 19,0,1, 19,14,1, // Length and number of words of that length 8, 12, // Coordinates where words start and direction (0 = horizontal) 0,4,0, 0,12,0, 0,18,0, 4,0,1, 4,15,1, 10,0,1, 12,15,1, 15,4,0, 15,10,0, 15,18,0, 18,0,1, 18,15,1, // Length and number of words of that length 7, 14, // Coordinates where words start and direction (0 = horizontal) 5,8,1, 5,14,0, 7,10,0, 8,5,0, 8,5,1, 8,11,0, 8,17,0, 9,12,0, 10,9,1, 11,8,0, 11,8,1, 12,7,1, 14,11,1, 17,8,1, // Length and number of words of that length 6, 12, // Coordinates where words start and direction (0 = horizontal) 0,6,0, 0,10,0, 0,16,0, 6,0,1, 6,17,1, 10,17,1, 12,0,1, 16,0,1, 16,17,1, 17,6,0, 17,12,0, 17,16,0, // Length and number of words of that length 5, 84, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,6,1, 0,7,0, 0,12,1, 0,15,0, 0,18,1, 0,20,0, 0,21,0, 0,22,0, 1,0,1, 1,6,1, 1,12,1, 1,18,1, 2,0,1, 2,6,1, 2,12,1, 2,18,1, 4,9,0, 4,9,1, 4,13,0, 5,8,0, 6,0,0, 6,1,0, 6,2,0, 6,7,0, 6,11,1, 6,15,0, 6,20,0, 6,21,0, 6,22,0, 7,0,1, 7,6,0, 7,6,1, 7,12,1, 7,18,1, 8,13,1, 9,4,0, 9,4,1, 9,14,1, 9,18,0, 11,16,0, 12,0,0, 12,1,0, 12,2,0, 12,7,0, 12,15,0, 12,20,0, 12,21,0, 12,22,0, 13,4,1, 13,14,0, 13,14,1, 14,5,1, 14,9,0, 14,13,0, 15,0,1, 15,6,1, 15,12,1, 15,18,1, 16,7,1, 18,0,0, 18,1,0, 18,2,0, 18,7,0, 18,9,1, 18,15,0, 18,20,0, 18,21,0, 18,22,0, 20,0,1, 20,6,1, 20,12,1, 20,18,1, 21,0,1, 21,6,1, 21,12,1, 21,18,1, 22,0,1, 22,6,1, 22,12,1, 22,18,1, // Length and number of words of that length 4, 20, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 0,14,0, 3,5,0, 3,11,0, 3,17,0, 5,3,1, 5,16,1, 8,0,1, 8,19,1, 11,3,1, 11,16,1, 14,0,1, 14,19,1, 16,5,0, 16,11,0, 16,17,0, 17,3,1, 17,16,1, 19,8,0, 19,14,0, // Length and number of words of that length 3, 20, // Coordinates where words start and direction (0 = horizontal) 0,9,0, 0,13,0, 3,10,1, 6,7,1, 7,16,0, 9,0,1, 9,10,1, 9,20,1, 10,3,0, 10,9,0, 10,13,0, 10,19,0, 13,0,1, 13,6,0, 13,10,1, 13,20,1, 16,13,1, 19,10,1, 20,9,0, 20,13,0, // End marker 0 }; /* * Name: 23.05, 23 x 23 * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (* * * _ _ _ * _ _ _ _ _ * _ _ _ * _ _ _ * * *) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (* * * _ _ _ * _ _ _ _ _ _ _ _ _ * _ _ _ * * *) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (* * * _ _ _ * _ _ _ * _ _ _ _ _ * _ _ _ * * *) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) */ const int g44[] = { // Width and height of crossword grid 23, 23, // Number of black fields 84, // Black field coordinates 0,5, 0,11, 0,17, 1,5, 1,11, 1,17, 2,5, 2,11, 2,17, 3,3, 3,8, 3,14, 3,19, 4,7, 4,15, 5,0, 5,1, 5,6, 5,12, 5,16, 5,20, 5,21, 5,22, 6,5, 6,11, 6,17, 7,4, 7,10, 7,18, 8,3, 8,9, 8,14, 8,19, 9,8, 9,13, 10,7, 10,12, 10,17, 11,0, 11,1, 11,2, 11,6, 11,16, 11,20, 11,21, 11,22, 12,5, 12,10, 12,15, 13,9, 13,14, 14,3, 14,8, 14,13, 14,19, 15,4, 15,12, 15,18, 16,5, 16,11, 16,17, 17,0, 17,1, 17,2, 17,6, 17,10, 17,16, 17,21, 17,22, 18,7, 18,15, 19,3, 19,8, 19,14, 19,19, 20,5, 20,11, 20,17, 21,5, 21,11, 21,17, 22,5, 22,11, 22,17, // Length and number of words of that length 11, 2, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 12,20,0, // Length and number of words of that length 9, 6, // Coordinates where words start and direction (0 = horizontal) 0,13,0, 7,11,0, 9,14,1, 11,7,1, 13,0,1, 14,9,0, // Length and number of words of that length 8, 4, // Coordinates where words start and direction (0 = horizontal) 0,9,0, 9,0,1, 13,15,1, 15,13,0, // Length and number of words of that length 7, 20, // Coordinates where words start and direction (0 = horizontal) 0,4,0, 0,10,0, 0,18,0, 4,0,1, 4,8,1, 4,16,1, 5,15,0, 7,11,1, 8,4,0, 8,18,0, 10,0,1, 11,7,0, 12,16,1, 15,5,1, 16,4,0, 16,12,0, 16,18,0, 18,0,1, 18,8,1, 18,16,1, // Length and number of words of that length 5, 80, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,6,0, 0,6,1, 0,12,0, 0,12,1, 0,16,0, 0,18,1, 0,20,0, 0,21,0, 0,22,0, 1,0,1, 1,6,1, 1,12,1, 1,18,1, 2,0,1, 2,6,1, 2,12,1, 2,18,1, 3,9,1, 4,8,0, 5,7,0, 5,7,1, 6,0,0, 6,0,1, 6,1,0, 6,6,0, 6,6,1, 6,12,1, 6,16,0, 6,18,1, 6,20,0, 6,21,0, 6,22,0, 7,5,0, 7,5,1, 8,4,1, 9,3,0, 9,19,0, 10,18,1, 11,17,0, 12,0,0, 12,0,1, 12,1,0, 12,2,0, 12,6,0, 12,16,0, 12,21,0, 12,22,0, 13,15,0, 14,14,0, 14,14,1, 15,13,1, 16,0,1, 16,6,1, 16,12,1, 16,18,1, 17,11,1, 18,0,0, 18,1,0, 18,2,0, 18,6,0, 18,10,0, 18,16,0, 18,21,0, 18,22,0, 19,9,1, 20,0,1, 20,6,1, 20,12,1, 20,18,1, 21,0,1, 21,6,1, 21,12,1, 21,18,1, 22,0,1, 22,6,1, 22,12,1, 22,18,1, // Length and number of words of that length 4, 38, // Coordinates where words start and direction (0 = horizontal) 0,7,0, 0,15,0, 3,4,1, 3,15,1, 4,3,0, 4,14,0, 4,19,0, 5,2,1, 6,12,0, 7,0,1, 7,19,1, 8,10,0, 8,10,1, 8,15,1, 9,9,0, 9,9,1, 9,14,0, 10,8,0, 10,8,1, 10,13,0, 10,13,1, 11,12,0, 12,6,1, 12,11,1, 13,10,0, 13,10,1, 14,4,1, 14,9,1, 15,0,1, 15,3,0, 15,8,0, 15,19,0, 15,19,1, 17,17,1, 19,4,1, 19,7,0, 19,15,0, 19,15,1, // Length and number of words of that length 3, 30, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,8,0, 0,14,0, 0,19,0, 3,0,1, 3,5,0, 3,11,0, 3,17,0, 3,20,1, 5,13,1, 5,17,1, 7,17,0, 8,0,1, 8,20,1, 11,3,1, 11,17,1, 13,5,0, 14,0,1, 14,20,1, 17,3,1, 17,5,0, 17,7,1, 17,11,0, 17,17,0, 19,0,1, 19,20,1, 20,3,0, 20,8,0, 20,14,0, 20,19,0, // End marker 0 }; /* * Name: 23.06, 23 x 23 * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ * _ _ _ _ _ _ * _ _ _ _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ _ * _ _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ * _ _ _ * _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ * * * _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ * _ _ _ * _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ _ * _ _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ _ _ _ * _ _ _ _ _ _ * _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) */ const int g45[] = { // Width and height of crossword grid 23, 23, // Number of black fields 69, // Black field coordinates 0,7, 0,15, 1,7, 1,15, 2,7, 2,15, 3,3, 3,12, 3,19, 4,4, 4,11, 4,18, 5,5, 5,10, 5,17, 6,8, 6,14, 7,0, 7,1, 7,2, 7,7, 7,15, 7,20, 7,21, 7,22, 8,6, 8,16, 9,9, 9,13, 10,3, 10,11, 10,17, 11,4, 11,10, 11,11, 11,12, 11,18, 12,5, 12,11, 12,19, 13,9, 13,13, 14,6, 14,16, 15,0, 15,1, 15,2, 15,7, 15,15, 15,20, 15,21, 15,22, 16,8, 16,14, 17,5, 17,12, 17,17, 18,4, 18,11, 18,18, 19,3, 19,10, 19,19, 20,7, 20,15, 21,7, 21,15, 22,7, 22,15, // Length and number of words of that length 9, 12, // Coordinates where words start and direction (0 = horizontal) 0,9,0, 0,13,0, 7,8,0, 7,14,0, 8,7,1, 9,0,1, 9,14,1, 13,0,1, 13,14,1, 14,7,1, 14,9,0, 14,13,0, // Length and number of words of that length 8, 12, // Coordinates where words start and direction (0 = horizontal) 0,6,0, 0,16,0, 3,4,1, 4,19,0, 6,0,1, 6,15,1, 11,3,0, 15,6,0, 15,16,0, 16,0,1, 16,15,1, 19,11,1, // Length and number of words of that length 7, 44, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,8,1, 0,16,1, 0,20,0, 0,21,0, 0,22,0, 1,0,1, 1,8,1, 1,16,1, 2,0,1, 2,8,1, 2,16,1, 4,12,0, 7,8,1, 8,0,0, 8,1,0, 8,2,0, 8,7,0, 8,15,0, 8,20,0, 8,21,0, 8,22,0, 10,4,1, 12,10,0, 12,12,1, 15,8,1, 16,0,0, 16,1,0, 16,2,0, 16,20,0, 16,21,0, 16,22,0, 20,0,1, 20,8,1, 20,16,1, 21,0,1, 21,8,1, 21,16,1, 22,0,1, 22,8,1, 22,16,1, // Length and number of words of that length 6, 24, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 0,14,0, 3,13,1, 4,3,0, 4,5,1, 4,12,1, 5,4,0, 5,11,1, 5,18,0, 6,5,0, 8,0,1, 8,17,1, 11,17,0, 12,4,0, 12,18,0, 13,19,0, 14,0,1, 14,17,1, 17,6,1, 17,8,0, 17,14,0, 18,5,1, 18,12,1, 19,4,1, // Length and number of words of that length 5, 24, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,10,0, 0,17,0, 5,0,1, 5,11,0, 5,18,1, 6,9,1, 6,10,0, 9,6,0, 9,16,0, 10,12,1, 10,18,1, 11,5,1, 11,13,1, 12,0,1, 12,6,1, 12,12,0, 13,11,0, 16,9,1, 17,0,1, 17,18,1, 18,5,0, 18,12,0, 18,17,0, // Length and number of words of that length 4, 24, // Coordinates where words start and direction (0 = horizontal) 0,4,0, 0,11,0, 0,18,0, 3,7,0, 3,15,0, 4,0,1, 4,19,1, 5,6,1, 6,17,0, 7,3,1, 7,16,1, 11,0,1, 11,19,1, 13,5,0, 15,3,1, 15,16,1, 16,7,0, 16,15,0, 17,13,1, 18,0,1, 18,19,1, 19,4,0, 19,11,0, 19,18,0, // Length and number of words of that length 3, 16, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,12,0, 0,19,0, 3,0,1, 3,20,1, 9,10,1, 10,0,1, 10,9,0, 10,13,0, 12,20,1, 13,10,1, 19,0,1, 19,20,1, 20,3,0, 20,10,0, 20,19,0, // End marker 0 }; /* * Name: 23.07, 23 x 23 * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ *) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * * _ _ _ _ * _ _ _ * * *) * (_ _ _ _ * _ _ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _ * _ _ _ _) * (* * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * *) * (_ _ _ _ * _ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _ _ * _ _ _ _) * (* * * _ _ _ * _ _ _ _ * * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (* _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) */ const int g46[] = { // Width and height of crossword grid 23, 23, // Number of black fields 83, // Black field coordinates 0,4, 0,10, 0,16, 0,22, 1,4, 1,10, 1,16, 2,4, 2,16, 3,8, 3,14, 3,19, 4,0, 4,1, 4,7, 4,13, 4,18, 5,6, 5,12, 5,17, 6,5, 6,10, 6,11, 6,16, 6,21, 6,22, 7,4, 7,15, 8,3, 8,9, 8,14, 8,19, 9,8, 9,18, 10,0, 10,1, 10,2, 10,6, 10,12, 10,17, 11,6, 11,11, 11,16, 12,5, 12,10, 12,16, 12,20, 12,21, 12,22, 13,4, 13,14, 14,3, 14,8, 14,13, 14,19, 15,7, 15,18, 16,0, 16,1, 16,6, 16,11, 16,12, 16,17, 17,5, 17,10, 17,16, 18,4, 18,9, 18,15, 18,21, 18,22, 19,3, 19,8, 19,14, 20,6, 20,18, 21,6, 21,12, 21,18, 22,0, 22,6, 22,12, 22,18, // Length and number of words of that length 12, 2, // Coordinates where words start and direction (0 = horizontal) 0,20,0, 11,2,0, // Length and number of words of that length 11, 2, // Coordinates where words start and direction (0 = horizontal) 2,5,1, 20,7,1, // Length and number of words of that length 10, 6, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 5,7,0, 7,5,1, 8,15,0, 13,20,0, 15,8,1, // Length and number of words of that length 9, 4, // Coordinates where words start and direction (0 = horizontal) 5,13,0, 9,9,0, 9,9,1, 13,5,1, // Length and number of words of that length 8, 8, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,9,0, 3,0,1, 9,0,1, 13,15,1, 15,13,0, 15,19,0, 19,15,1, // Length and number of words of that length 7, 4, // Coordinates where words start and direction (0 = horizontal) 0,15,0, 7,16,1, 15,0,1, 16,7,0, // Length and number of words of that length 6, 14, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,11,0, 0,21,0, 1,17,1, 2,17,1, 5,0,1, 11,0,1, 11,17,1, 17,1,0, 17,11,0, 17,17,0, 17,17,1, 20,0,1, 21,0,1, // Length and number of words of that length 5, 54, // Coordinates where words start and direction (0 = horizontal) 0,5,1, 0,6,0, 0,11,1, 0,12,0, 0,17,0, 0,17,1, 1,5,1, 1,11,1, 1,22,0, 3,9,1, 4,2,1, 4,8,0, 4,8,1, 5,0,0, 5,1,0, 5,7,1, 5,18,1, 6,0,1, 7,5,0, 7,10,0, 7,21,0, 7,22,0, 8,4,0, 8,4,1, 9,3,0, 9,19,0, 10,7,1, 10,18,0, 10,18,1, 11,0,0, 11,1,0, 11,12,0, 11,17,0, 12,0,1, 12,11,1, 13,21,0, 13,22,0, 14,14,0, 14,14,1, 16,18,1, 17,0,0, 17,0,1, 17,11,1, 18,5,0, 18,10,0, 18,10,1, 18,16,0, 18,16,1, 19,9,1, 21,7,1, 21,13,1, 22,1,1, 22,7,1, 22,13,1, // Length and number of words of that length 4, 64, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,7,0, 0,13,0, 0,18,0, 1,0,1, 2,0,1, 2,10,0, 3,4,0, 3,15,1, 4,14,0, 4,14,1, 4,19,0, 4,19,1, 5,13,1, 5,18,0, 6,6,0, 6,6,1, 6,12,0, 6,12,1, 6,17,0, 6,17,1, 7,0,1, 7,11,0, 7,16,0, 8,10,1, 8,15,1, 9,14,0, 9,19,1, 10,8,0, 10,13,1, 11,7,1, 11,12,1, 12,6,0, 12,6,1, 12,11,0, 13,0,1, 13,5,0, 13,10,0, 13,16,0, 14,4,0, 14,4,1, 14,9,1, 15,3,0, 15,8,0, 15,19,1, 16,2,1, 16,7,1, 16,13,1, 16,18,0, 17,6,1, 17,12,0, 18,0,1, 18,5,1, 19,4,0, 19,4,1, 19,9,0, 19,15,0, 19,21,0, 19,22,0, 20,19,1, 21,19,1, 22,19,1, // Length and number of words of that length 3, 16, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 0,14,0, 0,19,0, 3,16,0, 3,20,1, 8,0,1, 8,20,1, 10,3,1, 12,17,1, 14,0,1, 14,20,1, 17,6,0, 19,0,1, 20,3,0, 20,8,0, 20,14,0, // End marker 0 }; /* * Name: 23.08, 23 x 23 * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ * _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ * * *) * (_ _ _ * _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _) * (* * * _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ * _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ * _ _ _ _ * _ _ _ _ * _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) */ const int g47[] = { // Width and height of crossword grid 23, 23, // Number of black fields 75, // Black field coordinates 0,7, 0,15, 1,7, 1,15, 2,7, 2,15, 3,3, 3,8, 3,13, 3,19, 4,4, 4,12, 4,18, 5,5, 5,10, 5,17, 6,6, 6,11, 6,16, 7,0, 7,1, 7,2, 7,9, 7,15, 7,20, 7,21, 7,22, 8,3, 8,8, 8,14, 9,7, 9,13, 9,19, 10,5, 10,12, 10,18, 11,6, 11,11, 11,16, 12,4, 12,10, 12,17, 13,3, 13,9, 13,15, 14,8, 14,14, 14,19, 15,0, 15,1, 15,2, 15,7, 15,13, 15,20, 15,21, 15,22, 16,6, 16,11, 16,16, 17,5, 17,12, 17,17, 18,4, 18,10, 18,18, 19,3, 19,9, 19,14, 19,19, 20,7, 20,15, 21,7, 21,15, 22,7, 22,15, // Length and number of words of that length 8, 4, // Coordinates where words start and direction (0 = horizontal) 0,14,0, 8,15,1, 14,0,1, 15,8,0, // Length and number of words of that length 7, 44, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,8,1, 0,9,0, 0,16,1, 0,20,0, 0,21,0, 0,22,0, 1,0,1, 1,8,1, 1,16,1, 2,0,1, 2,8,1, 2,16,1, 4,5,1, 5,4,0, 8,0,0, 8,1,0, 8,2,0, 8,20,0, 8,21,0, 8,22,0, 9,0,1, 11,18,0, 13,16,1, 16,0,0, 16,1,0, 16,2,0, 16,13,0, 16,20,0, 16,21,0, 16,22,0, 18,11,1, 20,0,1, 20,8,1, 20,16,1, 21,0,1, 21,8,1, 21,16,1, 22,0,1, 22,8,1, 22,16,1, // Length and number of words of that length 6, 24, // Coordinates where words start and direction (0 = horizontal) 0,6,0, 0,11,0, 0,16,0, 3,7,0, 5,11,1, 6,0,1, 6,10,0, 6,17,0, 6,17,1, 7,3,1, 10,6,1, 11,0,1, 11,5,0, 11,12,0, 11,17,1, 12,11,1, 14,15,0, 15,14,1, 16,0,1, 16,17,1, 17,6,0, 17,6,1, 17,11,0, 17,16,0, // Length and number of words of that length 5, 40, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,10,0, 0,17,0, 3,14,1, 4,13,0, 4,13,1, 4,19,0, 5,0,1, 5,12,0, 5,18,0, 5,18,1, 7,10,1, 8,9,0, 8,9,1, 8,15,0, 9,8,0, 9,8,1, 9,14,0, 9,14,1, 10,0,1, 10,7,0, 10,13,0, 10,13,1, 12,5,1, 12,18,1, 13,4,0, 13,4,1, 13,10,0, 13,10,1, 14,3,0, 14,9,0, 14,9,1, 15,8,1, 17,0,1, 17,18,1, 18,5,0, 18,5,1, 18,12,0, 18,17,0, 19,4,1, // Length and number of words of that length 4, 44, // Coordinates where words start and direction (0 = horizontal) 0,4,0, 0,12,0, 0,18,0, 3,4,1, 3,9,1, 3,15,0, 4,0,1, 4,3,0, 4,8,0, 4,19,1, 5,6,1, 6,5,0, 6,7,1, 6,12,1, 7,6,0, 7,11,0, 7,16,0, 7,16,1, 8,4,1, 9,3,0, 10,19,0, 10,19,1, 11,7,1, 11,12,1, 12,0,1, 12,6,0, 12,11,0, 12,16,0, 13,17,0, 14,15,1, 15,3,1, 15,14,0, 15,19,0, 16,7,0, 16,7,1, 16,12,1, 17,13,1, 18,0,1, 18,19,1, 19,4,0, 19,10,0, 19,10,1, 19,15,1, 19,18,0, // Length and number of words of that length 3, 16, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,8,0, 0,13,0, 0,19,0, 3,0,1, 3,20,1, 8,0,1, 9,20,1, 13,0,1, 14,20,1, 19,0,1, 19,20,1, 20,3,0, 20,9,0, 20,14,0, 20,19,0, // End marker 0 }; /* * Name: 23.09, 23 x 23 * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ * _ _ _ * _ _ _ _ _ * _ _ _) * (* * * _ _ _ _ _ * _ _ _ _ _ * _ _ _ * _ _ _ *) * (_ _ _ * _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _) * (* * _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ * *) * (_ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ * _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ * _ _ _) * (* _ _ _ * _ _ _ * _ _ _ _ _ * _ _ _ _ _ * * *) * (_ _ _ * _ _ _ _ _ * _ _ _ * _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) */ const int g48[] = { // Width and height of crossword grid 23, 23, // Number of black fields 76, // Black field coordinates 0,5, 0,11, 0,17, 1,5, 1,11, 2,5, 3,6, 3,12, 3,18, 4,3, 4,9, 4,13, 4,17, 5,0, 5,4, 5,8, 5,14, 5,20, 5,21, 5,22, 6,7, 6,15, 6,19, 7,6, 7,10, 7,16, 8,5, 8,11, 8,17, 9,4, 9,12, 9,18, 10,3, 10,9, 10,15, 11,0, 11,1, 11,8, 11,14, 11,21, 11,22, 12,7, 12,13, 12,19, 13,4, 13,10, 13,18, 14,5, 14,11, 14,17, 15,6, 15,12, 15,16, 16,3, 16,7, 16,15, 17,0, 17,1, 17,2, 17,8, 17,14, 17,18, 17,22, 18,5, 18,9, 18,13, 18,19, 19,4, 19,10, 19,16, 20,17, 21,11, 21,17, 22,5, 22,11, 22,17, // Length and number of words of that length 17, 4, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 2,6,1, 6,20,0, 20,0,1, // Length and number of words of that length 11, 4, // Coordinates where words start and direction (0 = horizontal) 0,1,0, 1,12,1, 12,21,0, 21,0,1, // Length and number of words of that length 7, 16, // Coordinates where words start and direction (0 = horizontal) 0,10,0, 0,16,0, 5,13,0, 6,0,1, 6,8,1, 8,6,0, 8,16,0, 9,5,1, 10,16,1, 11,9,0, 12,0,1, 13,11,1, 16,6,0, 16,8,1, 16,12,0, 16,16,1, // Length and number of words of that length 6, 16, // Coordinates where words start and direction (0 = horizontal) 0,7,0, 0,15,0, 0,19,0, 2,11,0, 3,0,1, 7,0,1, 7,17,1, 11,2,1, 11,15,1, 15,0,1, 15,11,0, 15,17,1, 17,3,0, 17,7,0, 17,15,0, 19,17,1, // Length and number of words of that length 5, 86, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,4,0, 0,6,1, 0,8,0, 0,12,1, 0,14,0, 0,18,1, 0,20,0, 0,21,0, 0,22,0, 1,0,1, 1,6,1, 2,0,1, 3,5,0, 3,7,1, 3,13,1, 4,4,1, 4,12,0, 4,18,0, 4,18,1, 5,3,0, 5,9,0, 5,9,1, 5,15,1, 6,0,0, 6,8,0, 6,14,0, 6,21,0, 6,22,0, 7,7,0, 7,11,1, 7,19,0, 8,0,1, 8,6,1, 8,10,0, 8,12,1, 8,18,1, 9,5,0, 9,11,0, 9,13,1, 9,17,0, 10,4,1, 10,10,1, 10,12,0, 11,3,0, 11,9,1, 11,15,0, 12,0,0, 12,1,0, 12,8,0, 12,8,1, 12,14,0, 12,14,1, 12,22,0, 13,5,1, 13,13,0, 13,19,0, 14,0,1, 14,4,0, 14,6,1, 14,10,0, 14,12,1, 14,18,1, 15,7,1, 15,17,0, 17,3,1, 17,9,1, 18,0,0, 18,0,1, 18,1,0, 18,2,0, 18,8,0, 18,14,0, 18,14,1, 18,18,0, 18,22,0, 19,5,1, 19,11,1, 20,18,1, 21,12,1, 21,18,1, 22,0,1, 22,6,1, 22,12,1, 22,18,1, // Length and number of words of that length 4, 12, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,9,0, 0,13,0, 3,19,1, 9,0,1, 9,19,1, 13,0,1, 13,19,1, 19,0,1, 19,9,0, 19,13,0, 19,19,0, // Length and number of words of that length 3, 36, // Coordinates where words start and direction (0 = horizontal) 0,6,0, 0,12,0, 0,18,0, 1,17,0, 4,0,1, 4,6,0, 4,10,1, 4,14,1, 5,1,1, 5,5,1, 5,17,0, 6,4,0, 6,16,1, 6,20,1, 7,7,1, 7,15,0, 10,0,1, 10,4,0, 10,18,0, 12,20,1, 13,7,0, 14,18,0, 15,5,0, 15,13,1, 16,0,1, 16,4,1, 16,16,0, 17,15,1, 17,19,1, 18,6,1, 18,10,1, 18,20,1, 19,5,0, 20,4,0, 20,10,0, 20,16,0, // End marker 0 }; /* * Name: 23.10, 23 x 23 * (_ _ _ _ _ _ * _ _ _ _ _ _ * _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _) * (_ _ _ * _ _ _ _ _ _ _ _ * _ _ _ _ _ _ * _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ *) * (* * _ _ _ _ * _ _ _ _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ * _ _ _ * _ _ _ _ _ _ * * *) * (_ _ _ _ _ * _ _ _ _ _ _ * _ _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ _ * _ _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ _ * _ _ _ _ _ _ * _ _ _ _ _) * (* * * _ _ _ _ _ _ * _ _ _ * _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _ _ _ _ * _ _ _ _ * *) * (* _ _ _ * _ _ _ _ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _ * _ _ _ _ _) * (_ _ _ * _ _ _ _ _ _ * _ _ _ _ _ _ _ _ * _ _ _) * (_ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ _ _ _ _ _ * _ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ * _ _ _ _ _ _ * _ _ _ _ _ _) */ const int g49[] = { // Width and height of crossword grid 23, 23, // Number of black fields 67, // Black field coordinates 0,6, 0,13, 0,17, 1,6, 1,13, 2,13, 3,3, 3,12, 3,19, 4,5, 4,11, 4,17, 5,4, 5,10, 5,18, 5,22, 6,0, 6,1, 6,6, 6,16, 7,7, 7,15, 8,8, 8,14, 9,9, 9,13, 9,20, 9,21, 9,22, 10,5, 10,12, 10,19, 11,4, 11,11, 11,18, 12,3, 12,10, 12,17, 13,0, 13,1, 13,2, 13,9, 13,13, 14,8, 14,14, 15,7, 15,15, 16,6, 16,16, 16,21, 16,22, 17,0, 17,4, 17,12, 17,18, 18,5, 18,11, 18,17, 19,3, 19,10, 19,19, 20,9, 21,9, 21,16, 22,5, 22,9, 22,16, // Length and number of words of that length 13, 4, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 2,0,1, 10,20,0, 20,10,1, // Length and number of words of that length 9, 16, // Coordinates where words start and direction (0 = horizontal) 0,9,0, 0,20,0, 0,21,0, 1,14,1, 2,14,1, 6,7,1, 7,6,0, 7,16,0, 9,0,1, 13,14,1, 14,1,0, 14,2,0, 14,13,0, 16,7,1, 20,0,1, 21,0,1, // Length and number of words of that length 8, 12, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 0,14,0, 3,4,1, 4,3,0, 8,0,1, 8,15,1, 11,19,0, 14,0,1, 14,15,1, 15,8,0, 15,14,0, 19,11,1, // Length and number of words of that length 7, 16, // Coordinates where words start and direction (0 = horizontal) 0,7,0, 0,15,0, 5,11,1, 5,17,0, 7,0,1, 7,8,1, 7,16,1, 8,7,0, 8,15,0, 11,5,0, 15,0,1, 15,8,1, 15,16,1, 16,7,0, 16,15,0, 17,5,1, // Length and number of words of that length 6, 40, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,7,1, 0,16,0, 1,0,1, 1,7,1, 3,13,0, 3,13,1, 4,12,0, 4,19,0, 5,11,0, 6,10,0, 6,17,1, 7,0,0, 7,1,0, 9,14,1, 10,6,1, 10,13,1, 10,21,0, 10,22,0, 11,5,1, 11,12,0, 11,12,1, 12,4,1, 12,11,0, 12,11,1, 13,3,0, 13,3,1, 13,10,0, 14,9,0, 16,0,1, 17,6,0, 17,21,0, 17,22,0, 19,4,1, 21,10,1, 21,17,1, 22,10,1, 22,17,1, // Length and number of words of that length 5, 32, // Coordinates where words start and direction (0 = horizontal) 0,4,0, 0,10,0, 0,18,0, 0,18,1, 0,22,0, 4,0,1, 4,6,1, 4,12,1, 4,18,1, 5,5,0, 5,5,1, 6,4,0, 6,18,0, 8,9,1, 9,8,0, 9,14,0, 10,0,1, 12,4,0, 12,18,0, 12,18,1, 13,17,0, 14,9,1, 17,13,1, 18,0,0, 18,0,1, 18,4,0, 18,6,1, 18,12,0, 18,12,1, 18,18,0, 18,18,1, 22,0,1, // Length and number of words of that length 4, 12, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,11,0, 2,6,0, 5,0,1, 6,2,1, 11,0,1, 11,19,1, 16,17,1, 17,16,0, 17,19,1, 19,11,0, 19,17,0, // Length and number of words of that length 3, 24, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,12,0, 0,14,1, 0,19,0, 1,17,0, 3,0,1, 3,20,1, 5,19,1, 6,22,0, 9,10,1, 10,9,0, 10,13,0, 10,20,1, 12,0,1, 13,10,1, 14,0,0, 17,1,1, 19,0,1, 19,5,0, 19,20,1, 20,3,0, 20,10,0, 20,19,0, 22,6,1, // End marker 0 }; /* * Name: puzzle01, 2 x 2 * (_ *) * (_ _) */ const int g50[] = { // Width and height of crossword grid 2, 2, // Number of black fields 1, // Black field coordinates 1,0, // Length and number of words of that length 2, 2, // Coordinates where words start and direction (0 = horizontal) 0,0,1, 0,1,0, // Length and number of words of that length 1, 2, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 1,1,1, // End marker 0 }; /* * Name: puzzle02, 3 x 3 * (* _ _) * (_ _ _) * (_ _ _) */ const int g51[] = { // Width and height of crossword grid 3, 3, // Number of black fields 1, // Black field coordinates 0,0, // Length and number of words of that length 3, 4, // Coordinates where words start and direction (0 = horizontal) 0,1,0, 0,2,0, 1,0,1, 2,0,1, // Length and number of words of that length 2, 2, // Coordinates where words start and direction (0 = horizontal) 0,1,1, 1,0,0, // End marker 0 }; /* * Name: puzzle03, 4 x 4 * (_ _ _ *) * (_ _ _ _) * (_ _ _ _) * (* _ _ _) */ const int g52[] = { // Width and height of crossword grid 4, 4, // Number of black fields 2, // Black field coordinates 0,3, 3,0, // Length and number of words of that length 4, 4, // Coordinates where words start and direction (0 = horizontal) 0,1,0, 0,2,0, 1,0,1, 2,0,1, // Length and number of words of that length 3, 4, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 1,3,0, 3,1,1, // End marker 0 }; /* * Name: puzzle04, 5 x 5 * (_ _ _ * *) * (_ _ _ _ *) * (_ _ _ _ _) * (* _ _ _ _) * (* * _ _ _) */ const int g53[] = { // Width and height of crossword grid 5, 5, // Number of black fields 6, // Black field coordinates 0,3, 0,4, 1,4, 3,0, 4,0, 4,1, // Length and number of words of that length 5, 2, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 2,0,1, // Length and number of words of that length 4, 4, // Coordinates where words start and direction (0 = horizontal) 0,1,0, 1,0,1, 1,3,0, 3,1,1, // Length and number of words of that length 3, 4, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 2,4,0, 4,2,1, // End marker 0 }; /* * Name: puzzle05, 5 x 5 * (_ _ _ _ *) * (_ _ _ * _) * (_ _ _ _ _) * (_ * _ _ _) * (* _ _ _ _) */ const int g54[] = { // Width and height of crossword grid 5, 5, // Number of black fields 4, // Black field coordinates 0,4, 1,3, 3,1, 4,0, // Length and number of words of that length 5, 2, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 2,0,1, // Length and number of words of that length 4, 4, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 1,4,0, 4,1,1, // Length and number of words of that length 3, 4, // Coordinates where words start and direction (0 = horizontal) 0,1,0, 1,0,1, 2,3,0, 3,2,1, // Length and number of words of that length 1, 4, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 1,4,1, 3,0,1, 4,1,0, // End marker 0 }; /* * Name: puzzle06, 5 x 5 * (_ _ _ _ _) * (_ _ _ * _) * (_ _ _ _ _) * (_ * _ _ _) * (_ _ _ _ _) */ const int g55[] = { // Width and height of crossword grid 5, 5, // Number of black fields 2, // Black field coordinates 1,3, 3,1, // Length and number of words of that length 5, 6, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,2,0, 0,4,0, 2,0,1, 4,0,1, // Length and number of words of that length 3, 4, // Coordinates where words start and direction (0 = horizontal) 0,1,0, 1,0,1, 2,3,0, 3,2,1, // Length and number of words of that length 1, 4, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 1,4,1, 3,0,1, 4,1,0, // End marker 0 }; /* * Name: puzzle07, 6 x 6 * (_ _ _ _ _ *) * (_ * _ _ _ _) * (_ _ _ * _ _) * (_ _ * _ _ _) * (_ _ _ _ * _) * (* _ _ _ _ _) */ const int g56[] = { // Width and height of crossword grid 6, 6, // Number of black fields 6, // Black field coordinates 0,5, 1,1, 2,3, 3,2, 4,4, 5,0, // Length and number of words of that length 5, 4, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 1,5,0, 5,1,1, // Length and number of words of that length 4, 4, // Coordinates where words start and direction (0 = horizontal) 0,4,0, 1,2,1, 2,1,0, 4,0,1, // Length and number of words of that length 3, 4, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 2,0,1, 3,3,0, 3,3,1, // Length and number of words of that length 2, 4, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 2,4,1, 3,0,1, 4,2,0, // Length and number of words of that length 1, 4, // Coordinates where words start and direction (0 = horizontal) 0,1,0, 1,0,1, 4,5,1, 5,4,0, // End marker 0 }; /* * Name: puzzle08, 7 x 7 * (_ _ _ _ * _ _) * (_ _ _ * _ _ _) * (_ _ * _ _ _ *) * (_ _ _ _ _ _ _) * (* _ _ _ * _ _) * (_ _ _ * _ _ _) * (_ _ * _ _ _ _) */ const int g57[] = { // Width and height of crossword grid 7, 7, // Number of black fields 8, // Black field coordinates 0,4, 2,2, 2,6, 3,1, 3,5, 4,0, 4,4, 6,2, // Length and number of words of that length 7, 3, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 1,0,1, 5,0,1, // Length and number of words of that length 4, 4, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 3,6,0, 6,3,1, // Length and number of words of that length 3, 9, // Coordinates where words start and direction (0 = horizontal) 0,1,0, 0,5,0, 1,4,0, 2,3,1, 3,2,0, 3,2,1, 4,1,0, 4,1,1, 4,5,0, // Length and number of words of that length 2, 8, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 0,5,1, 0,6,0, 2,0,1, 4,5,1, 5,0,0, 5,4,0, 6,0,1, // Length and number of words of that length 1, 2, // Coordinates where words start and direction (0 = horizontal) 3,0,1, 3,6,1, // End marker 0 }; /* * Name: puzzle09, 7 x 7 * (* * _ _ _ * *) * (* _ _ _ _ _ *) * (_ _ _ * _ _ _) * (_ _ _ _ _ _ _) * (_ _ _ * _ _ _) * (* _ _ _ _ _ *) * (* * _ _ _ * *) */ const int g58[] = { // Width and height of crossword grid 7, 7, // Number of black fields 14, // Black field coordinates 0,0, 0,1, 0,5, 0,6, 1,0, 1,6, 3,2, 3,4, 5,0, 5,6, 6,0, 6,1, 6,5, 6,6, // Length and number of words of that length 7, 3, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 2,0,1, 4,0,1, // Length and number of words of that length 5, 4, // Coordinates where words start and direction (0 = horizontal) 1,1,0, 1,1,1, 1,5,0, 5,1,1, // Length and number of words of that length 3, 8, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 0,2,1, 0,4,0, 2,0,0, 2,6,0, 4,2,0, 4,4,0, 6,2,1, // Length and number of words of that length 2, 2, // Coordinates where words start and direction (0 = horizontal) 3,0,1, 3,5,1, // Length and number of words of that length 1, 1, // Coordinates where words start and direction (0 = horizontal) 3,3,1, // End marker 0 }; /* * Name: puzzle10, 7 x 7 * (_ _ _ * _ _ _) * (_ _ _ * _ _ _) * (_ _ _ _ _ _ _) * (* * _ * _ * *) * (_ _ _ _ _ _ _) * (_ _ _ * _ _ _) * (_ _ _ * _ _ _) */ const int g59[] = { // Width and height of crossword grid 7, 7, // Number of black fields 9, // Black field coordinates 0,3, 1,3, 3,0, 3,1, 3,3, 3,5, 3,6, 5,3, 6,3, // Length and number of words of that length 7, 4, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 0,4,0, 2,0,1, 4,0,1, // Length and number of words of that length 3, 16, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,4,1, 0,5,0, 0,6,0, 1,0,1, 1,4,1, 4,0,0, 4,1,0, 4,5,0, 4,6,0, 5,0,1, 5,4,1, 6,0,1, 6,4,1, // Length and number of words of that length 1, 4, // Coordinates where words start and direction (0 = horizontal) 2,3,0, 3,2,1, 3,4,1, 4,3,0, // End marker 0 }; /* * Name: puzzle11, 7 x 7 * (* * _ _ _ _ *) * (* _ _ _ _ _ _) * (_ _ _ * _ _ _) * (_ _ _ * _ _ _) * (_ _ _ * _ _ _) * (_ _ _ _ _ _ *) * (* _ _ _ _ * *) */ const int g60[] = { // Width and height of crossword grid 7, 7, // Number of black fields 11, // Black field coordinates 0,0, 0,1, 0,6, 1,0, 3,2, 3,3, 3,4, 5,6, 6,0, 6,5, 6,6, // Length and number of words of that length 7, 2, // Coordinates where words start and direction (0 = horizontal) 2,0,1, 4,0,1, // Length and number of words of that length 6, 4, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 1,1,0, 1,1,1, 5,0,1, // Length and number of words of that length 4, 4, // Coordinates where words start and direction (0 = horizontal) 0,2,1, 1,6,0, 2,0,0, 6,1,1, // Length and number of words of that length 3, 6, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 0,3,0, 0,4,0, 4,2,0, 4,3,0, 4,4,0, // Length and number of words of that length 2, 2, // Coordinates where words start and direction (0 = horizontal) 3,0,1, 3,5,1, // End marker 0 }; /* * Name: puzzle12, 8 x 8 * (_ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _) * (* * * _ _ _ _ _) * (_ _ _ _ _ * * *) * (_ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _) */ const int g61[] = { // Width and height of crossword grid 8, 8, // Number of black fields 12, // Black field coordinates 0,3, 1,3, 2,3, 3,5, 3,6, 3,7, 4,0, 4,1, 4,2, 5,4, 6,4, 7,4, // Length and number of words of that length 5, 4, // Coordinates where words start and direction (0 = horizontal) 0,4,0, 3,0,1, 3,3,0, 4,3,1, // Length and number of words of that length 4, 12, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,1,0, 0,2,0, 0,4,1, 1,4,1, 2,4,1, 4,5,0, 4,6,0, 4,7,0, 5,0,1, 6,0,1, 7,0,1, // Length and number of words of that length 3, 12, // Coordinates where words start and direction (0 = horizontal) 0,0,1, 0,5,0, 0,6,0, 0,7,0, 1,0,1, 2,0,1, 5,0,0, 5,1,0, 5,2,0, 5,5,1, 6,5,1, 7,5,1, // End marker 0 }; /* * Name: puzzle13, 9 x 9 * (_ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _) * (_ _ _ * * * _ _ _) * (_ _ _ _ _ _ _ _ _) * (* * * _ _ _ * * *) * (_ _ _ _ _ _ _ _ _) * (_ _ _ * * * _ _ _) * (_ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _) */ const int g62[] = { // Width and height of crossword grid 9, 9, // Number of black fields 16, // Black field coordinates 0,4, 1,4, 2,4, 3,2, 3,6, 4,0, 4,1, 4,2, 4,6, 4,7, 4,8, 5,2, 5,6, 6,4, 7,4, 8,4, // Length and number of words of that length 9, 2, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,5,0, // Length and number of words of that length 4, 20, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,5,1, 0,7,0, 0,8,0, 1,0,1, 1,5,1, 2,0,1, 2,5,1, 5,0,0, 5,1,0, 5,7,0, 5,8,0, 6,0,1, 6,5,1, 7,0,1, 7,5,1, 8,0,1, 8,5,1, // Length and number of words of that length 3, 8, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 0,6,0, 3,3,1, 3,4,0, 4,3,1, 5,3,1, 6,2,0, 6,6,0, // Length and number of words of that length 2, 4, // Coordinates where words start and direction (0 = horizontal) 3,0,1, 3,7,1, 5,0,1, 5,7,1, // End marker 0 }; /* * Name: puzzle14, 10 x 10 * (* * * _ _ _ _ * * *) * (* * _ _ _ _ _ * * *) * (* _ _ _ _ _ _ _ * *) * (_ _ _ _ _ * * _ _ _) * (_ _ _ _ * * * _ _ _) * (_ _ _ * * * _ _ _ _) * (_ _ _ * * _ _ _ _ _) * (* * _ _ _ _ _ _ _ *) * (* * * _ _ _ _ _ * *) * (* * * _ _ _ _ * * *) */ const int g63[] = { // Width and height of crossword grid 10, 10, // Number of black fields 38, // Black field coordinates 0,0, 0,1, 0,2, 0,7, 0,8, 0,9, 1,0, 1,1, 1,7, 1,8, 1,9, 2,0, 2,8, 2,9, 3,5, 3,6, 4,4, 4,5, 4,6, 5,3, 5,4, 5,5, 6,3, 6,4, 7,0, 7,1, 7,9, 8,0, 8,1, 8,2, 8,8, 8,9, 9,0, 9,1, 9,2, 9,7, 9,8, 9,9, // Length and number of words of that length 7, 4, // Coordinates where words start and direction (0 = horizontal) 1,2,0, 2,1,1, 2,7,0, 7,2,1, // Length and number of words of that length 5, 8, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 1,2,1, 2,1,0, 3,0,1, 3,8,0, 5,6,0, 6,5,1, 8,3,1, // Length and number of words of that length 4, 8, // Coordinates where words start and direction (0 = horizontal) 0,3,1, 0,4,0, 3,0,0, 3,9,0, 4,0,1, 5,6,1, 6,5,0, 9,3,1, // Length and number of words of that length 3, 8, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,6,0, 3,7,1, 4,7,1, 5,0,1, 6,0,1, 7,3,0, 7,4,0, // End marker 0 }; /* * Name: puzzle15, 11 x 11 * (_ _ _ _ * * * _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _) * (_ _ _ * _ _ _ * _ _ _) * (* _ _ _ _ _ * _ _ _ *) * (* * * _ _ _ _ _ * * *) * (* _ _ _ * _ _ _ _ _ *) * (_ _ _ * _ _ _ * _ _ _) * (_ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ _ * _ _ _ _ _) * (_ _ _ _ * * * _ _ _ _) */ const int g64[] = { // Width and height of crossword grid 11, 11, // Number of black fields 26, // Black field coordinates 0,4, 0,5, 0,6, 1,5, 2,5, 3,3, 3,7, 4,0, 4,6, 4,10, 5,0, 5,1, 5,2, 5,8, 5,9, 5,10, 6,0, 6,4, 6,10, 7,3, 7,7, 8,5, 9,5, 10,4, 10,5, 10,6, // Length and number of words of that length 5, 22, // Coordinates where words start and direction (0 = horizontal) 0,1,0, 0,2,0, 0,8,0, 0,9,0, 1,0,1, 1,4,0, 1,6,1, 2,0,1, 2,6,1, 3,5,0, 4,1,1, 5,3,1, 5,6,0, 6,1,0, 6,2,0, 6,5,1, 6,8,0, 6,9,0, 8,0,1, 8,6,1, 9,0,1, 9,6,1, // Length and number of words of that length 4, 8, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,7,1, 0,10,0, 7,0,0, 7,10,0, 10,0,1, 10,7,1, // Length and number of words of that length 3, 16, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,7,0, 1,6,0, 3,0,1, 3,4,1, 3,8,1, 4,3,0, 4,7,0, 4,7,1, 6,1,1, 7,0,1, 7,4,0, 7,4,1, 7,8,1, 8,3,0, 8,7,0, // End marker 0 }; /* * Name: puzzle16, 13 x 13 * (_ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ * _ _ _ * * *) * (* * * _ _ _ * _ _ _ _ _ _) * (_ _ _ _ _ * _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ * _ _ _ _ _) * (_ _ _ _ _ _ * _ _ _ * * *) * (* * * _ _ _ * _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ * _ _ _) */ const int g65[] = { // Width and height of crossword grid 13, 13, // Number of black fields 34, // Black field coordinates 0,4, 0,9, 1,4, 1,9, 2,4, 2,9, 3,0, 3,1, 3,2, 3,7, 4,6, 4,10, 4,11, 4,12, 5,5, 6,3, 6,4, 6,8, 6,9, 7,7, 8,0, 8,1, 8,2, 8,6, 9,5, 9,10, 9,11, 9,12, 10,3, 10,8, 11,3, 11,8, 12,3, 12,8, // Length and number of words of that length 7, 2, // Coordinates where words start and direction (0 = horizontal) 5,6,1, 7,0,1, // Length and number of words of that length 6, 6, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,8,0, 4,0,1, 7,4,0, 7,9,0, 8,7,1, // Length and number of words of that length 5, 6, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 3,8,1, 5,0,1, 7,8,1, 8,7,0, 9,0,1, // Length and number of words of that length 4, 28, // Coordinates where words start and direction (0 = horizontal) 0,0,1, 0,5,1, 0,6,0, 0,10,0, 0,11,0, 0,12,0, 1,0,1, 1,5,1, 2,0,1, 2,5,1, 3,3,1, 4,0,0, 4,1,0, 4,2,0, 5,10,0, 5,11,0, 5,12,0, 9,0,0, 9,1,0, 9,2,0, 9,6,0, 9,6,1, 10,4,1, 10,9,1, 11,4,1, 11,9,1, 12,4,1, 12,9,1, // Length and number of words of that length 3, 26, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,1,0, 0,2,0, 0,7,0, 0,10,1, 1,10,1, 2,10,1, 3,4,0, 3,9,0, 4,7,0, 4,7,1, 5,6,0, 6,0,1, 6,5,0, 6,5,1, 6,10,1, 7,3,0, 7,8,0, 8,3,1, 10,0,1, 10,5,0, 10,10,0, 10,11,0, 10,12,0, 11,0,1, 12,0,1, // End marker 0 }; /* * Name: puzzle17, 15 x 15 * (_ _ _ * _ _ _ * _ _ _ * _ _ _) * (_ _ _ * _ _ _ * _ _ _ * _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (* * _ _ _ _ * _ _ _ _ _ _ * *) * (_ _ _ _ _ * _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ * _ _ _) * (* * * _ _ _ * * * _ _ _ * * *) * (_ _ _ * _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ * _ _ _ _ _) * (* * _ _ _ _ _ _ * _ _ _ _ * *) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ * _ _ _ * _ _ _ * _ _ _) * (_ _ _ * _ _ _ * _ _ _ * _ _ _) */ const int g66[] = { // Width and height of crossword grid 15, 15, // Number of black fields 45, // Black field coordinates 0,3, 0,7, 0,11, 1,3, 1,7, 1,11, 2,7, 3,0, 3,1, 3,8, 3,13, 3,14, 4,5, 4,9, 5,4, 5,10, 6,3, 6,7, 7,0, 7,1, 7,2, 7,6, 7,7, 7,8, 7,12, 7,13, 7,14, 8,7, 8,11, 9,4, 9,10, 10,5, 10,9, 11,0, 11,1, 11,6, 11,13, 11,14, 12,7, 13,3, 13,7, 13,11, 14,3, 14,7, 14,11, // Length and number of words of that length 7, 12, // Coordinates where words start and direction (0 = horizontal) 0,2,0, 0,6,0, 0,12,0, 2,0,1, 2,8,1, 6,8,1, 8,0,1, 8,2,0, 8,8,0, 8,12,0, 12,0,1, 12,8,1, // Length and number of words of that length 6, 4, // Coordinates where words start and direction (0 = horizontal) 2,11,0, 3,2,1, 7,3,0, 11,7,1, // Length and number of words of that length 5, 12, // Coordinates where words start and direction (0 = horizontal) 0,4,0, 0,10,0, 4,0,1, 4,10,1, 5,5,0, 5,5,1, 5,9,0, 9,5,1, 10,0,1, 10,4,0, 10,10,0, 10,10,1, // Length and number of words of that length 4, 12, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,9,0, 2,3,0, 3,9,1, 5,0,1, 5,11,1, 9,0,1, 9,11,0, 9,11,1, 11,2,1, 11,5,0, 11,9,0, // Length and number of words of that length 3, 48, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,4,1, 0,8,0, 0,8,1, 0,12,1, 0,13,0, 0,14,0, 1,0,1, 1,4,1, 1,8,1, 1,12,1, 3,7,0, 4,0,0, 4,1,0, 4,6,1, 4,8,0, 4,13,0, 4,14,0, 6,0,1, 6,4,0, 6,4,1, 6,10,0, 7,3,1, 7,9,1, 8,0,0, 8,1,0, 8,6,0, 8,8,1, 8,12,1, 8,13,0, 8,14,0, 9,7,0, 10,6,1, 12,0,0, 12,1,0, 12,6,0, 12,13,0, 12,14,0, 13,0,1, 13,4,1, 13,8,1, 13,12,1, 14,0,1, 14,4,1, 14,8,1, 14,12,1, // End marker 0 }; /* * Name: puzzle18, 15 x 15 * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ * * _ _ _ _) * (* * * * _ _ _ * * _ _ _ * * *) * (_ _ _ * _ _ _ * _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ * * _ _ _ * * _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ * _ _ _ * _ _ _) * (* * * _ _ _ * * _ _ _ * * * *) * (_ _ _ _ * * _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) */ const int g67[] = { // Width and height of crossword grid 15, 15, // Number of black fields 48, // Black field coordinates 0,4, 0,10, 1,4, 1,10, 2,4, 2,10, 3,4, 3,5, 3,9, 4,0, 4,1, 4,2, 4,6, 4,7, 4,11, 4,12, 4,13, 4,14, 5,3, 5,7, 5,11, 6,10, 7,4, 7,5, 7,9, 7,10, 8,4, 9,3, 9,7, 9,11, 10,0, 10,1, 10,2, 10,3, 10,7, 10,8, 10,12, 10,13, 10,14, 11,5, 11,9, 11,10, 12,4, 12,10, 13,4, 13,10, 14,4, 14,10, // Length and number of words of that length 10, 4, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 5,6,0, 6,0,1, 8,5,1, // Length and number of words of that length 5, 16, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,5,1, 1,5,1, 2,5,1, 3,10,1, 5,0,0, 5,1,0, 5,2,0, 5,12,0, 5,13,0, 5,14,0, 10,11,0, 11,0,1, 12,5,1, 13,5,1, 14,5,1, // Length and number of words of that length 4, 36, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,6,0, 0,7,0, 0,11,0, 0,11,1, 0,12,0, 0,13,0, 0,14,0, 1,0,1, 1,11,1, 2,0,1, 2,11,1, 3,0,1, 6,11,1, 7,0,1, 7,11,1, 8,0,1, 11,0,0, 11,1,0, 11,2,0, 11,3,0, 11,7,0, 11,8,0, 11,11,1, 11,12,0, 11,13,0, 11,14,0, 12,0,1, 12,11,1, 13,0,1, 13,11,1, 14,0,1, 14,11,1, // Length and number of words of that length 3, 30, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,9,0, 3,6,1, 3,10,0, 4,3,1, 4,4,0, 4,5,0, 4,8,1, 4,9,0, 5,0,1, 5,4,1, 5,8,1, 5,12,1, 6,3,0, 6,7,0, 6,11,0, 7,6,1, 8,5,0, 8,9,0, 8,10,0, 9,0,1, 9,4,0, 9,4,1, 9,8,1, 9,12,1, 10,4,1, 10,9,1, 11,6,1, 12,5,0, 12,9,0, // End marker 0 }; /* * Name: puzzle19, 15 x 15 * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (* * * _ _ _ * _ _ _ _ _ * * *) * (_ _ _ _ _ * _ _ _ * _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ _ * _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ * _ _ _ _ _ _ * _ _ _ _) * (_ _ _ _ _ * _ _ _ * _ _ _ _ _) * (* * * _ _ _ _ _ * _ _ _ * * *) * (_ _ _ _ _ _ _ * _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ _ _ * _ _ _ _) */ const int g68[] = { // Width and height of crossword grid 15, 15, // Number of black fields 38, // Black field coordinates 0,4, 0,10, 1,4, 1,10, 2,4, 2,10, 3,8, 4,0, 4,1, 4,2, 4,6, 4,7, 4,12, 4,13, 4,14, 5,5, 5,9, 6,4, 7,3, 7,11, 8,10, 9,5, 9,9, 10,0, 10,1, 10,2, 10,7, 10,8, 10,12, 10,13, 10,14, 11,6, 12,4, 12,10, 13,4, 13,10, 14,4, 14,10, // Length and number of words of that length 10, 2, // Coordinates where words start and direction (0 = horizontal) 6,5,1, 8,0,1, // Length and number of words of that length 8, 2, // Coordinates where words start and direction (0 = horizontal) 3,0,1, 11,7,1, // Length and number of words of that length 7, 5, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,11,0, 7,4,1, 8,3,0, 8,11,0, // Length and number of words of that length 6, 4, // Coordinates where words start and direction (0 = horizontal) 3,9,1, 4,8,0, 5,6,0, 11,0,1, // Length and number of words of that length 5, 23, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,5,1, 0,9,0, 1,5,1, 2,5,1, 3,10,0, 5,0,0, 5,0,1, 5,1,0, 5,2,0, 5,7,0, 5,10,1, 5,12,0, 5,13,0, 5,14,0, 7,4,0, 9,0,1, 9,10,1, 10,5,0, 10,9,0, 12,5,1, 13,5,1, 14,5,1, // Length and number of words of that length 4, 32, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,6,0, 0,7,0, 0,11,1, 0,12,0, 0,13,0, 0,14,0, 1,0,1, 1,11,1, 2,0,1, 2,11,1, 4,8,1, 6,0,1, 8,11,1, 10,3,1, 11,0,0, 11,1,0, 11,2,0, 11,7,0, 11,8,0, 11,12,0, 11,13,0, 11,14,0, 12,0,1, 12,11,1, 13,0,1, 13,11,1, 14,0,1, 14,11,1, // Length and number of words of that length 3, 12, // Coordinates where words start and direction (0 = horizontal) 0,8,0, 3,4,0, 4,3,1, 5,6,1, 6,5,0, 6,9,0, 7,0,1, 7,12,1, 9,6,1, 9,10,0, 10,9,1, 12,6,0, // End marker 0 }; /* * Name: puzzle20, 9 x 9 * (* * * _ _ _ * * *) * (* * _ _ _ _ _ * *) * (* _ _ _ _ _ _ _ *) * (_ _ _ _ * _ _ _ _) * (_ _ _ * * * _ _ _) * (_ _ _ _ * _ _ _ _) * (* _ _ _ _ _ _ _ *) * (* * _ _ _ _ _ * *) * (* * * _ _ _ * * *) */ const int g69[] = { // Width and height of crossword grid 9, 9, // Number of black fields 29, // Black field coordinates 0,0, 0,1, 0,2, 0,6, 0,7, 0,8, 1,0, 1,1, 1,7, 1,8, 2,0, 2,8, 3,4, 4,3, 4,4, 4,5, 5,4, 6,0, 6,8, 7,0, 7,1, 7,7, 7,8, 8,0, 8,1, 8,2, 8,6, 8,7, 8,8, // Length and number of words of that length 7, 4, // Coordinates where words start and direction (0 = horizontal) 1,2,0, 1,6,0, 2,1,1, 6,1,1, // Length and number of words of that length 5, 4, // Coordinates where words start and direction (0 = horizontal) 1,2,1, 2,1,0, 2,7,0, 7,2,1, // Length and number of words of that length 4, 8, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,5,0, 3,0,1, 3,5,1, 5,0,1, 5,3,0, 5,5,0, 5,5,1, // Length and number of words of that length 3, 8, // Coordinates where words start and direction (0 = horizontal) 0,3,1, 0,4,0, 3,0,0, 3,8,0, 4,0,1, 4,6,1, 6,4,0, 8,3,1, // End marker 0 }; /* * Name: puzzle21, 13 x 13 * (_ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ _ _ _ * _ _ _ _ _ _) * (* * * _ _ _ * _ _ _ * * *) * (_ _ _ _ _ * * * _ _ _ _ _) * (_ _ _ * * * * * * * _ _ _) * (_ _ _ _ _ * * * _ _ _ _ _) * (* * * _ _ _ * _ _ _ * * *) * (_ _ _ _ _ _ * _ _ _ _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _) */ const int g70[] = { // Width and height of crossword grid 13, 13, // Number of black fields 41, // Black field coordinates 0,4, 0,8, 1,4, 1,8, 2,4, 2,8, 3,6, 4,0, 4,1, 4,2, 4,6, 4,10, 4,11, 4,12, 5,5, 5,6, 5,7, 6,3, 6,4, 6,5, 6,6, 6,7, 6,8, 6,9, 7,5, 7,6, 7,7, 8,0, 8,1, 8,2, 8,6, 8,10, 8,11, 8,12, 9,6, 10,4, 10,8, 11,4, 11,8, 12,4, 12,8, // Length and number of words of that length 6, 8, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,9,0, 3,0,1, 3,7,1, 7,3,0, 7,9,0, 9,0,1, 9,7,1, // Length and number of words of that length 5, 8, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,7,0, 5,0,1, 5,8,1, 7,0,1, 7,8,1, 8,5,0, 8,7,0, // Length and number of words of that length 4, 24, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,9,1, 0,10,0, 0,11,0, 0,12,0, 1,0,1, 1,9,1, 2,0,1, 2,9,1, 9,0,0, 9,1,0, 9,2,0, 9,10,0, 9,11,0, 9,12,0, 10,0,1, 10,9,1, 11,0,1, 11,9,1, 12,0,1, 12,9,1, // Length and number of words of that length 3, 24, // Coordinates where words start and direction (0 = horizontal) 0,5,1, 0,6,0, 1,5,1, 2,5,1, 3,4,0, 3,8,0, 4,3,1, 4,7,1, 5,0,0, 5,1,0, 5,2,0, 5,10,0, 5,11,0, 5,12,0, 6,0,1, 6,10,1, 7,4,0, 7,8,0, 8,3,1, 8,7,1, 10,5,1, 10,6,0, 11,5,1, 12,5,1, // End marker 0 }; /* * Name: puzzle22, 13 x 13 * (_ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ _ _ _ _ _ _ _ _ _ _) * (* * * _ _ _ * _ _ _ * * *) * (_ _ _ _ _ * * * _ _ _ _ _) * (_ _ _ _ * * * * * _ _ _ _) * (_ _ _ _ _ * * * _ _ _ _ _) * (* * * _ _ _ * _ _ _ * * *) * (_ _ _ _ _ _ _ _ _ _ _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _) * (_ _ _ _ * _ _ _ * _ _ _ _) */ const int g71[] = { // Width and height of crossword grid 13, 13, // Number of black fields 37, // Black field coordinates 0,4, 0,8, 1,4, 1,8, 2,4, 2,8, 4,0, 4,1, 4,2, 4,6, 4,10, 4,11, 4,12, 5,5, 5,6, 5,7, 6,4, 6,5, 6,6, 6,7, 6,8, 7,5, 7,6, 7,7, 8,0, 8,1, 8,2, 8,6, 8,10, 8,11, 8,12, 10,4, 10,8, 11,4, 11,8, 12,4, 12,8, // Length and number of words of that length 13, 4, // Coordinates where words start and direction (0 = horizontal) 0,3,0, 0,9,0, 3,0,1, 9,0,1, // Length and number of words of that length 5, 8, // Coordinates where words start and direction (0 = horizontal) 0,5,0, 0,7,0, 5,0,1, 5,8,1, 7,0,1, 7,8,1, 8,5,0, 8,7,0, // Length and number of words of that length 4, 28, // Coordinates where words start and direction (0 = horizontal) 0,0,0, 0,0,1, 0,1,0, 0,2,0, 0,6,0, 0,9,1, 0,10,0, 0,11,0, 0,12,0, 1,0,1, 1,9,1, 2,0,1, 2,9,1, 6,0,1, 6,9,1, 9,0,0, 9,1,0, 9,2,0, 9,6,0, 9,10,0, 9,11,0, 9,12,0, 10,0,1, 10,9,1, 11,0,1, 11,9,1, 12,0,1, 12,9,1, // Length and number of words of that length 3, 20, // Coordinates where words start and direction (0 = horizontal) 0,5,1, 1,5,1, 2,5,1, 3,4,0, 3,8,0, 4,3,1, 4,7,1, 5,0,0, 5,1,0, 5,2,0, 5,10,0, 5,11,0, 5,12,0, 7,4,0, 7,8,0, 8,3,1, 8,7,1, 10,5,1, 11,5,1, 12,5,1, // End marker 0 }; const int* grids[] = { &g0[0], &g1[0], &g2[0], &g3[0], &g4[0], &g5[0], &g6[0], &g7[0], &g8[0], &g9[0], &g10[0], &g11[0], &g12[0], &g13[0], &g14[0], &g15[0], &g16[0], &g17[0], &g18[0], &g19[0], &g20[0], &g21[0], &g22[0], &g23[0], &g24[0], &g25[0], &g26[0], &g27[0], &g28[0], &g29[0], &g30[0], &g31[0], &g32[0], &g33[0], &g34[0], &g35[0], &g36[0], &g37[0], &g38[0], &g39[0], &g40[0], &g41[0], &g42[0], &g43[0], &g44[0], &g45[0], &g46[0], &g47[0], &g48[0], &g49[0], &g50[0], &g51[0], &g52[0], &g53[0], &g54[0], &g55[0], &g56[0], &g57[0], &g58[0], &g59[0], &g60[0], &g61[0], &g62[0], &g63[0], &g64[0], &g65[0], &g66[0], &g67[0], &g68[0], &g69[0], &g70[0], &g71[0] }; const unsigned int n_grids = 72; } // STATISTICS: example-any gecode-4.2.1/examples/crowded-chess.cpp0000755000175000010010000003163312166527420017153 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Mikael Lagerkvist * * Copyright: * Christian Schulte, 2001 * Mikael Lagerkvist, 2005 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** The maximum number of knights placeable * * \relates QueensArmies */ const int kval[] = { 0, 0, 0, 0, 5, 9, 15, 21, 29, 37, 47, 57, 69, 81, 94, 109 }; namespace { /** \brief Set of valid positions for the bishops * \relates CrowdedChess */ TupleSet bishops; /** \brief Class for solving the bishops sub-problem * \relates CrowdedChess */ class Bishops : public Space { public: const int n; BoolVarArray k; bool valid_pos(int i, int j) { return (i >= 0 && i < n) && (j >= 0 && j < n); } Bishops(int size) : n(size), k(*this,n*n,0,1) { Matrix kb(k, n, n); for (int l = n; l--; ) { const int il = (n-1) - l; BoolVarArgs d1(l+1), d2(l+1), d3(l+1), d4(l+1); for (int i = 0; i <= l; ++i) { d1[i] = kb(i+il, i); d2[i] = kb(i, i+il); d3[i] = kb((n-1)-i-il, i); d4[i] = kb((n-1)-i, i+il); } linear(*this, d1, IRT_LQ, 1); linear(*this, d2, IRT_LQ, 1); linear(*this, d3, IRT_LQ, 1); linear(*this, d4, IRT_LQ, 1); } linear(*this, k, IRT_EQ, 2*n - 2); // Forced bishop placement from crowded chess model rel(*this, kb(n-1, 0), IRT_EQ, 1); rel(*this, kb(n-1, n-1), IRT_EQ, 1); branch(*this, k, tiebreak(INT_VAR_DEGREE_MAX(),INT_VAR_SIZE_MIN()), INT_VAL_MAX()); } Bishops(bool share, Bishops& s) : Space(share,s), n(s.n) { k.update(*this, share, s.k); } virtual Space* copy(bool share) { return new Bishops(share,*this); } }; /** \brief Initialize bishops * \relates CrowdedChess */ void init_bishops(int size) { Bishops* prob = new Bishops(size); DFS e(prob); IntArgs ia(size*size); delete prob; while (Bishops* s = e.next()) { for (int i = size*size; i--; ) ia[i] = s->k[i].val(); bishops.add(ia); delete s; } bishops.finalize(); } } /** \brief %Example: Crowded chessboard You are given a chessboard together with 8 queens, 8 rooks, 14 bishops, and 21 knights. The puzzle is to arrange the 51 pieces on the chessboard so that no queen shall attack another queen, no rook attack another rook, no bishop attack another bishop, and no knight attack another knight. No notice is to be taken of the intervention of pieces of another type from that under consideration - that is, two queens will be considered to attack one another although there may be, say, a rook, a bishop, and a knight between them. It is not difficult to dispose of each type of piece separately; the difficulty comes in when you have to find room for all the arrangements on the board simultaneously. Dudeney, H.E., (1917), Amusements in Mathematics, Thomas Nelson and Sons. This puzzle can be generalized to chess-boards of size \f$n\f$, where the number of pieces to place are: - \f$ n \f$ queens - \f$ n \f$ rooks - \f$ 2n-1 \f$ bishops - \f$ k \f$ knights where k is a number to maximize. The maximum k for some different values of \f$ n \f$ are presented below (from Jesper Hansen and Joachim Schimpf, ECLiPSe solution
n k
8 21
9 29
10 37
11 47
12 57
13 69
14 81
15 94
16 109
A solution for n = 8 is:
QBK. KBKR
.K.K QKRB
B.KR K.KQ
BKRK .Q.B
BRQ. K.KB
RK.K .KQB
BQK. KRK.
BKBQ RKBB
\ingroup Example */ class CrowdedChess : public Script { protected: const int n; ///< Board-size IntVarArray s; ///< The board IntVarArray queens, ///< Row of queen in column x rooks; ///< Row of rook in column x BoolVarArray knights; ///< True iff the corresponding place has a knight /** Symbolic names of pieces. The order determines which piece will * be placed first. */ enum {Q, ///< Queen R, ///< Rook B, ///< Bishop K, ///< Knight E, ///< Empty square PMAX ///< Number of pieces (including empty squares) } piece; // Is (i,j) a valid position on the board? bool valid_pos(int i, int j) { return (i >= 0 && i < n) && (j >= 0 && j < n); } /// Post knight-constraints void knight_constraints(void) { static const int kmoves[4][2] = { {-1,2}, {1,2}, {2,-1}, {2,1} }; Matrix kb(knights, n, n); for (int x = n; x--; ) for (int y = n; y--; ) for (int i = 4; i--; ) if (valid_pos(x+kmoves[i][0], y+kmoves[i][1])) rel(*this, kb(x, y), BOT_AND, kb(x+kmoves[i][0], y+kmoves[i][1]), 0); } public: enum { PROP_TUPLE_SET, ///< Propagate bishops placement extensionally PROP_DECOMPOSE ///< Propagate bishops placement with decomposition }; /// The model of the problem CrowdedChess(const SizeOptions& opt) : n(opt.size()), s(*this, n*n, 0, PMAX-1), queens(*this, n, 0, n-1), rooks(*this, n, 0, n-1), knights(*this, n*n, 0, 1) { const int nkval = sizeof(kval)/sizeof(int); const int nn = n*n, q = n, r = n, b = (2*n)-2, k = n <= nkval ? kval[n-1] : kval[nkval-1]; const int e = nn - (q + r + b + k); assert(nn == (e + q + r + b + k)); Matrix m(s, n); // *********************** // Basic model // *********************** count(*this, s, E, IRT_EQ, e, opt.icl()); count(*this, s, Q, IRT_EQ, q, opt.icl()); count(*this, s, R, IRT_EQ, r, opt.icl()); count(*this, s, B, IRT_EQ, b, opt.icl()); count(*this, s, K, IRT_EQ, k, opt.icl()); // Collect rows and columns for handling rooks and queens for (int i = 0; i < n; ++i) { IntVarArgs aa = m.row(i), bb = m.col(i); count(*this, aa, Q, IRT_EQ, 1, opt.icl()); count(*this, bb, Q, IRT_EQ, 1, opt.icl()); count(*this, aa, R, IRT_EQ, 1, opt.icl()); count(*this, bb, R, IRT_EQ, 1, opt.icl()); // Connect (queens|rooks)[i] to the row it is in element(*this, aa, queens[i], Q, ICL_DOM); element(*this, aa, rooks[i], R, ICL_DOM); } // N-queens constraints distinct(*this, queens, ICL_DOM); distinct(*this, IntArgs::create(n,0,1), queens, ICL_DOM); distinct(*this, IntArgs::create(n,0,-1), queens, ICL_DOM); // N-rooks constraints distinct(*this, rooks, ICL_DOM); // Collect diagonals for handling queens and bishops for (int l = n; l--; ) { const int il = (n-1) - l; IntVarArgs d1(l+1), d2(l+1), d3(l+1), d4(l+1); for (int i = 0; i <= l; ++i) { d1[i] = m(i+il, i); d2[i] = m(i, i+il); d3[i] = m((n-1)-i-il, i); d4[i] = m((n-1)-i, i+il); } count(*this, d1, Q, IRT_LQ, 1, opt.icl()); count(*this, d2, Q, IRT_LQ, 1, opt.icl()); count(*this, d3, Q, IRT_LQ, 1, opt.icl()); count(*this, d4, Q, IRT_LQ, 1, opt.icl()); if (opt.propagation() == PROP_DECOMPOSE) { count(*this, d1, B, IRT_LQ, 1, opt.icl()); count(*this, d2, B, IRT_LQ, 1, opt.icl()); count(*this, d3, B, IRT_LQ, 1, opt.icl()); count(*this, d4, B, IRT_LQ, 1, opt.icl()); } } if (opt.propagation() == PROP_TUPLE_SET) { IntVarArgs b(s.size()); for (int i = s.size(); i--; ) b[i] = channel(*this, expr(*this, (s[i] == B))); extensional(*this, b, bishops, EPK_DEF, opt.icl()); } // Handle knigths // Connect knigths to board for(int i = n*n; i--; ) knights[i] = expr(*this, (s[i] == K)); knight_constraints(); // *********************** // Redundant constraints // *********************** // Queens and rooks not in the same place // Faster than going through the channelled board-connection for (int i = n; i--; ) rel(*this, queens[i], IRT_NQ, rooks[i]); // Place bishops in two corners (from Schimpf and Hansens solution) // Avoids some symmetries of the problem rel(*this, m(n-1, 0), IRT_EQ, B); rel(*this, m(n-1, n-1), IRT_EQ, B); // *********************** // Branching // *********************** // Place each piece in turn branch(*this, s, INT_VAR_MIN_MIN(), INT_VAL_MIN()); } /// Constructor for cloning e CrowdedChess(bool share, CrowdedChess& e) : Script(share,e), n(e.n) { s.update(*this, share, e.s); queens.update(*this, share, e.queens); rooks.update(*this, share, e.rooks); knights.update(*this, share, e.knights); } /// Copy during cloning virtual Space* copy(bool share) { return new CrowdedChess(share,*this); } /// Print solution virtual void print(std::ostream& os) const { Matrix m(s, n); char names[PMAX]; names[E] = '.'; names[Q] = 'Q'; names[R] = 'R'; names[B] = 'B'; names[K] = 'K'; const char* sep = n < 8 ? "\t\t" : "\t"; for (int r = 0; r < n; ++r){ // Print main board os << '\t'; for (int c = 0; c < n; ++c) { if (m(r, c).assigned()) { os << names[m(r, c).val()]; } else { os << " "; } } // Print each piece on its own for (int p = 0; p < PMAX; ++p) { if (p == E) continue; os << sep; for (int c = 0; c < n; ++c) { if (m(r, c).assigned()) { if (m(r, c).val() == p) os << names[p]; else os << names[E]; } else { os << " "; } } } os << std::endl; } os << std::endl; } }; /** \brief Main function * \relates CrowdedChess */ int main(int argc, char* argv[]) { SizeOptions opt("CrowdedChess"); opt.propagation(CrowdedChess::PROP_TUPLE_SET); opt.propagation(CrowdedChess::PROP_TUPLE_SET, "extensional", "Use extensional propagation for bishops-placement"); opt.propagation(CrowdedChess::PROP_DECOMPOSE, "decompose", "Use decomposed propagation for bishops-placement"); opt.icl(ICL_DOM); opt.size(8); opt.parse(argc,argv); if (opt.size() < 5) { std::cerr << "Error: size must be at least 5" << std::endl; return 1; } init_bishops(opt.size()); Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/descartes-folium.cpp0000644000175000010010000000747112166527420017667 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Vincent Barichard * * Copyright: * Vincent Barichard, 2012 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** * \brief %Example: Folium of Descartes * * The folium of Descartes is a curve defined by the equation: * \f[ * x^3 + y^3 - 3axy = 0 * \f] * * A technique to solve it, is to write \f$y=px\f$ and solve for * \f$x\f$ and \f$y\f$ in terms of \f$p\f$. By setting * \f$a=1\f$, it yields to the paramatric equation: * * \f[ * x^3 + y^3 - 3xy = 0 * \f] * \f[ * x=\frac{3p}{1+p^3},\quad y=\frac{3p^2}{1+p^3} * \f] * * The parameter \f$p\f$ is related to the position on the curve * and is constrained to get different solutions for \f$x\f$ and * \f$y\f$. To get reasonable interval starting sizes, \f$p\f$ * and \f$y\f$ are restricted to \f$[-20;20]\f$ and \f$x\f$ is * restricted to \f$[-1;2]\f$. * * \ingroup Example */ class DescartesFolium : public Script { protected: /// The numbers FloatVarArray f; /// Minimum distance between two solutions double step; public: /// Actual model DescartesFolium(const Options&) : f(*this,3,-20,20), step(0.1) { // Post equation FloatVar p = f[0]; FloatVar x = f[1]; FloatVar y = f[2]; rel(*this, 3*p/(1+pow(p,3)) == x); rel(*this, 3*sqr(p)/(1+pow(p,3)) == y); rel(*this, pow(x,3) + pow(y,3) == 3 * x * y); rel(*this, x == FloatVal(-1,2)); branch(*this,p,FLOAT_VAL_SPLIT_MIN()); } /// Constructor for cloning \a p DescartesFolium(bool share, DescartesFolium& p) : Script(share,p), step(p.step) { f.update(*this,share,p.f); } /// Copy during cloning virtual Space* copy(bool share) { return new DescartesFolium(share,*this); } /// Add constraint to current model to get next solution (not too close) virtual void constrain(const Space& _b) { const DescartesFolium& b = static_cast(_b); rel(*this, f[0] >= (b.f[0].max()+step)); } /// Print solution coordinates virtual void print(std::ostream& os) const { os << "XY " << f[1].med() << " " << f[2].med() << std::endl; } }; /** \brief Main-function * \relates DescartesFolium */ int main(int argc, char* argv[]) { Options opt("DescartesFolium"); opt.parse(argc,argv); opt.solutions(0); Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/dominating-queens.cpp0000755000175000010010000001161212166527420020043 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2011 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** * \brief %Example: Dominating Queens * * Place a number of queens on a n times n chessboard such that * each squares is either attacked or occupied by a queen. * * The model is taken from: C. Bessiere, E. Hebrard, B. Hnich, * Z. Kiziltan, and T. Walsh, Filtering Algorithms for the NValue * Constraint, Constraints, 11(4), 271-293, 2006. * * \ingroup Example * */ class DominatingQueens : public IntMinimizeScript { protected: /// Size of the board const int n; /// Fields on the board IntVarArray b; /// Number of queens IntVar q; /// Compute coordinate pair from \a x and \a y int xy(int x, int y) const { return y*n + x; } /// Compute x coordinate from pair \a xy int x(int xy) const { return xy % n; } /// Compute y coordinate from pair \a xy int y(int xy) const { return xy / n; } /// Compute set of fields that can be attacked by \a xy IntSet attacked(int xy) { IntArgs a; for (int i=0; i(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/domino.cpp0000644000175000010010000002234012166527420015676 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * Mikael Lagerkvist * * Copyright: * Guido Tack, 2006 * Mikael Lagerkvist, 2006 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; namespace { /** \brief Board specifications * * \relates Domino */ extern const int *specs[]; /** \brief Number of board specifications * * \relates Domino */ extern const unsigned int n_examples; } /** * \brief %Example: Solitaire domino * * The task is to place domino pieces on a board. Each piece covers two * fields and has two numbers. There are 28 pieces, from 0-0 to 6-6. * The board is set up with a number in each field that must match the * number of the domino piece placed on that field. * * \ingroup Example * */ class Domino : public Script { private: /// Specification of the board const int *spec; /// Width of the board int width; /// Height of the board int height; /// The board representing the number of the piece at each position IntVarArray x; public: /// Propagation to use for model enum { PROP_ELEMENT, ///< Use element constraints PROP_EXTENSIONAL ///< Use extensional constraints }; /// Actual model Domino(const SizeOptions& opt) : spec(specs[opt.size()]), width(spec[0]), height(spec[1]), x(*this, (width+1)*height, 0, 28) { spec+=2; // skip board size information // Copy spec information to the board IntArgs board((width+1)*height); for (int i=0; i= n_examples) { std::cerr << "Error: size must be between 0 and " << n_examples-1 << std::endl; return 1; } Script::run(opt); return 0; } namespace { /** \name Puzzle specifications * * \relates Domino */ //@{ /// %Example 0 const int domino0[] = { // width*height of the board 8,7, // the board itself 2,1,0,3,0,4,5,5, 6,2,0,6,3,1,4,0, 3,2,3,6,2,5,4,3, 5,4,5,1,1,2,1,2, 0,0,1,5,0,5,4,4, 4,6,2,1,3,6,6,1, 4,2,0,6,5,3,3,6 }; /// %Example 1 const int domino1[] = { // width*height of the board 8,7, // the board itself 5,1,2,4,6,2,0,5, 6,6,4,3,5,0,1,5, 2,0,4,0,4,0,5,0, 6,1,3,6,3,5,4,3, 3,1,0,1,2,2,1,4, 3,6,6,2,4,0,5,4, 1,3,6,1,2,3,5,2 }; /// %Example 2 const int domino2[] = { // width*height of the board 8,7, // the board itself 4,4,5,4,0,3,6,5, 1,6,0,1,5,3,4,1, 2,6,2,2,5,3,6,0, 1,3,0,6,4,4,2,3, 3,5,5,2,4,2,2,1, 2,1,3,3,5,6,6,1, 5,1,6,0,0,0,4,0 }; /// %Example 3 const int domino3[] = { // width*height of the board 8,7, // the board itself 3,0,2,3,3,4,4,3, 6,5,3,4,2,0,2,1, 6,5,1,2,3,0,2,0, 4,5,4,1,6,6,2,5, 4,3,6,1,0,4,5,5, 1,3,2,5,6,0,0,1, 0,5,4,6,2,1,6,1 }; /// %Example 4 const int domino4[] = { // width*height of the board 8,7, // the board itself 4,1,5,2,4,4,6,2, 2,5,6,1,4,6,0,2, 6,5,1,1,0,1,4,3, 6,2,1,1,3,2,0,6, 3,6,3,3,5,5,0,5, 3,0,1,0,0,5,4,3, 3,2,4,5,4,2,6,0 }; /// %Example 5 const int domino5[] = { // width*height of the board 8,7, // the board itself 4,1,2,1,0,2,4,4, 5,5,6,6,0,4,6,3, 6,0,5,1,1,0,5,3, 3,4,2,2,0,3,1,2, 3,6,5,6,1,2,3,2, 2,5,0,6,6,3,3,5, 4,1,0,0,4,1,4,5 }; /// List of specifications const int *specs[] = {domino0,domino1,domino2,domino3,domino4,domino5}; /// Number of specifications const unsigned n_examples = sizeof(specs)/sizeof(int*); //@} } // STATISTICS: example-any gecode-4.2.1/examples/donald.cpp0000644000175000010010000000757012166527420015662 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2001 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** * \brief %Example: DONALD+GERALD=ROBERT puzzle * * Well-known cryptoarithmetic puzzle of unknown origin. * * \ingroup Example * */ class Donald : public Script { private: /// Number of letters static const int nl = 10; /// Array of letters IntVarArray le; public: /// Model variants enum { MODEL_SINGLE, ///< Use single linear equation MODEL_CARRY ///< Use carries }; /// Actual model Donald(const Options& opt) : le(*this,nl,0,9) { IntVar d(le[0]), o(le[1]), n(le[2]), a(le[3]), l(le[4]), g(le[5]), e(le[6]), r(le[7]), b(le[8]), t(le[9]); rel(*this, d, IRT_NQ, 0); rel(*this, g, IRT_NQ, 0); rel(*this, r, IRT_NQ, 0); distinct(*this, le, opt.icl()); switch (opt.model()) { case MODEL_SINGLE: rel(*this, 100000*d+10000*o+1000*n+100*a+10*l+d + 100000*g+10000*e+1000*r+100*a+10*l+d == 100000*r+10000*o+1000*b+100*e+10*r+t, opt.icl()); break; case MODEL_CARRY: { IntVar c0(*this,0,1), c1(*this,0,1), c2(*this,0,1), c3(*this,0,1), c4(*this,0,1); rel(*this, d+d == t+10*c0, opt.icl()); rel(*this, c0+l+l == r+10*c1, opt.icl()); rel(*this, c1+a+a == e+10*c2, opt.icl()); rel(*this, c2+n+r == b+10*c3, opt.icl()); rel(*this, c3+o+e == o+10*c4, opt.icl()); rel(*this, c4+d+g == r, opt.icl()); } break; default: GECODE_NEVER; } branch(*this, le, INT_VAR_SIZE_MIN(), INT_VAL_MAX()); } /// Constructor for cloning \a s Donald(bool share, Donald& s) : Script(share,s) { le.update(*this, share, s.le); } /// Copy during cloning virtual Space* copy(bool share) { return new Donald(share,*this); } /// Print solution virtual void print(std::ostream& os) const { os << "\t" << le << std::endl;; } }; /** \brief Main-function * \relates Donald */ int main(int argc, char* argv[]) { Options opt("Donald+Gerald=Robert"); opt.model(Donald::MODEL_SINGLE); opt.model(Donald::MODEL_SINGLE, "single", "use single linear equation"); opt.model(Donald::MODEL_CARRY, "carry", "use carry"); opt.solutions(0); opt.iterations(1500); opt.parse(argc,argv); Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/efpa.cpp0000644000175000010010000002414212166527420015326 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Mikael Lagerkvist * * Copyright: * Mikael Lagerkvist, 2009 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** * \brief %Options for %EFPA problems * * \relates EFPA */ class EFPAOptions : public Options { private: Driver::UnsignedIntOption _v; ///< Parameter v Driver::UnsignedIntOption _q; ///< Parameter q Driver::UnsignedIntOption _l; ///< Parameter lambda Driver::UnsignedIntOption _d; ///< Parameter d Driver::StringOption _permutation; ///< Use permutation constraints if d=4 public: /// Initialize options for example with name \a s EFPAOptions(const char* s, int v0 = 5, int q0 = 3, int lambda0 = 2, int d0 = 4) : Options(s), _v("-v", "number of sequences", v0 ), _q("-q", "number of symbols", q0 ), _l("-l", "sets of symbols per sequence (lambda)", lambda0), _d("-d", "Hamming distance between sequences", d0 ), _permutation("-permutation", "use permutation constraints if d=4", false) { // Add options add(_d); add(_l); add(_q); add(_v); add(_permutation); add(_symmetry); // Add permutation options _permutation.add(true, "full" ); _permutation.add(false, "none"); // Add symmetry options _symmetry.add(true, "true" ); _symmetry.add(false, "false"); } /// Parse options from arguments \a argv (number is \a argc) void parse(int& argc, char* argv[]) { Options::parse(argc,argv); } /// Get v, number of sequences int v(void) const { return _v.value(); } /// Get q, number of symbols int q(void) const { return _q.value(); } /// Get lambda, sets of symbols per sequence int l(void) const { return _l.value(); } /// Get d, Hamming distance between sequences int d(void) const { return _d.value(); } /// Whether to use permutation constraints. Only active if d=4 bool permutation(void) const { return d() == 4 && _permutation.value(); } /// Whether to use symmetry breaking. bool symmetry(void) const { return _symmetry.value(); } }; /** * \brief %Example: Equidistant Frequency Permutation Arrays * * This example solves instances of the equidistant frequency * permutation arrays problem. * * The model of the problem is mostly taken from "Modelling * Equidistant Frequency Permutation Arrays in Constraints", by Ian * P. Gent, Paul McKay, Peter Nightingale, and Sophie Huczynska. It * implements the non-Boolean model without SAC. * * \ingroup Example * */ class EFPA : public Script { protected: int v; ///< Number of sequences int q; ///< Number of symbols int l; ///< Number of sets of symbols for a sequence (\f$\lambda\f$) int d; ///< Hamming distance between any pair of sequences int n; ///< Length of sequence (\f$q\cdot\lambda\f$) int nseqpair; ///< Number of sequence pairs (\f$\frac{v(v-1)}{2}\f$) IntVarArray c; ///< Variables for sequences BoolVarArray diff; ///< Differences between sequences public: /// Actual model EFPA(const EFPAOptions& opt) : v(opt.v()), q(opt.q()), l(opt.l()), d(opt.d()), n(q*l), nseqpair((v*(v-1))/2), c(*this, n*v, 1,q), diff(*this, n*nseqpair, 0, 1) { // Matrix access // q*lambda=n columns, and v rows Matrix cm(c, n, v); // q*lambda=n columns, and nseqpair rows Matrix diffm(diff, n, nseqpair); // Counting symbols in rows { IntArgs values(q); for (int i = q; i--; ) values[i] = i+1; IntSet cardinality(l, l); for (int i = v; i--; ) count(*this, cm.row(i), cardinality, values, opt.icl()); } // Difference variables { int nseqi = 0; for (int a = 0; a < v; ++a) { for (int b = a+1; b < v; ++b) { for (int i = n; i--; ) { rel(*this, cm(i, a), IRT_NQ, cm(i, b), diffm(i, nseqi)); } ++nseqi; } } assert(nseqi == nseqpair); } // Counting the Hamming difference { for (int i = nseqpair; i--; ) { linear(*this, diffm.row(i), IRT_EQ, d); } } // Symmetry breaking if (opt.symmetry()) { IntRelType row_less = d==0 ? IRT_EQ : IRT_LE; // order rows for (int r = 0; r p(_p, d, 2); for (int i = 0; i < 2; ++i) { for (int j = 0; j < d; ++j) { element(*this, row1, perm[k[i][j]], p(j, i)); } } // ...into values in row2 for (int i = 0; i < d; ++i) { IntVar index(*this, 0, 2*d); rel(*this, cform*d + i == index); IntVar value(*this, 1, q); element(*this, _p, index, value); element(*this, row2, perm[i], value); } /* Rows r1 and r2 are equal at indices not in perm */ // uses Boolean representations pib for perm[i] BoolVarArgs p1b(*this, n, 0, 1); channel(*this, p1b, perm[0]); BoolVarArgs p2b(*this, n, 0, 1); channel(*this, p2b, perm[1]); BoolVarArgs p3b(*this, n, 0, 1); channel(*this, p3b, perm[2]); BoolVarArgs p4b(*this, n, 0, 1); channel(*this, p4b, perm[3]); for (int i = n; i--; ) { // No perm-variable uses i is equivalent to the reows // being equal at i rel(*this, (!p1b[i] && !p2b[i] && !p3b[i] && !p4b[i]) == (row1[i] == row2[i])); } /* Constraints for fixing the permutation */ // Common non-equality constraints - derangements rel(*this, perm[0], IRT_NQ, perm[1]); rel(*this, perm[2], IRT_NQ, perm[3]); // Conditional non-equality constraints - derangment of cform 1 // Implements distinct(*this, perm, cformb); rel(*this, perm[0], IRT_NQ, perm[2], cformb); rel(*this, perm[0], IRT_NQ, perm[3], cformb); rel(*this, perm[1], IRT_NQ, perm[2], cformb); rel(*this, perm[1], IRT_NQ, perm[3], cformb); // Common ordering-constraints - symmetry breaking rel(*this, perm[0], IRT_LE, perm[1]); rel(*this, perm[0], IRT_LE, perm[2]); rel(*this, perm[0], IRT_LE, perm[3]); // Conditional ordering constraint - symmetry breaking for cform 0 rel(*this, (!cformb) >> (perm[2] < perm[3])); } } } branch(*this, c, INT_VAR_NONE(), INT_VAL_MIN()); } /// Print instance and solution virtual void print(std::ostream& os) const { Matrix cm(c, n, v); for (int i = 0; i < v; ++i) { IntVarArgs r = cm.row(i); os << r << std::endl; } os << std::endl; } /// Constructor for cloning \a s EFPA(bool share, EFPA& s) : Script(share,s), v(s.v), q(s.q), l(s.l), d(s.d), n(s.n), nseqpair(s.nseqpair) { c.update(*this, share, s.c); diff.update(*this, share, s.diff); } /// Copy during cloning virtual Space* copy(bool share) { return new EFPA(share,*this); } }; /** \brief Main-function * \relates EFPA */ int main(int argc, char* argv[]) { EFPAOptions opt("Equidistant Frequency Permutation Arrays"); opt.icl(ICL_DOM); opt.parse(argc,argv); Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/eq20.cpp0000644000175000010010000001037612166527420015166 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2001 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include using namespace Gecode; /** * \brief %Example: Solving 20 linear equations * * Standard benchmark for solving linear equations. * * \ingroup Example * */ class Eq20 : public Script { private: /// Number of variables static const int x_n = 7; /// Number of equations static const int e_n = 20; /// Variables IntVarArray x; public: /// The actual problem Eq20(const Options& opt) : x(*this,x_n,0,10) { // Coefficients and constants for the equations int eqs[e_n][x_n+1] = { {876370, -16105, 62397, -6704, 43340, 95100, -68610, 58301}, {533909, 51637, 67761, 95951, 3834, -96722, 59190, 15280}, {915683, 1671, -34121, 10763, 80609, 42532, 93520, -33488}, {129768, 71202, -11119, 73017, -38875, -14413, -29234, 72370}, {752447, 8874, -58412, 73947, 17147, 62335, 16005, 8632}, {90614, 85268, 54180, -18810, -48219, 6013, 78169, -79785}, {1198280, -45086, 51830, -4578, 96120, 21231, 97919, 65651}, {18465, -64919, 80460, 90840, -59624, -75542, 25145, -47935}, {1503588, -43277, 43525, 92298, 58630, 92590, -9372, -60227}, {1244857, -16835, 47385, 97715, -12640, 69028, 76212, -81102}, {1410723, -60301, 31227, 93951, 73889, 81526, -72702, 68026}, {25334, 94016, -82071, 35961, 66597, -30705, -44404, -38304}, {277271, -67456, 84750, -51553, 21239, 81675, -99395, -4254}, {249912, -85698, 29958, 57308, 48789, -78219, 4657, 34539}, {373854, 85176, -95332, -1268, 57898, 15883, 50547, 83287}, {740061, -10343, 87758, -11782, 19346, 70072, -36991, 44529}, {146074, 49149, 52871, -7132, 56728, -33576, -49530, -62089}, {251591, -60113, 29475, 34421, -76870, 62646, 29278, -15212}, {22167, 87059, -29101, -5513, -21219, 22128, 7276, 57308}, {821228, -76706, 98205, 23445, 67921, 24111, -48614, -41906} }; // Post equation constraints for (int i = e_n; i--; ) { IntArgs c(x_n, eqs[i][1],eqs[i][2],eqs[i][3],eqs[i][4], eqs[i][5],eqs[i][6],eqs[i][7]); linear(*this, c, x, IRT_EQ, eqs[i][0], opt.icl()); } branch(*this, x, INT_VAR_NONE(), INT_VAL_MIN()); } /// Constructor for cloning \a s Eq20(bool share, Eq20& s) : Script(share,s) { x.update(*this, share, s.x); } /// Perform copying during cloning virtual Space* copy(bool share) { return new Eq20(share,*this); } /// Print solution virtual void print(std::ostream& os) const { os << "\tx[] = " << x << std::endl; } }; /** \brief Main-function * \relates Eq20 */ int main(int argc, char* argv[]) { Options opt("Eq20"); opt.solutions(0); opt.iterations(1000); opt.parse(argc,argv); Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/golden-spiral.cpp0000644000175000010010000000774112166527420017161 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Vincent Barichard * * Copyright: * Vincent Barichard, 2012 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** * \brief %Example: Golden spiral * * The Golden Spiral is a logarithmic spiral whose growth factor * is the golden ratio \f$\phi=1,618\f$. * * It is defined by the polar equation: * \f[ * r = ae^{b\theta} * \f] * where * \f[ * \operatorname{abs}(b) = \frac{\operatorname{ln}(\phi)}{\frac{\pi}{2}} * \f] * * To get cartesian coordinates, it can be solved for \f$x\f$ * and \f$y\f$ in terms of \f$r\f$ and \f$\theta\f$. * By setting \f$a=1\f$, it yields to the equation: * * \f[ * r = e^{0.30649\times\theta} * \f] * with * \f[ * x=r\operatorname{cos}(\theta), \quad y=r\operatorname{sin}(\theta) * \f] * * The tuple \f$(r,\theta)\f$ is related to the position for * \f$x\f$ and \f$y\f$ on the curve. \f$r\f$ and \f$\theta\f$ * are positive numbers. * * To get reasonable interval starting sizes, \f$x\f$ and \f$y\f$ * are restricted to \f$[-20;20]\f$. * * \ingroup Example */ class GoldenSpiral : public Script { protected: /// The numbers FloatVarArray f; /// Minimum distance between two solutions FloatNum step; public: /// Actual model GoldenSpiral(const Options&) : f(*this,4,-20,20), step(0.1) { // Post equation FloatVar theta = f[0]; FloatVar r = f[3]; FloatVar x = f[1]; FloatVar y = f[2]; rel(*this, theta >= 0); rel(*this, r >= 0); rel(*this, r*cos(theta) == x); rel(*this, r*sin(theta) == y); rel(*this, exp(0.30649*theta) == r); branch(*this,theta,FLOAT_VAL_SPLIT_MIN()); } /// Constructor for cloning \a p GoldenSpiral(bool share, GoldenSpiral& p) : Script(share,p), step(p.step) { f.update(*this,share,p.f); } /// Copy during cloning virtual Space* copy(bool share) { return new GoldenSpiral(share,*this); } /// Add constraint to current model to get next solution (not too close) virtual void constrain(const Space& _b) { const GoldenSpiral& b = static_cast(_b); rel(*this, f[0] >= (b.f[0].max()+step)); } /// Print solution coordinates virtual void print(std::ostream& os) const { os << "XY " << f[1].med() << " " << f[2].med() << std::endl; } }; /** \brief Main-function * \relates GoldenSpiral */ int main(int argc, char* argv[]) { Options opt("GoldenSpiral"); opt.parse(argc,argv); opt.solutions(0); Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/golf.cpp0000755000175000010010000001314412166527420015345 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * * Copyright: * Guido Tack, 2004 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /// \brief %Options for %Golf example class GolfOptions : public Options { protected: Driver::IntOption _w; //< Number of weeks Driver::IntOption _g; //< Number of groups Driver::IntOption _s; //< Number of players per group public: /// Constructor GolfOptions(void) : Options("Golf"), _w("-w","number of weeks",9), _g("-g","number of groups",8), _s("-s","number of players per group",4) { add(_w); add(_g); add(_s); } /// Return number of weeks int w(void) const { return _w.value(); } /// Return number of groups int g(void) const { return _g.value(); } /// Return number of players per group int s(void) const { return _s.value(); } }; /** * \brief %Example: %Golf tournament * * Schedule a golf tournament. This is problem 010 from csplib. * * Note that "Modeling and Programming with Gecode" uses this example * as a case study. * * \ingroup Example * */ class Golf : public Script { public: /// Model variants enum { MODEL_PLAIN, ///< A simple model MODEL_SYMMETRY ///< Model with symmetry breaking }; int g; ///< Number of groups in a week int s; ///< Number of players in a group int w; ///< Number of weeks /// The sets representing the groups SetVarArray groups; /// Actual model Golf(const GolfOptions& opt) : g(opt.g()), s(opt.s()), w(opt.w()), groups(*this,g*w,IntSet::empty,0,g*s-1,s,s) { Matrix schedule(groups,g,w); // Groups in one week must be disjoint SetVar allPlayers(*this, 0,g*s-1, 0,g*s-1); for (int i=0; i schedule(groups,g,w); for (int j=0; j(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/golomb-ruler.cpp0000644000175000010010000000771612166527420017031 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2001 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include using namespace Gecode; /** * \brief %Example: Finding optimal %Golomb rulers * * The script makes use of two lower bounds taken from: * Barbara Smith, Kostas Stergiou, Toby Walsh, * Modelling the Golomb Ruler Problem. * In IJCAI 99 Workshop on Non-binary Constraints, * 1999. * * See also problem 6 at http://www.csplib.org/. * * The upper bound used is from the trivial construction where * distances between consecutive marks are increasing powers of two. * * Note that "Modeling and Programming with Gecode" uses this example * as a case study. * * \ingroup Example * */ class GolombRuler : public IntMinimizeScript { protected: /// Array for ruler marks IntVarArray m; public: /// Actual model GolombRuler(const SizeOptions& opt) : m(*this,opt.size(),0, (opt.size() < 31) ? (1 << (opt.size()-1))-1 : Int::Limits::max) { // Assume first mark to be zero rel(*this, m[0], IRT_EQ, 0); // Order marks rel(*this, m, IRT_LE); // Number of marks and differences const int n = m.size(); const int n_d = (n*n-n)/2; // Array of differences IntVarArgs d(n_d); // Setup difference constraints for (int k=0, i=0; i 2) rel(*this, d[0], IRT_LE, d[n_d-1]); branch(*this, m, INT_VAR_NONE(), INT_VAL_MIN()); } /// Return cost virtual IntVar cost(void) const { return m[m.size()-1]; } /// Print solution virtual void print(std::ostream& os) const { os << "\tm[" << m.size() << "] = " << m << std::endl; } /// Constructor for cloning \a s GolombRuler(bool share, GolombRuler& s) : IntMinimizeScript(share,s) { m.update(*this, share, s.m); } /// Copy during cloning virtual Space* copy(bool share) { return new GolombRuler(share,*this); } }; /** \brief Main-function * \relates GolombRuler */ int main(int argc, char* argv[]) { SizeOptions opt("GolombRuler"); opt.solutions(0); opt.size(10); opt.icl(ICL_BND); opt.parse(argc,argv); if (opt.size() > 0) IntMinimizeScript::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/graph-color.cpp0000755000175000010010000005064412166527420016641 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Contributing authors: * Stefano Gualandi * * Copyright: * Christian Schulte, 2004 * Stefano Gualandi, 2013 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include using namespace Gecode; /** * \name %Graph specification for graph coloring * * The edges are described by an array of integers with even number * of elements, terminated by the elements -1,-1. * The cliques are described by an array of integers, where the first * integer gives the size of the clique, the following elements are * nodes for each clique. The cliques are terminated by -1 for clique size * * \relates GraphColor */ //@{ /// %Graph specification class GraphColorSpec { public: const int n_v; ///< Number of nodes const int* e; ///< Edges const int* c; ///< Cliques GraphColorSpec(const int n_v0, const int* e0, const int* c0) : n_v(n_v0), e(e0), c(c0) {} }; /// First example graph: edges const int g1_e[] = { 160,184, 192,199, 0,129, 20,80, 8,29, 93,171, 101,165, 124,193, 2,100, 66,173, 151,191, 164,187, 3,130, 118,176, 121,184, 25,106, 159,193, 121,123, 5,62, 97,101, 6,143, 123,163, 19,125, 17,108, 122,168, 181,184, 25,41, 62,70, 29,103, 48,67, 46,160, 79,170, 143,152, 38,184, 2,40, 191,195, 7,196, 62,199, 76,141, 82,166, 36,80, 51,189, 13,97, 3,192, 90,180, 47,176, 13,172, 92,121, 50,64, 65,113, 108,123, 26,106, 34,153, 90,123, 34,39, 116,178, 22,179, 50,61, 84,105, 84,93, 19,108, 29,59, 63,185, 119,129, 50,177, 80,194, 13,36, 46,56, 38,144, 82,193, 72,93, 49,95, 42,155, 117,140, 109,189, 19,35, 31,125, 118,191, 163,169, 40,167, 91,127, 3,121, 124,149, 40,174, 30,175, 19,132, 18,165, 34,93, 37,63, 10,55, 88,95, 76,122, 7,91, 25,141, 29,173, 139,173, 8,130, 110,158, 81,174, 113,114, 95,182, 136,149, 5,199, 56,106, 36,120, 133,187, 111,172, 19,34, 96,197, 32,108, 27,63, 50,188, 20,116, 50,118, 10,50, 24,172, 86,138, 35,50, 141,153, 98,132, 70,143, 1,97, 8,160, 37,170, 4,73, 1,94, 88,146, 59,61, 104,156, 62,172, 117,139, 66,189, 33,134, 122,169, 95,163, 95,152, 83,140, 110,189, 147,159, 22,147, 59,173, 30,41, 33,183, 181,187, 88,105, 93,151, 6,130, 24,30, 84,130, 72,120, 118,159, 147,189, 122,149, 24,175, 39,169, 164,186, 93,187, 13,156, 119,176, 73,91, 174,178, 71,198, 10,134, 30,101, 79,93, 180,187, 1,50, 51,59, 18,169, 73,153, 1,198, 137,154, 61,106, 80,113, 48,142, 100,111, 97,133, 82,97, 136,170, 53,134, 65,177, 7,80, 73,137, 6,70, 115,166, 72,196, 40,109, 91,101, 2,177, 120,185, 55,65, 72,166, 104,165, 173,187, 54,71, 3,61, 52,56, 120,149, 64,72, 42,43, 75,185, 62,68, 108,147, 30,111, 25,58, 39,93, 75,117, 61,194, 140,153, 80,121, 93,102, 9,177, 7,163, 17,70, 5,168, 63,178, 74,160, 148,158, 9,84, 30,76, 63,80, 68,99, 20,152, 7,182, 7,22, 71,134, 32,100, 107,164, 23,62, 5,98, 130,192, 65,144, 139,161, 24,124, 31,47, 29,140, 61,153, 53,109, 20,26, 143,160, 47,195, 171,172, 185,193, 128,173, 38,96, 14,171, 176,199, 111,139, 21,54, 80,171, 116,185, 184,199, 37,88, 62,133, 3,150, 48,109, 46,176, 24,178, 59,172, 180,198, 64,109, 110,111, 101,146, 66,164, 5,117, 144,179, 71,126, 166,169, 107,151, 46,85, 106,139, 27,153, 97,148, 68,185, 17,179, 10,142, 168,169, 4,46, 113,152, 52,176, 6,38, 22,48, 20,120, 2,84, 71,85, 91,116, 0,189, 116,197, 142,147, 33,165, 86,198, 146,149, 152,187, 44,62, 48,175, 56,150, 63,161, 71,164, 17,171, 19,66, -1,-1}; /// First example graph: cliques const int g1_c[] = { 30, 6,11,14,25,40,42,48,53,61,76,80,87,89,92,108,115,120,131,132,137,145,159,162,163,164,168,172,173,176,182, 30, 3,15,16,31,34,35,37,38,49,58,67,78,86,91,100,110,114,123,129,132,133,140,143,154,167,168,174,175,193,197, 25, 3,10,33,38,43,45,48,51,65,66,82,88,90,93,94,103,107,128,131,141,152,155,168,185,199, 25, 0,4,7,26,28,33,36,58,61,72,79,81,90,99,105,114,115,124,135,152,159,161,173,181,192, 25, 12,15,28,39,43,44,45,66,83,84,85,99,102,108,112,115,120,126,131,152,157,163,171,182,183, 25, 13,14,15,38,55,66,76,78,87,91,95,99,109,110,125,130,134,137,148,153,159,169,181,185,195, 25, 3,4,31,35,41,42,57,60,65,66,72,74,84,86,90,91,94,96,110,139,140,141,165,179,199, 25, 0,4,5,9,28,31,42,49,54,63,65,72,74,75,76,82,91,99,107,109,140,147,154,169,182, 25, 4,5,10,17,41,43,48,58,65,85,92,97,107,112,114,129,131,146,150,153,158,169,176,184,191, 25, 4,8,15,16,20,21,37,55,68,84,87,104,109,112,117,119,122,123,126,133,142,164,167,180,195, 25, 5,6,10,11,28,30,43,46,53,60,66,79,82,105,114,116,119,124,127,147,157,171,184,195,196, 20, 15,16,30,35,36,56,66,78,81,84,99,126,128,129,138,151,152,153,166,190, 20, 5,21,23,29,39,40,49,69,88,114,122,127,128,142,148,155,161,171,188,190, 20, 0,3,15,23,31,41,57,60,69,76,89,107,109,128,153,155,161,169,174,183, 20, 9,33,43,61,64,69,85,98,100,101,114,120,138,144,172,182,184,187,188,198, 20, 4,6,8,10,23,27,45,57,66,68,71,93,110,122,139,146,150,155,156,188, 20, 4,14,18,22,63,77,78,83,94,98,104,114,150,166,172,177,183,186,196,199, 20, 22,35,46,47,63,64,70,78,87,99,102,112,116,119,125,131,152,165,174,186, 20, 1,3,13,15,19,26,46,51,65,73,76,110,114,149,152,163,166,170,178,186, 20, 9,29,33,40,50,54,102,105,111,112,119,120,124,128,136,138,144,175,190,199, 20, 39,75,79,102,106,112,123,125,138,145,154,155,159,162,165,168,175,181,189,196, 20, 0,11,12,23,42,63,68,71,79,83,89,98,113,117,121,141,156,176,177,193, 20, 10,17,31,56,77,89,102,115,116,117,118,120,136,157,163,168,172,182,193,196, 20, 9,34,35,43,44,57,60,64,79,87,88,94,103,133,156,157,166,171,174,189, 20, 13,21,22,31,41,45,66,67,79,86,112,116,119,146,160,171,175,181,192,195, 20, 11,24,26,45,57,91,99,102,122,123,135,141,144,146,154,156,167,191,194,199, 15, 17,44,53,61,82,90,95,103,107,122,124,145,169,186,190, 15, 2,14,26,37,58,61,75,95,103,109,115,116,141,154,199, 15, 5,13,21,28,61,64,65,73,105,115,119,132,148,154,185, 15, 10,20,38,45,61,75,109,111,115,143,150,157,163,179,186, 15, 9,45,48,49,51,52,57,64,70,128,158,163,182,183,192, 15, 47,55,57,64,79,80,105,131,152,163,172,180,186,190,197, 15, 16,36,69,84,99,113,118,121,126,137,160,162,165,177,196, 15, 16,44,50,53,54,65,69,80,96,112,125,139,150,153,193, 15, 6,54,72,76,86,95,96,144,145,148,151,164,168,180,183, 15, 10,18,19,37,65,85,90,104,112,128,147,158,164,192,198, 15, 20,21,36,50,53,74,90,96,99,124,129,140,163,171,183, 15, 13,20,27,53,65,77,86,98,110,125,133,139,147,188,196, 15, 23,41,43,49,58,74,77,86,111,126,150,168,173,185,189, 15, 11,35,62,89,125,132,134,141,149,163,166,167,171,194,196, 15, 14,28,30,52,114,115,122,125,132,135,172,177,179,181,195, 15, 0,8,9,20,23,53,77,93,121,136,141,147,150,191,199, 15, 3,21,47,49,91,102,106,113,124,136,140,143,177,178,194, 15, 44,46,52,53,68,82,89,90,120,128,144,147,175,178,192, 15, 8,16,19,21,67,72,79,82,86,90,115,116,149,152,199, 15, 12,30,78,80,97,120,122,123,143,146,151,165,173,177,178, 15, 9,19,39,46,91,109,128,130,131,146,148,150,178,185,198, 10, 29,44,69,74,96,115,122,126,189,199, 10, 22,42,52,53,97,113,146,151,160,195, 10, 19,20,32,77,81,133,134,138,147,177, 10, 0,4,56,59,107,109,144,149,158,167, 10, 6,69,99,104,110,114,118,134,152,172, 5, 25,76,126,140,143, 5, 4,54,67,116,142, 5, 47,52,124,151,192, 5, 32,55,61,64,73, 5, 11,65,128,134,190, 5, 45,48,63,131,139, 5, 34,55,82,108,151, 5, 24,34,54,112,156, 5, 12,47,72,148,163, 5, 74,126,145,162,170, 5, 73,78,104,175,192, 5, 19,83,127,130,166, 5, 20,90,98,137,165, 5, 22,24,29,49,132, 5, 82,92,116,134,184, -1}; /// First example graph const GraphColorSpec g1(200, g1_e, g1_c); /// Second example graph: edges const int g2_e[] = { 63,97, 67,85, 18,180, 2,143, 55,156, 28,105, 37,196, 26,33, 88,199, 175,179, 45,46, 62,70, 53,58, 49,177, 91,178, 52,129, 147,165, 83,95, 68,172, 66,150, 7,112, 71,92, 97,150, 114,116, 56,86, 154,188, 95,97, 159,199, 68,119, 11,81, 79,116, 64,74, 88,89, 99,114, 70,73, 87,162, 24,119, 9,25, 174,188, 11,80, 47,198, 86,145, 7,70, 37,170, 138,180, 66,199, 98,153, 70,142, 84,196, 78,185, 7,131, 54,76, 69,82, 53,166, 25,178, 3,36, 128,197, 59,96, 122,137, 54,124, 157,162, 3,146, 72,198, 2,94, 137,158, 64,131, 2,79, 18,119, 22,38, 92,136, 7,108, 179,194, 68,166, 10,84, 28,192, 103,104, 28,75, 8,43, 153,164, 59,119, 88,177, 36,70, 59,154, 57,75, 109,174, 155,184, 16,74, 99,148, 77,121, 54,177, 38,172, 138,174, 7,16, 28,146, 18,192, 4,154, 17,31, 56,57, 174,177, 81,122, 101,175, 21,155, 48,96, 124,154, 129,130, 58,169, 19,57, 115,165, 40,117, 34,181, 28,32, 32,176, 19,119, 20,93, 137,172, 55,135, 92,95, 34,51, 5,81, 63,118, 72,94, 157,181, 15,68, 41,90, 35,73, 159,183, 115,128, 28,183, 34,45, 149,177, 74,137, 51,110, 25,170, 43,123, 53,109, 4,26, 68,80, 53,171, 48,159, 0,28, 67,176, 87,163, 75,165, 137,162, 150,199, 57,153, 32,93, 25,92, 13,88, 115,167, 16,192, 113,157, 90,125, 104,188, 148,171, 96,101, 22,68, 25,62, 89,161, 24,158, 66,190, 31,34, 106,133, 51,102, 146,163, 31,154, 56,129, 66,157, 38,93, 73,166, 117,174, 93,161, 3,95, 86,181, 131,139, 5,182, 30,66, 0,11, 88,107, 54,101, 36,66, 25,176, 8,38, 31,177, 78,195, 122,179, 42,60, 83,112, 149,161, 184,188, 65,126, 74,198, 38,80, 135,172, 43,156, 148,151, 135,195, 111,184, 10,14, 97,152, -1,-1}; /// Second example graph: cliques const int g2_c[] = { 30, 10,11,17,20,24,29,33,40,45,50,51,76,77,85,88,101,114,120,122,127,129,136,144,147,148,157,169,180,184,193, 30, 0,2,14,21,38,40,44,51,72,82,91,99,106,109,119,123,126,136,141,154,157,161,163,165,166,171,175,182,183,196, 30, 2,17,20,30,35,36,37,39,46,56,61,72,75,77,80,84,85,96,97,100,107,112,123,156,160,163,175,181,182,195, 25, 11,19,36,41,44,59,60,73,74,89,93,94,108,109,113,130,132,153,163,167,182,186,193,196,199, 25, 2,11,25,30,31,41,49,51,52,53,85,86,93,101,105,108,111,130,135,144,150,183,185,191,194, 25, 1,6,9,11,12,13,19,21,33,49,51,77,124,128,130,131,140,146,147,161,171,180,181,185,198, 25, 3,5,31,39,42,57,59,61,90,93,98,102,106,121,129,132,140,160,165,166,168,185,187,193,194, 25, 9,12,16,23,33,41,44,61,68,73,85,93,96,113,118,122,125,127,129,133,139,146,181,186,199, 25, 6,23,35,42,45,57,65,67,70,77,80,96,100,105,114,119,129,145,146,152,157,160,166,190,195, 25, 8,18,19,27,36,40,49,52,60,65,75,84,85,96,97,107,109,110,120,122,132,154,155,172,189, 25, 1,25,27,37,39,45,56,61,69,70,80,87,89,102,111,115,120,126,134,146,156,169,173,175,192, 20, 8,14,20,21,32,39,50,55,88,91,102,120,126,142,159,165,171,175,184,186, 20, 10,15,35,43,50,52,60,77,80,81,85,87,106,120,145,151,155,159,176,196, 20, 10,17,20,33,46,55,60,68,95,96,103,112,117,118,120,123,127,141,147,179, 20, 9,34,41,52,56,72,73,100,102,116,124,131,138,155,157,158,172,173,182,183, 20, 0,14,16,27,29,44,70,95,101,104,115,127,140,158,161,168,170,173,181,189, 20, 6,14,17,18,23,27,50,51,83,84,93,107,108,116,122,136,154,159,172,185, 20, 11,16,17,21,32,38,45,49,55,56,84,88,102,123,126,133,173,189,195,198, 20, 0,14,21,29,30,40,63,67,93,98,116,122,131,140,150,152,174,178,183,190, 20, 8,14,28,36,44,65,72,79,84,111,114,124,130,134,140,158,182,185,193,197, 20, 9,10,12,17,28,42,46,50,57,62,90,117,132,149,168,176,178,182,187,188, 20, 2,4,22,27,31,32,65,74,108,117,132,142,153,159,160,178,180,187,192,195, 20, 2,4,7,21,56,64,67,100,103,130,135,140,147,151,156,161,167,191,193,196, 20, 6,18,24,30,50,51,67,82,84,88,93,95,106,113,138,146,168,187,190,198, 20, 28,37,44,98,99,107,112,119,129,132,135,151,156,167,168,179,182,190,198,199, 15, 4,37,61,64,67,77,93,103,105,118,136,159,169,177,193, 15, 17,44,53,61,82,90,95,103,107,122,124,145,169,186,190, 15, 21,54,80,100,110,120,126,127,132,142,149,150,162,181,186, 15, 3,7,21,22,40,41,82,94,96,98,126,140,143,147,152, 15, 4,14,58,66,80,100,107,111,126,133,140,141,148,155,167, 15, 31,38,44,48,59,74,75,77,100,105,139,168,171,182,187, 15, 0,5,55,62,66,67,74,84,92,128,160,163,188,189,195, 15, 0,36,55,73,80,96,121,133,167,173,190,191,193,195,198, 15, 21,33,41,43,52,62,69,77,88,110,114,118,139,142,187, 15, 12,14,23,29,44,58,67,74,124,149,150,156,167,171,183, 15, 22,33,36,48,60,63,90,92,107,108,137,140,144,165,193, 15, 11,24,40,45,49,59,72,123,125,132,151,161,167,179,184, 15, 4,19,20,48,61,76,98,106,136,147,155,177,183,191,192, 15, 17,22,28,35,55,74,86,90,98,106,121,138,168,190,195, 15, 24,30,35,44,55,63,80,120,128,130,148,160,163,166,192, 15, 20,30,59,64,69,94,104,106,139,140,144,147,156,161,199, 15, 13,30,38,49,54,61,86,95,103,105,131,148,156,162,180, 15, 2,25,34,41,46,63,69,81,91,113,139,159,186,188,190, 15, 1,6,14,35,47,50,66,81,90,136,137,152,156,168,195, 15, 34,37,47,52,94,100,104,105,107,131,147,171,186,191,192, 15, 9,14,29,37,109,125,137,142,145,147,151,159,167,178,192, 15, 13,45,60,62,78,99,104,118,142,143,156,179,189,191,197, 15, 3,15,23,33,66,71,82,89,99,110,113,135,143,158,171, 15, 27,39,101,102,118,133,134,138,141,144,145,148,165,169,189, 15, 12,18,20,36,50,51,53,76,86,120,141,176,178,186,198, 10, 6,8,17,77,109,112,115,124,129,193, 10, 21,31,51,58,86,112,117,126,127,143, 10, 10,74,87,108,123,134,157,180,186,190, 10, 13,14,15,44,67,118,133,142,146,193, 10, 40,44,46,66,73,128,141,161,174,192, 5, 25,117,163,165,192, 5, 40,46,105,121,134, 5, 3,12,56,90,126, 5, 13,95,98,120,188, 5, 3,98,111,128,194, 5, 4,21,51,65,73, 5, 36,106,124,132,197, 5, 5,35,57,91,144, 5, 0,19,122,177,190, 5, 85,98,111,113,134, 5, 49,85,107,139,149, 5, 54,88,102,111,172, 5, 41,74,115,170,184, 5, 33,70,123,151,159, 5, 50,82,117,123,163, -1}; /// Second example graph const GraphColorSpec g2(200, g2_e, g2_c); //@} /** * \brief %Example: Clique-based graph coloring * * \ingroup Example * */ class GraphColor : public IntMinimizeScript { private: const GraphColorSpec& g; /// Color of nodes IntVarArray v; /// Number of colors IntVar m; public: /// Model variants enum { MODEL_NONE, ///< No lower bound MODEL_CLIQUE ///< Use maximal clique size as lower bound }; /// Branching to use for model enum { BRANCH_DEGREE, ///< Choose variable with largest degree BRANCH_SIZE, ///< Choose variable with smallest size BRANCH_SIZE_DEGREE, ///< Choose variable with smallest size/degree BRANCH_SIZE_AFC, ///< Choose variable with smallest size/afc BRANCH_SIZE_ACTIVITY, ///< Choose variable with smallest size/activity }; /// Symmetry variants enum { SYMMETRY_NONE, ///< Simple symmetry SYMMETRY_LDSB ///< Use LDSB for value symmetry breaking }; /// The actual model GraphColor(const SizeOptions& opt) : g(opt.size() == 1 ? g2 : g1), v(*this,g.n_v,0,g.n_v-1), m(*this,0,g.n_v-1) { rel(*this, v, IRT_LQ, m); for (int i = 0; g.e[i] != -1; i += 2) rel(*this, v[g.e[i]], IRT_NQ, v[g.e[i+1]]); const int* c = g.c; for (int i = *c++; i--; c++) rel(*this, v[*c], IRT_EQ, i); while (*c != -1) { int n = *c; IntVarArgs x(n); c++; for (int i = n; i--; c++) x[i] = v[*c]; distinct(*this, x, opt.icl()); if (opt.model() == MODEL_CLIQUE) rel(*this, m, IRT_GQ, n-1); } /// Branching on the number of colors branch(*this, m, INT_VAL_MIN()); if (opt.symmetry() == SYMMETRY_NONE) { /// Branching without symmetry breaking switch (opt.branching()) { case BRANCH_SIZE: branch(*this, v, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); break; case BRANCH_DEGREE: branch(*this, v, tiebreak(INT_VAR_DEGREE_MAX(),INT_VAR_SIZE_MIN()), INT_VAL_MIN()); break; case BRANCH_SIZE_DEGREE: branch(*this, v, INT_VAR_DEGREE_SIZE_MAX(), INT_VAL_MIN()); break; case BRANCH_SIZE_AFC: branch(*this, v, INT_VAR_AFC_SIZE_MAX(opt.decay()), INT_VAL_MIN()); break; case BRANCH_SIZE_ACTIVITY: branch(*this, v, INT_VAR_ACTIVITY_SIZE_MAX(opt.decay()), INT_VAL_MIN()); break; default: break; } } else { // opt.symmetry() == SYMMETRY_LDSB /// Branching while considering value symmetry breaking /// (every permutation of color values gives equivalent solutions) Symmetries syms; syms << ValueSymmetry(IntArgs::create(g.n_v,0)); switch (opt.branching()) { case BRANCH_SIZE: branch(*this, v, INT_VAR_SIZE_MIN(), INT_VAL_MIN(), syms); break; case BRANCH_DEGREE: branch(*this, v, tiebreak(INT_VAR_DEGREE_MAX(),INT_VAR_SIZE_MIN()), INT_VAL_MIN(), syms); break; case BRANCH_SIZE_DEGREE: branch(*this, v, INT_VAR_DEGREE_SIZE_MAX(), INT_VAL_MIN(), syms); break; case BRANCH_SIZE_AFC: branch(*this, v, INT_VAR_AFC_SIZE_MAX(opt.decay()), INT_VAL_MIN(), syms); break; case BRANCH_SIZE_ACTIVITY: branch(*this, v, INT_VAR_ACTIVITY_SIZE_MAX(opt.decay()), INT_VAL_MIN(), syms); break; default: break; } } } /// Cost function virtual IntVar cost(void) const { return m; } /// Constructor for cloning \a s GraphColor(bool share, GraphColor& s) : IntMinimizeScript(share,s), g(s.g) { v.update(*this, share, s.v); m.update(*this, share, s.m); } /// Copying during cloning virtual Space* copy(bool share) { return new GraphColor(share,*this); } /// Print the solution virtual void print(std::ostream& os) const { os << "\tm = " << m << std::endl << "\tv[] = {"; for (int i = 0; i < v.size(); i++) { os << v[i] << ", "; if ((i+1) % 15 == 0) os << std::endl << "\t "; } os << "};" << std::endl; } }; /** \brief Main-function * \relates GraphColor */ int main(int argc, char* argv[]) { SizeOptions opt("GraphColor"); opt.icl(ICL_DOM); opt.iterations(20); opt.solutions(0); opt.model(GraphColor::MODEL_NONE); opt.model(GraphColor::MODEL_NONE, "none", "no lower bound"); opt.model(GraphColor::MODEL_CLIQUE, "clique", "use maximal clique size as lower bound"); opt.branching(GraphColor::BRANCH_DEGREE); opt.branching(GraphColor::BRANCH_DEGREE, "degree"); opt.branching(GraphColor::BRANCH_SIZE, "size"); opt.branching(GraphColor::BRANCH_SIZE_DEGREE, "sizedegree"); opt.branching(GraphColor::BRANCH_SIZE_AFC, "sizeafc"); opt.branching(GraphColor::BRANCH_SIZE_ACTIVITY, "sizeact"); opt.symmetry(GraphColor::SYMMETRY_NONE); opt.symmetry(GraphColor::SYMMETRY_NONE,"none"); opt.symmetry(GraphColor::SYMMETRY_LDSB,"ldsb","use value symmetry breaking"); opt.parse(argc,argv); Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/grocery.cpp0000755000175000010010000000675212166527420016077 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2001 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** * \brief %Example: %Grocery puzzle * * A kid goes into a grocery store and buys four items. The cashier * charges $7.11, the kid pays and is about to leave when the cashier * calls the kid back, and says ''Hold on, I multiplied the four items * instead of adding them; I'll try again; Hah, with adding them the * price still comes to $7.11''. What were the prices of the four items? * * The model is taken from: Christian Schulte, Gert Smolka, Finite Domain * Constraint Programming in Oz. A Tutorial. 2001. * Available from: http://www.mozart-oz.org/documentation/fdt/ * * \ingroup Example * */ class Grocery : public Script { protected: /// The price of each item IntVarArray abcd; /// Sum and product of prices static const int s = 711; /// Decimal product of prices static const int p = 711 * 100 * 100 * 100; public: /// The actual model Grocery(const Options& opt) : abcd(*this,4,0,s) { IntVar a(abcd[0]), b(abcd[1]), c(abcd[2]), d(abcd[3]); // The sum of all variables is s rel(*this, a+b+c+d == s, opt.icl()); // The product of all variables is s (corrected by scale factor) rel(*this, (a*b)*(c*d) == p, opt.icl()); // Break symmetries: order the variables rel(*this, abcd, IRT_LQ); branch(*this, abcd, INT_VAR_NONE(), INT_VAL_SPLIT_MAX()); } /// Constructor for cloning \a s Grocery(bool share, Grocery& s) : Script(share,s) { abcd.update(*this, share, s.abcd); } /// Copy during cloning virtual Space* copy(bool share) { return new Grocery(share,*this); } /// Print solution virtual void print(std::ostream& os) const { os << "\t" << abcd << std::endl; } }; /** \brief Main-function * \relates Grocery */ int main(int argc, char* argv[]) { Options opt("Grocery"); opt.iterations(20); opt.parse(argc,argv); Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/hamming.cpp0000644000175000010010000001003612166527420016030 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * * Copyright: * Guido Tack, 2004 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include using namespace Gecode; /** * \brief %Options for %Hamming problems * */ class HammingOptions : public Options { private: /// Number of bits Driver::UnsignedIntOption _bits; /// Minimum distance Driver::UnsignedIntOption _distance; /// Number of symbols Driver::UnsignedIntOption _size; public: /// Initialize options for example with name \a s HammingOptions(const char* s, unsigned int bits0, unsigned int distance0, unsigned int size0) : Options(s), _bits("-bits","word size in bits",bits0), _distance("-distance","minimum distance",distance0), _size("-size","number of symbols",size0) { add(_bits); add(_distance); add(_size); } /// Return number of bits unsigned int bits(void) const { return _bits.value(); } /// Return minimum distance unsigned int distance(void) const { return _distance.value(); } /// Return number of symbols unsigned int size(void) const { return _size.value(); } }; /** * \brief %Example: Generating %Hamming codes * * Generate a Hamming code that fits in b-bit words to code n symbols where * the Hamming distance between every two symbol codes is at least d. * The Hamming distance between two words is the number of bit positions * where they differ. * * \ingroup Example * */ class Hamming : public Script { private: /// The hamming code SetVarArray x; public: /// Actual model Hamming(const HammingOptions& opt) : x(*this,opt.size(),IntSet::empty,1,opt.bits()) { SetVarArgs cx(x.size()); for (int i=x.size(); i--;) cx[i] = expr(*this, -x[i]); for (int i=0; i= opt.distance()); branch(*this, x, SET_VAR_NONE(), SET_VAL_MIN_INC()); } /// Print solution virtual void print(std::ostream& os) const { for (int i=0; i(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/ind-set.cpp0000644000175000010010000000751112166527420015757 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2002 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** * \name %Graph specification for independent sets * * \relates IndSet */ //@{ /// %Graph specification class Graph { public: const int n_v; ///< Number of vertices const int n_e; ///< Number of edges const int* e; ///< Arrays of edges (as vertex pairs) Graph(const int n_v0, const int n_e0, const int* e0) : n_v(n_v0), n_e(n_e0), e(e0) {} }; const int e_20_10[] = { 0, 4, 2,12, 12,14, 18,19, 7,10, 9,12, 5,11, 6,15, 3,18, 7,16 }; const Graph g_20_10(20,10,e_20_10); const int e_40_20[] = { 21,30, 11,30, 19,38, 20,25, 11,24, 20,33, 8,39, 4, 5, 6,16, 5,32, 0, 9, 5,24, 25,28, 36,38, 14,20, 19,25, 11,22, 13,30, 7,36, 15,33 }; const Graph g_40_20(40, 20, e_40_20); //@} /** * \brief %Example: Independent sets in a graph * * \ingroup Example * */ class IndSet : public IntMaximizeScript { protected: /// %Graph used const Graph& g; /// Whether vertex included in independent set BoolVarArray v; /// How many elements has indipendent set IntVar k; public: /// Actual model IndSet(const SizeOptions& opt) : g(opt.size() == 0 ? g_20_10 : g_40_20), v(*this,g.n_v,0,1), k(*this,0,g.n_v) { const int* e = g.e; for (int i = g.n_e; i--; ) { const int* e1 = e++; const int* e2 = e++; rel(*this, v[*e1], BOT_AND, v[*e2], 0); } linear(*this, v, IRT_EQ, k); branch(*this, v, INT_VAR_NONE(), INT_VAL_MIN()); } /// Constructor for cloning \a s IndSet(bool share, IndSet& s) : IntMaximizeScript(share,s), g(s.g) { v.update(*this, share, s.v); k.update(*this, share, s.k); } /// Copy during cloning virtual Space* copy(bool share) { return new IndSet(share,*this); } /// Print solution virtual void print(std::ostream& os) const { os << "\tk = " << k << std::endl << "\tv[] = " << v << std::endl; } /// Return solution cost virtual IntVar cost(void) const { return k; } }; /** \brief Main-function * \relates IndSet */ int main(int argc, char* argv[]) { SizeOptions opt("IndSet"); opt.solutions(0); opt.size(1); opt.iterations(2000); opt.parse(argc,argv); IntMaximizeScript::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/kakuro.cpp0000755000175000010010000005740012166527420015715 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Contributing authors: * Mikael Lagerkvist * * Copyright: * Christian Schulte, 2007 * Mikael Lagerkivst, 2007 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; namespace { /** \name %Kakuro specifications * * Each specification starts with two integers for width and height, * followed by entries for vertical constraints, an integer -1 * (signalling the end of the vertical constraints), entries * for the horizontal constraints, and, finally, an integer -1. * * Each entry consists of four integers: * - the x-coordinate of the hint * - the y-coordinate of the hint * - the number of fields in the respective direction * - the sum of the fields * * The example are taken from the website of Nikoli (from the free * section). Thanks to Nikoli for their great puzzles and their * brilliant website: www.nikoli.com. * * \relates Kakuro */ //@{ // Easy, Author: Casty const int k0[] = { // Dimension w x h 12,10, // Vertical constraints 2, 0, 5,16, 3, 0, 2, 4, 5, 0, 3, 6, 6, 0, 2, 4, 7, 0, 5,15, 10, 0, 3, 6, 11, 0, 3, 7, 1, 1, 3, 7, 9, 1, 5,16, 4, 2, 2, 5, 8, 2, 2, 3, 3, 3, 5,16, 6, 3, 3, 8, 5, 4, 5,15, 10, 4, 5,15, 4, 5, 2, 3, 8, 5, 2, 4, 11, 5, 3, 7, 1, 6, 3, 6, 2, 6, 3, 7, 7, 6, 3, 7, 6, 7, 2, 3, 9, 7, 2, 4, -1, // Horizontal constraints 1, 1, 2, 7, 4, 1, 3, 9, 9, 1, 2, 4, 0, 2, 3, 7, 4, 2, 3, 7, 8, 2, 3, 6, 0, 3, 2, 3, 3, 3, 2, 4, 6, 3, 5,16, 0, 4, 4,10, 5, 4, 4,10, 1, 5, 2,10, 4, 5, 3, 6, 8, 5, 2, 5, 2, 6, 4,10, 7, 6, 4,12, 0, 7, 5,16, 6, 7, 2, 4, 9, 7, 2, 4, 0, 8, 3, 7, 4, 8, 3, 8, 8, 8, 3, 6, 0, 9, 2, 3, 4, 9, 3, 7, 8, 9, 2, 3, -1 }; // Easy, Author: Ogawa Minori const int k1[] = { // Dimension w x h 12,10, // Vertical constraints 1, 0, 2, 4, 2, 0, 5,15, 5, 0, 5,18, 6, 0, 2,12, 7, 0, 3, 8, 10, 0, 3,24, 11, 0, 3,23, 3, 1, 2, 7, 9, 1, 3,24, 4, 2, 5,16, 8, 2, 5,35, 1, 3, 2,12, 6, 3, 3,17, 7, 4, 5,34, 10, 4, 5,34, 11, 4, 2,16, 3, 5, 3, 6, 1, 6, 3, 7, 2, 6, 3, 6, 5, 6, 3,23, 9, 6, 2,10, 6, 7, 2,14, 11, 7, 2,10, -1, // Horizontal constraints 0, 1, 2, 3, 4, 1, 3,15, 9, 1, 2,16, 0, 2, 3, 6, 4, 2, 3, 7, 8, 2, 3,24, 1, 3, 4,11, 6, 3, 5,34, 0, 4, 2,14, 3, 4, 3,23, 7, 4, 2,14, 0, 5, 2, 7, 3, 5, 5,15, 9, 5, 2,17, 2, 6, 2, 6, 5, 6, 3,23, 9, 6, 2,13, 0, 7, 5,16, 6, 7, 4,30, 0, 8, 3, 6, 4, 8, 3,23, 8, 8, 3, 7, 0, 9, 2, 4, 4, 9, 3,24, 9, 9, 2,17, -1 }; // Easy, Author: SAKAMOTO, Nobuyuki const int k2[] = { // Dimension w x h 12,10, // Vertical constraints 2, 0, 5,15, 3, 0, 2, 3, 7, 0, 3, 7, 8, 0, 4,23, 9, 0, 2,12, 10, 0, 3,20, 11, 0, 3, 9, 4, 1, 3, 7, 5, 1, 4,10, 1, 2, 3, 6, 6, 2, 5,15, 9, 3, 2,16, 3, 4, 2, 3, 7, 4, 4,13, 10, 4, 5,35, 11, 4, 3,23, 4, 5, 4,11, 8, 5, 3,23, 1, 6, 3,23, 2, 6, 3,14, 5, 6, 3,11, 3, 7, 2,13, 9, 7, 2,17, -1, // Horizontal constraints 1, 1, 2, 4, 6, 1, 5,15, 1, 2, 4,11, 6, 2, 5,34, 0, 3, 2, 3, 3, 3, 5,15, 9, 3, 2,10, 0, 4, 2, 4, 3, 4, 3, 6, 7, 4, 2,17, 0, 5, 3, 7, 4, 5, 3, 8, 8, 5, 3,18, 2, 6, 2, 3, 5, 6, 3,11, 9, 6, 2,16, 0, 7, 2,16, 3, 7, 5,16, 9, 7, 2,17, 0, 8, 5,16, 6, 8, 4,30, 0, 9, 5,35, 8, 9, 2,17, -1 }; // Easy, Author: country mushroom const int k3[] = { // Dimension w x h 12,10, // Vertical constraints 3, 0, 3, 7, 4, 0, 6,21, 7, 0, 4,29, 8, 0, 2,17, 10, 0, 4,29, 11, 0, 3,23, 2, 1, 3, 6, 6, 1, 2,16, 9, 1, 4,14, 1, 2, 2, 4, 5, 2, 2, 3, 8, 3, 6,22, 3, 4, 4,10, 2, 5, 4,11, 5, 5, 4,10, 7, 5, 2,10, 10, 5, 3,24, 11, 5, 2,16, 1, 6, 3, 7, 6, 6, 2, 9, 9, 6, 3,23, 4, 7, 2, 4, -1, // Horizontal constraints 2, 1, 2, 4, 6, 1, 2,17, 9, 1, 2,16, 1, 2, 3, 6, 5, 2, 6,39, 0, 3, 7,28, 8, 3, 3,24, 0, 4, 2, 3, 3, 4, 2, 3, 6, 4, 4,20, 2, 5, 2, 9, 7, 5, 2, 4, 1, 6, 4,10, 6, 6, 2, 3, 9, 6, 2,16, 0, 7, 3, 6, 4, 7, 7,42, 0, 8, 6,21, 7, 8, 3,21, 0, 9, 2, 4, 3, 9, 2, 3, 7, 9, 2,16, -1 }; // Medium, Author: Komieda const int k4[] = { // Dimension w x h 20,12, // Vertical constraints 3, 0, 3,21, 4, 0, 2, 4, 5, 0, 4,11, 8, 0, 2, 8, 9, 0, 3, 7, 11, 0, 2, 3, 12, 0, 3, 6, 15, 0, 6,39, 16, 0, 2, 3, 17, 0, 3,23, 2, 1, 5,15, 6, 1, 4,10, 10, 1, 4,11, 14, 1, 4,11, 18, 1, 3, 6, 1, 2, 3,24, 7, 2, 4,14, 13, 2, 2,10, 19, 2, 2,16, 4, 3, 5,18, 8, 3, 4,10, 11, 3, 4,12, 16, 3, 5,33, 3, 4, 3,23, 9, 4, 4,29, 12, 4, 4,30, 17, 4, 3,18, 5, 5, 6,38, 13, 5, 4,29, 18, 5, 5,15, 6, 6, 4,25, 10, 6, 4,12, 14, 6, 4,28, 19, 6, 3,21, 1, 7, 2, 4, 2, 7, 3, 7, 7, 7, 2, 7, 15, 7, 4,11, 3, 8, 3,19, 8, 8, 3,24, 11, 8, 3, 7, 17, 8, 3, 6, 4, 9, 2,16, 9, 9, 2,16, 12, 9, 2,17, 16, 9, 2, 5, -1, // Horizontal constraints 2, 1, 3, 7, 7, 1, 2, 4, 10, 1, 2, 4, 14, 1, 3,19, 1, 2, 5,18, 7, 2, 5,15, 13, 2, 5,16, 0, 3, 3,21, 4, 3, 3, 6, 8, 3, 2, 3, 11, 3, 4,11, 16, 3, 3,20, 0, 4, 2,14, 3, 4, 5,15, 9, 4, 2, 3, 12, 4, 4,29, 17, 4, 2, 8, 0, 5, 4,27, 5, 5, 7,42, 13, 5, 4,12, 1, 6, 4,12, 6, 6, 3, 8, 10, 6, 3,20, 14, 6, 4,29, 2, 7, 4,28, 7, 7, 7,28, 15, 7, 4,28, 0, 8, 2, 3, 3, 8, 4,11, 8, 8, 2,10, 11, 8, 5,35, 17, 8, 2,10, 0, 9, 3, 6, 4, 9, 4,30, 9, 9, 2, 3, 12, 9, 3,19, 16, 9, 3, 7, 1,10, 5,34, 7,10, 5,34, 13,10, 5,17, 2,11, 3,23, 7,11, 2,17, 10,11, 2,10, 14,11, 3, 6, -1 }; // Medium, Author: crimson const int k5[] = { // Dimension w x h 20,12, // Vertical constraints 1, 0, 2, 3, 2, 0, 5,33, 4, 0, 2, 8, 5, 0, 4,14, 7, 0, 5,15, 8, 0, 3,19, 9, 0, 2,12, 11, 0, 4,11, 12, 0, 2, 4, 13, 0, 5,16, 15, 0, 4,11, 16, 0, 2,17, 18, 0, 5,34, 19, 0, 2,17, 3, 1, 2, 3, 10, 1, 9,45, 17, 1, 2,16, 6, 2, 3,20, 14, 2, 3,12, 1, 3, 2,13, 4, 3, 5,33, 9, 3, 3,20, 16, 3, 5,21, 19, 3, 2, 8, 3, 4, 3,11, 8, 4, 3,11, 12, 4, 3, 7, 17, 4, 3, 8, 11, 5, 3,23, 1, 6, 2,11, 2, 6, 5,15, 6, 6, 3,23, 7, 6, 5,27, 13, 6, 5,30, 14, 6, 3, 7, 18, 6, 5,15, 19, 6, 2, 3, 5, 7, 4,26, 9, 7, 4,27, 15, 7, 4,27, 3, 8, 2, 7, 12, 8, 3,24, 17, 8, 2,17, 1, 9, 2, 5, 4, 9, 2, 9, 8, 9, 2, 3, 11, 9, 2,16, 16, 9, 2,16, 19, 9, 2,10, -1, // Horizontal constraints 0, 1, 2, 4, 3, 1, 2, 7, 6, 1, 3, 7, 10, 1, 3, 7, 14, 1, 2,11, 17, 1, 2,16, 0, 2, 5,16, 6, 2, 7,42, 14, 2, 5,35, 1, 3, 2,10, 4, 3, 4,15, 9, 3, 2, 6, 12, 3, 3, 7, 16, 3, 2,13, 0, 4, 2,17, 3, 4, 4,29, 8, 4, 3,19, 12, 4, 4,11, 17, 4, 2, 9, 0, 5, 4,29, 5, 5, 5,33, 11, 5, 3, 6, 15, 5, 4,29, 2, 6, 2, 4, 7, 6, 5,16, 15, 6, 2, 4, 0, 7, 4,12, 5, 7, 3,10, 9, 7, 5,18, 15, 7, 4,12, 0, 8, 2,13, 3, 8, 4,29, 8, 8, 3,24, 12, 8, 4,23, 17, 8, 2, 5, 1, 9, 2, 6, 4, 9, 3,24, 8, 9, 2, 4, 11, 9, 4,28, 16, 9, 2,11, 0,10, 5,15, 6,10, 7,41, 14,10, 5,34, 0,11, 2, 3, 3,11, 2,17, 6,11, 3,14, 10,11, 3,23, 14,11, 2,11, 17,11, 2, 4, -1 }; // Hard, Author: Yuichi Saito const int k6[] = { // Dimension w x h 20,12, // Vertical constraints 1, 0, 2, 6, 2, 0, 2,16, 4, 0, 3,10, 5, 0, 2,12, 9, 0, 7,28, 10, 0, 2,12, 11, 0, 3,24, 15, 0, 3,10, 16, 0, 2,17, 17, 0, 6,22, 3, 1, 3,18, 6, 1, 4,10, 8, 1, 2, 8, 12, 1, 2,10, 13, 1, 3,18, 18, 1, 3,12, 7, 2, 4,11, 14, 2, 3, 7, 19, 2, 2, 7, 1, 3, 2, 8, 2, 3, 3, 7, 5, 3, 4,25, 10, 3, 2, 4, 16, 3, 4,15, 4, 4, 4,11, 11, 4, 7,42, 12, 4, 2,17, 15, 4, 4,26, 3, 5, 6,22, 8, 5, 2,16, 13, 5, 4,30, 18, 5, 3,24, 6, 6, 3, 7, 10, 6, 2, 4, 14, 6, 4,29, 19, 6, 2,14, 1, 7, 2,16, 2, 7, 3,11, 7, 7, 3,24, 17, 7, 3,21, 5, 8, 3,23, 8, 8, 2,12, 9, 8, 3,20, 12, 8, 2,17, 16, 8, 3, 6, 4, 9, 2, 9, 10, 9, 2,16, 15, 9, 2, 9, 18, 9, 2, 3, 19, 9, 2,12, -1, // Horizontal constraints 0, 1, 2,10, 3, 1, 2, 5, 8, 1, 3,23, 14, 1, 3,11, 0, 2, 6,38, 7, 2, 6,39, 14, 2, 4,30, 2, 3, 2,10, 5, 3, 4,11, 10, 3, 5,18, 16, 3, 3, 7, 0, 4, 3, 7, 4, 4, 3, 7, 8, 4, 2, 6, 12, 4, 2, 8, 15, 4, 4,11, 0, 5, 2, 8, 3, 5, 4,14, 8, 5, 4,24, 13, 5, 4,10, 1, 6, 4,13, 6, 6, 3,14, 10, 6, 3,19, 14, 6, 4,29, 2, 7, 4,15, 7, 7, 4,14, 12, 7, 4,29, 17, 7, 2,16, 0, 8, 4,29, 5, 8, 2,13, 9, 8, 2, 8, 12, 8, 3,23, 16, 8, 3,22, 0, 9, 3,10, 4, 9, 5,32, 10, 9, 4,29, 15, 9, 2,10, 1,10, 4,14, 6,10, 6,39, 13,10, 6,22, 2,11, 3,21, 8,11, 3,23, 14,11, 2, 6, 17,11, 2,11, -1 }; // Hard, Author: mimic const int k7[] = { // Dimension w x h 22,14, // Vertical constraints 1, 0, 3,23, 2, 0, 4,29, 3, 0, 2,16, 7, 0, 2, 7, 8, 0, 2,10, 9, 0, 5,30, 13, 0, 7,41, 14, 0, 2,16, 15, 0, 4,29, 17, 0, 2, 3, 18, 0, 6,21, 20, 0, 3, 7, 21, 0, 2, 4, 4, 1, 5,35, 6, 1, 2, 4, 10, 1, 2,17, 12, 1, 3,24, 19, 1, 9,45, 5, 2, 3,23, 11, 2, 9,45, 16, 2, 4,21, 3, 3, 9,45, 7, 3, 5,15, 8, 3, 4,10, 14, 3, 2,10, 17, 3, 2, 3, 6, 4, 2, 4, 10, 4, 4,30, 20, 4, 4,11, 2, 5, 4,13, 12, 5, 4,30, 15, 5, 5,35, 21, 5, 2, 4, 1, 6, 2, 4, 9, 6, 7,41, 14, 6, 4,29, 4, 7, 6,38, 6, 7, 4,11, 16, 7, 2,16, 18, 7, 5,15, 5, 8, 2, 9, 8, 8, 2,17, 13, 8, 5,16, 17, 8, 3, 7, 7, 9, 4,20, 10, 9, 3,23, 20, 9, 4,12, 2,10, 3,23, 12,10, 2, 6, 16,10, 2, 4, 21,10, 3, 9, 1,11, 2,16, 5,11, 2,16, 8,11, 2,16, 14,11, 2, 6, 15,11, 2, 4, 19,11, 2, 4, -1, // Horizontal constraints 0, 1, 3,23, 6, 1, 3, 8, 12, 1, 3,23, 16, 1, 2, 4, 19, 1, 2, 4, 0, 2, 4,30, 5, 2, 5,31, 11, 2, 4,29, 16, 2, 5,15, 0, 3, 2,16, 3, 3, 3,19, 8, 3, 5,32, 14, 3, 2,17, 17, 3, 3, 8, 1, 4, 4,29, 6, 4, 3, 9, 10, 4, 9,45, 2, 5, 9,45, 12, 5, 2,17, 15, 5, 5,16, 1, 6, 3,24, 5, 6, 3, 6, 9, 6, 4,30, 14, 6, 2,16, 17, 6, 4,11, 0, 7, 3, 7, 6, 7, 9,45, 18, 7, 3, 7, 0, 8, 4,11, 5, 8, 2, 4, 8, 8, 4,29, 13, 8, 3,23, 17, 8, 3, 7, 1, 9, 5,16, 7, 9, 2,17, 10, 9, 9,45, 2,10, 9,45, 12,10, 3,23, 16,10, 4,14, 1,11, 3,24, 5,11, 2, 6, 8,11, 5,16, 15,11, 3, 7, 19,11, 2, 8, 0,12, 5,35, 6,12, 4,30, 11,12, 5,15, 17,12, 4,11, 0,13, 2,17, 3,13, 2,16, 6,13, 3,24, 12,13, 3, 6, 18,13, 3, 7, -1 }; // Hard, Author: OX const int k8[] = { // Dimension w x h 22,14, // Vertical constraints 1, 0, 2, 4, 2, 0, 5,15, 5, 0, 5,16, 6, 0, 2,10, 7, 0, 3,18, 8, 0, 4,29, 10, 0, 5,16, 11, 0, 2, 6, 13, 0, 2, 8, 14, 0, 5,16, 15, 0, 6,38, 18, 0, 5,15, 19, 0, 2, 8, 20, 0, 3, 7, 21, 0, 3, 8, 3, 1, 9,45, 16, 1, 2, 4, 4, 2, 2, 3, 9, 2, 8,39, 17, 2, 2, 3, 1, 3, 2, 5, 6, 3, 6,22, 11, 3, 3,22, 13, 3, 8,38, 19, 3, 9,45, 7, 4, 2, 4, 12, 4, 3,24, 16, 4, 6,38, 20, 4, 3,24, 4, 5, 2,16, 8, 5, 2,14, 17, 5, 2,16, 21, 5, 2,11, 1, 6, 2, 4, 2, 6, 3, 8, 5, 6, 2, 7, 10, 6, 3,18, 14, 6, 2,16, 18, 6, 2,16, 7, 7, 6,22, 11, 7, 3, 7, 15, 7, 2,15, 4, 8, 5,35, 8, 8, 5,34, 12, 8, 5,34, 17, 8, 5,34, 20, 8, 5,34, 21, 8, 2, 3, 5, 9, 2,16, 14, 9, 4,12, 18, 9, 2, 7, 1,10, 3,23, 2,10, 3,21, 6,10, 2, 9, 15,10, 3,20, 3,11, 2,17, 9,11, 2, 4, 11,11, 2, 4, 16,11, 2,10, 21,11, 2,16, -1, // Horizontal constraints 0, 1, 2, 6, 4, 1, 4,30, 9, 1, 2, 6, 12, 1, 3,10, 17, 1, 4,12, 0, 2, 3, 8, 4, 2, 4,11, 9, 2, 2, 4, 12, 2, 4,20, 17, 2, 4,11, 1, 3, 4,12, 6, 3, 4,28, 13, 3, 5,15, 19, 3, 2, 5, 0, 4, 6,22, 7, 4, 4,28, 12, 4, 3, 8, 16, 4, 3, 6, 0, 5, 3, 7, 4, 5, 3, 7, 8, 5, 8,40, 17, 5, 3,22, 2, 6, 2, 8, 5, 6, 4,12, 10, 6, 3,23, 14, 6, 3,22, 18, 6, 3,22, 0, 7, 6,38, 7, 7, 3,24, 11, 7, 3,23, 15, 7, 6,39, 0, 8, 3, 6, 4, 8, 3, 6, 8, 8, 3, 6, 12, 8, 4,29, 17, 8, 2,14, 1, 9, 3,18, 5, 9, 8,36, 14, 9, 3,22, 18, 9, 3,10, 2,10, 3,22, 6,10, 3,24, 10,10, 4,10, 15,10, 6,21, 0,11, 2,16, 3,11, 5,34, 11,11, 4,29, 16,11, 4,30, 0,12, 4,29, 5,12, 4,12, 10,12, 2,10, 13,12, 4,10, 18,12, 3,23, 0,13, 4,28, 6,13, 3, 7, 10,13, 2,11, 13,13, 4,28, 19,13, 2,13, -1 }; // Hard, Author: TAKEI Daisuke const int k9[] = { // Dimension w x h 22,14, // Vertical constraints 1, 0, 4,10, 2, 0, 4,24, 3, 0, 3, 7, 7, 0, 3, 8, 8, 0, 2,17, 9, 0, 3,13, 13, 0, 3,22, 14, 0, 2,12, 15, 0, 3,24, 19, 0, 3,19, 20, 0, 4,28, 21, 0, 4,14, 4, 1, 5,16, 6, 1, 5,17, 10, 1, 5,32, 12, 1, 5,34, 16, 1, 5,35, 18, 1, 5,31, 5, 2, 3, 9, 11, 2, 3, 7, 17, 2, 3, 7, 3, 4, 5,27, 7, 4, 5,16, 9, 4, 5,20, 13, 4, 5,30, 15, 4, 5,30, 19, 4, 5,26, 1, 5, 3,12, 2, 5, 3,20, 8, 5, 3,22, 14, 5, 3, 9, 20, 5, 3,10, 21, 5, 3,20, 4, 7, 5,31, 6, 7, 5,16, 10, 7, 5,17, 12, 7, 5,32, 16, 7, 5,19, 18, 7, 5,34, 5, 8, 3, 8, 11, 8, 3,24, 17, 8, 3,24, 1, 9, 4,10, 2, 9, 4,15, 20, 9, 4,30, 21, 9, 4,12, 3,10, 3,20, 7,10, 3, 6, 9,10, 3, 9, 13,10, 3, 6, 15,10, 3, 7, 19,10, 3,24, 8,11, 2, 8, 14,11, 2, 7, -1, // Horizontal constraints 0, 1, 3, 7, 6, 1, 3,12, 12, 1, 3,23, 18, 1, 3,23, 0, 2, 4,11, 5, 2, 5,19, 11, 2, 5,33, 17, 2, 4,28, 0, 3, 7,28, 8, 3, 5,34, 14, 3, 7,29, 0, 4, 2,12, 3, 4, 3, 7, 9, 4, 3,16, 15, 4, 3,10, 19, 4, 2,10, 2, 5, 5,18, 8, 5, 5,20, 14, 5, 5,29, 0, 6, 4,24, 5, 6, 5,35, 11, 6, 5,23, 17, 6, 4,26, 0, 7, 3,23, 6, 7, 3, 9, 12, 7, 3,10, 18, 7, 3,23, 0, 8, 4,15, 5, 8, 5,19, 11, 8, 5,33, 17, 8, 4,10, 2, 9, 5,19, 8, 9, 5,35, 14, 9, 5,31, 0,10, 2, 4, 3,10, 3,10, 9,10, 3,18, 15,10, 3,24, 19,10, 2,12, 0,11, 7,41, 8,11, 5,23, 14,11, 7,36, 0,12, 4,14, 5,12, 5,17, 11,12, 5,15, 17,12, 4,26, 0,13, 3, 7, 6,13, 3, 7, 12,13, 3, 6, 18,13, 3,23, -1 }; //@} /// Array of all examples const int* examples[] = { &k0[0], &k1[0], &k2[0], &k3[0], &k4[0], &k5[0], &k6[0], &k7[0], &k8[0], &k9[0] }; /// Number of examples const unsigned int n_examples = sizeof(examples)/sizeof(const int*); /** \brief Class for solutions of a distinct-linear constraint problem. * \relates Kakuro */ class DistinctLinear : public Space { protected: /// The variables IntVarArray x; public: /// The actual problem DistinctLinear(int n, int s) : x(*this,n,1,9) { distinct(*this, x); linear(*this, x, IRT_EQ, s); branch(*this, x, INT_VAR_NONE(), INT_VAL_SPLIT_MIN()); } /// Constructor for cloning \a s DistinctLinear(bool share, DistinctLinear& s) : Space(share,s) { x.update(*this, share, s.x); } /// Perform copying during cloning virtual Space* copy(bool share) { return new DistinctLinear(share,*this); } /// Return a solution IntArgs solution(void) const { IntArgs s(x.size()); for (int i=0; i d(e); delete e; TupleSet ts; while (DistinctLinear* s = d.next()) { ts.add(s->solution()); delete s; } ts.finalize(); return ts; } /** \brief Class to remember already computed specifications * \relates Kakuro */ class Cache { private: /// Cache entry class Entry { public: int n; ///< Number of variables int c; ///< Sum of variables TupleSet ts; ///< The previously computed tuple set Entry* next; ///< The next cache entry }; Entry* cache; ///< Where all entries start public: /// Initialize cache as empty Cache(void) : cache(NULL) {} /// Return possibly cached Data for \a n distinct variables with sum \a c TupleSet get(int n, int c) { for (Entry* e = cache; e != NULL; e = e->next) if ((e->n == n) && (e->c == c)) return e->ts; { Entry* e = new Entry; e->n = n; e->c = c; e->ts = generate(n,c); e->next = cache; cache = e; } return cache->ts; } /// Delete cache entries ~Cache(void) { Entry* e = cache; while (e != NULL) { Entry* d = e; e = e->next; delete d; } } }; } /** * \brief %Example: %Kakuro * * Another puzzle in the style of Sudoku. * * Note that "Modeling and Programming with Gecode" uses this example * as a case study. * * \ingroup Example */ class Kakuro : public Script { protected: const int w; ///< Width of board const int h; ///< Height of board IntVarArray f; ///< Variables for fields of board public: /// Model variants enum { MODEL_DECOMPOSE,///< Decompose constraints MODEL_COMBINE, ///< Combine distinct and linear constraint }; /// Init the variable \a x if necessary IntVar init(IntVar& x) { if (x.min() == 0) x = IntVar(*this,1,9); return x; } /// Post a distinct-linear constraint on variables \a x with sum \a c void distinctlinear(Cache& dc, const IntVarArgs& x, int c, const SizeOptions& opt) { int n=x.size(); if (opt.model() == MODEL_DECOMPOSE) { if (n < 8) linear(*this, x, IRT_EQ, c, opt.icl()); else if (n == 8) rel(*this, x, IRT_NQ, 9*(9+1)/2 - c); distinct(*this, x, opt.icl()); } else { switch (n) { case 0: return; case 1: rel(*this, x[0], IRT_EQ, c); return; case 8: // Prune the single missing digit rel(*this, x, IRT_NQ, 9*(9+1)/2 - c); break; case 9: break; default: if (c == n*(n+1)/2) { // sum has unique decomposition: 1 + ... + n rel(*this, x, IRT_LQ, n); } else if (c == n*(n+1)/2 + 1) { // sum has unique decomposition: 1 + ... + n-1 + n+1 rel(*this, x, IRT_LQ, n+1); rel(*this, x, IRT_NQ, n); } else if (c == 9*(9+1)/2 - (9-n)*(9-n+1)/2) { // sum has unique decomposition: (9-n+1) + (9-n+2) + ... + 9 rel(*this, x, IRT_GQ, 9-n+1); } else if (c == 9*(9+1)/2 - (9-n)*(9-n+1)/2 + 1) { // sum has unique decomposition: (9-n) + (9-n+2) + ... + 9 rel(*this, x, IRT_GQ, 9-n); rel(*this, x, IRT_NQ, 9-n+1); } else { extensional(*this, x, dc.get(n,c)); return; } } distinct(*this, x, opt.icl()); } } /// The actual problem Kakuro(const SizeOptions& opt) : w(examples[opt.size()][0]), h(examples[opt.size()][1]), f(*this,w*h) { IntVar black(*this,0,0); // Initialize all fields as black (unused). Only if a field // is actually used in a constraint, create a fresh variable // for it (done via init). for (int i=w*h; i--; ) f[i] = black; // Cache of already computed tuple sets Cache cache; // Matrix for accessing board fields Matrix b(f,w,h); // Access to hints const int* k = &examples[opt.size()][2]; // Process vertical hints while (*k >= 0) { int x=*k++; int y=*k++; int n=*k++; int s=*k++; IntVarArgs col(n); for (int i=n; i--; ) col[i]=init(b(x,y+i+1)); distinctlinear(cache,col,s,opt); } k++; // Process horizontal hints while (*k >= 0) { int x=*k++; int y=*k++; int n=*k++; int s=*k++; IntVarArgs row(n); for (int i=n; i--; ) row[i]=init(b(x+i+1,y)); distinctlinear(cache,row,s,opt); } branch(*this, f, INT_VAR_AFC_SIZE_MAX(opt.decay()), INT_VAL_SPLIT_MIN()); } /// Constructor for cloning \a s Kakuro(bool share, Kakuro& s) : Script(share,s), w(s.w), h(s.h) { f.update(*this, share, s.f); } /// Perform copying during cloning virtual Space* copy(bool share) { return new Kakuro(share,*this); } /// Print solution virtual void print(std::ostream& os) const { Matrix b(f,w,h); for (int y=0; y= n_examples) { std::cerr << "Error: size must be between 0 and " << n_examples-1 << std::endl; return 1; } Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/knights.cpp0000644000175000010010000003044112166527420016061 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Mikael Lagerkvist * Christian Schulte * * Copyright: * Mikael Lagerkvist, 2008 * Christian Schulte, 2001 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #if defined(GECODE_HAS_QT) && defined(GECODE_HAS_GIST) #include #if QT_VERSION >= 0x050000 #include #endif #endif using namespace Gecode; /** \brief Custom brancher for knight's tours using Warnsdorff's rule * * This class implements Warnsdorff's rule for finding knight's * tours. The next position is choosen by taking the jump that * minimizes the number of alternatives in the next step. * * \relates Knights */ class Warnsdorff : public Brancher { protected: /// Views of the brancher ViewArray x; /// Next variable to branch on mutable int start; /// %Choice class Choice : public Gecode::Choice { public: /// Position of variable int pos; /// Value of variable int val; /** Initialize choice for brancher \a b, position \a pos0, * and value \a val0. */ Choice(const Brancher& b, int pos0, int val0) : Gecode::Choice(b,2), pos(pos0), val(val0) {} /// Report size occupied virtual size_t size(void) const { return sizeof(Choice); } /// Archive into \a e virtual void archive(Archive& e) const { Gecode::Choice::archive(e); e << pos << val; } }; /// Construct brancher Warnsdorff(Home home, ViewArray& xv) : Brancher(home), x(xv), start(0) {} /// Copy constructor Warnsdorff(Space& home, bool share, Warnsdorff& b) : Brancher(home, share, b), start(b.start) { x.update(home, share, b.x); } public: /// Check status of brancher, return true if alternatives left virtual bool status(const Space&) const { // A path to follow can be at most x.size() long for (int n=x.size(); n--; ) { if (!x[start].assigned()) return true; // Follow path of assigned variables start = x[start].val(); } return false; } /// Return choice virtual Gecode::Choice* choice(Space&) { Int::ViewValues iv(x[start]); int n = iv.val(); unsigned int min = x[n].size(); ++iv; // Choose the value with the fewest neighbors while (iv()) { if (x[iv.val()].size() < min) { n = iv.val(); min = x[n].size(); } ++iv; } return new Choice(*this, start, n); } /// Return choice virtual Choice* choice(const Space&, Archive& e) { int pos, val; e >> pos >> val; return new Choice(*this, pos, val); } /// Perform commit for choice \a _c and alternative \a a virtual ExecStatus commit(Space& home, const Gecode::Choice& _c, unsigned int a) { const Choice& c = static_cast(_c); if (a == 0) return me_failed(x[c.pos].eq(home, c.val)) ? ES_FAILED : ES_OK; else return me_failed(x[c.pos].nq(home, c.val)) ? ES_FAILED : ES_OK; } /// Print explanation virtual void print(const Space&, const Gecode::Choice& _c, unsigned int a, std::ostream& o) const { const Choice& c = static_cast(_c); o << "x[" << c.pos << "] " << ((a == 0) ? "=" : "!=") << " " << c.val; } /// Copy brancher virtual Actor* copy(Space& home, bool share) { return new (home) Warnsdorff(home, share, *this); } /// Post brancher static BrancherHandle post(Home home, const IntVarArgs& x) { ViewArray xv(home, x); return *new (home) Warnsdorff(home, xv); } /// Delete brancher and return its size virtual size_t dispose(Space&) { return sizeof(*this); } }; /// Base-class for knight's tour example class Knights : public Script { public: /// Size of board const int n; /// Maps board field to successor field IntVarArray succ; /// Propagation to use for model enum { PROP_REIFIED, ///< Use reified constraints PROP_CIRCUIT ///< Use single circuit constraints }; /// Branching to use for model enum { BRANCH_NAIVE, ///< Use naive, lexicographical branching BRANCH_WARNSDORFF, ///< Use Warnsdorff's rule }; /// Return field at position \a x, \a y int f(int x, int y) const { return x + y*n; } /// Return x coordinate at field \a f int x(int f) const { return f % n; } /// Return y coordinate at field \a f int y(int f) const { return f / n; } /// Compute set of neighbour fields IntSet neighbors(int i) { static const int moves[8][2] = { {-2,-1}, {-2,1}, {-1,-2}, {-1,2}, {1,-2}, {1,2}, {2,-1}, {2,1} }; int nbs[8]; int n_nbs = 0; for (int m=0; m<8; m++) { int nx = x(i) + moves[m][0], ny = y(i) + moves[m][1]; if ((nx >= 0) && (nx < n) && (ny >= 0) && (ny < n)) nbs[n_nbs++] = f(nx,ny); } return IntSet(nbs,n_nbs); } /// Constructor Knights(const SizeOptions& opt) : n(opt.size()), succ(*this,n*n,0,n*n-1) { switch (opt.branching()) { case BRANCH_NAIVE: branch(*this, succ, INT_VAR_NONE(), INT_VAL_MIN()); break; case BRANCH_WARNSDORFF: Warnsdorff::post(*this, succ); break; } } /// Constructor for cloning \a s Knights(bool share, Knights& s) : Script(share,s), n(s.n) { succ.update(*this, share, s.succ); } /// Print board virtual void print(std::ostream& os) const { int* jump = new int[n*n]; { int j=0; for (int i=0; i(s); if (!scene) initialize(); QList itemList = scene->items(); foreach (QGraphicsItem* i, scene->items()) { scene->removeItem(i); delete i; } for (int i=0; iaddRect(i*unit,j*unit,unit,unit); QPen pen(Qt::black, 2); if (!k.succ[i*k.n+j].assigned()) { pen.setColor(Qt::red); pen.setStyle(Qt::DotLine); pen.setWidth(0); } for (IntVarValues xv(k.succ[i*k.n+j]); xv(); ++xv) { int ky = xv.val() % k.n; int kx = xv.val() / k.n; scene->addLine(i*unit+unit/2,j*unit+unit/2, kx*unit+unit/2,ky*unit+unit/2, pen); } } } mw->show(); } /// Set up main window void initialize(void) { mw = new QMainWindow(); scene = new QGraphicsScene(); QGraphicsView* view = new QGraphicsView(scene); view->setRenderHints(QPainter::Antialiasing); mw->setCentralWidget(view); mw->setAttribute(Qt::WA_QuitOnClose, false); mw->setAttribute(Qt::WA_DeleteOnClose, false); QAction* closeWindow = new QAction("Close window", mw); closeWindow->setShortcut(QKeySequence("Ctrl+W")); mw->connect(closeWindow, SIGNAL(triggered()), mw, SLOT(close())); mw->addAction(closeWindow); } /// Name of the inspector virtual std::string name(void) { return "Board"; } /// Finalize inspector virtual void finalize(void) { delete mw; mw = NULL; } }; #endif /** \brief Main-function * \relates Knights */ int main(int argc, char* argv[]) { SizeOptions opt("Knights"); opt.iterations(100); opt.size(8); opt.propagation(Knights::PROP_CIRCUIT); opt.propagation(Knights::PROP_REIFIED, "reified"); opt.propagation(Knights::PROP_CIRCUIT, "circuit"); opt.branching(Knights::BRANCH_NAIVE); opt.branching(Knights::BRANCH_NAIVE, "naive"); opt.branching(Knights::BRANCH_WARNSDORFF, "warnsdorff"); #if defined(GECODE_HAS_QT) && defined(GECODE_HAS_GIST) KnightsInspector ki; opt.inspect.click(&ki); #endif opt.parse(argc,argv); if (opt.propagation() == Knights::PROP_REIFIED) { Script::run(opt); } else { Script::run(opt); } return 0; } // STATISTICS: example-any gecode-4.2.1/examples/langford-number.cpp0000644000175000010010000001470312166527420017477 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Patrick Pekczynski * Mikael Lagerkvist * Christian Schulte * * Copyright: * Patrick Pekczynski, 2004 * Mikael Lagerkvist, 2006 * Christian Schulte, 2007 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** * \brief Options taking two additional parameters * * \relates LangfordNumber */ class LangfordNumberOptions : public Options { public: int k, n; /// Parameters to be given on the command line /// Initialize options for example with name \a s LangfordNumberOptions(const char* s, int k0, int n0) : Options(s), k(k0), n(n0) {} /// Parse options from arguments \a argv (number is \a argc) void parse(int& argc, char* argv[]) { Options::parse(argc,argv); if (argc < 3) return; n = atoi(argv[1]); k = atoi(argv[2]); } /// Print help message virtual void help(void) { Options::help(); std::cerr << "\t(unsigned int) default: " << n << std::endl << "\t\tparameter n" << std::endl << "\t(unsigned int) default: " << k << std::endl << "\t\tparameter k" << std::endl; } }; /** * \brief %Example: Langford's number problem * * See problem 24 at http://www.csplib.org/. * * \ingroup Example */ class LangfordNumber : public Script { protected: int k, n; ///< Problem parameters IntVarArray y; ///< Sequence variables public: /// Propagation to use for model enum { PROP_REIFIED, ///< Use reified constraints PROP_EXTENSIONAL, ///< Use extensional constraints PROP_EXTENSIONAL_CHANNEL ///< Use extensional and channel constraints }; /// Construct model LangfordNumber(const LangfordNumberOptions& opt) : k(opt.k), n(opt.n), y(*this,k*n,1,n) { switch (opt.propagation()) { case PROP_REIFIED: { // Position of values in sequence IntVarArgs pv(*this,k*n,0,k*n-1); Matrix p(pv,n,k); /* * The occurences of v in the Langford sequence are v numbers apart. * * Let \#(i, v) denote the position of the i-th occurence of * value v in the Langford Sequence. Then * * \f$ \forall i, j \in \{1, \dots, k\}, i \neq j: * \forall v \in \{1, \dots, n\}: \#(i, v) + (v + 1) = \#(j, v)\f$ * */ for (int i=0; i values for (int i=0; i 1) a[v-2]=v-1; REG ra(a), rv(v); extensional(*this, y, *ra+rv+(ra(v,v)+rv)(k-1,k-1)+*ra); } } break; case PROP_EXTENSIONAL_CHANNEL: { // Boolean variables for channeling BoolVarArgs bv(*this,k*n*n,0,1); Matrix b(bv,k*n,n); // Post channel constraints for (int i=0; i opt.n) { std::cerr << "n must be at least k!" << std::endl; return 1; } Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/magic-sequence.cpp0000644000175000010010000000754512166527420017311 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Guido Tack * * Copyright: * Christian Schulte, 2001 * Guido Tack, 2006 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** * \brief %Example: Magic sequence * * Find a magic sequence of length \f$n\f$. A magic sequence of * length \f$n\f$ is a sequence \f[x_0,x_1, \ldots, x_{n-1}\f] * of integers such that for every \f$i=0,\ldots,n-1\f$: * - \f$x_i\f$ is an integer between \f$0\f$ and \f$n-1\f$. * - the number \f$i\f$ occurs exactly \f$x_i\f$ times in the sequence. * * See problem 19 at http://www.csplib.org/. * * Note that "Modeling and Programming with Gecode" uses this example * as a case study. * * \ingroup Example * */ class MagicSequence : public Script { private: /// Length of sequence const int n; /// Sequence IntVarArray s; public: /// Propagation to use for model enum { PROP_COUNT, ///< Use count constraints PROP_GCC ///< Use single global cardinality constraint }; /// The actual model MagicSequence(const SizeOptions& opt) : n(opt.size()), s(*this,n,0,n-1) { switch (opt.propagation()) { case PROP_COUNT: for (int i=n; i--; ) count(*this, s, i, IRT_EQ, s[i]); linear(*this, s, IRT_EQ, n); break; case PROP_GCC: count(*this, s, s, opt.icl()); break; } linear(*this, IntArgs::create(n,-1,1), s, IRT_EQ, 0); branch(*this, s, INT_VAR_NONE(), INT_VAL_MAX()); } /// Constructor for cloning \a e MagicSequence(bool share, MagicSequence& e) : Script(share,e), n(e.n) { s.update(*this, share, e.s); } /// Copy during cloning virtual Space* copy(bool share) { return new MagicSequence(share,*this); } /// Print sequence virtual void print(std::ostream& os) const { os << "\t"; for (int i = 0; i(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/magic-square.cpp0000644000175000010010000000733112166527420016772 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2001 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** * \brief %Example: Magic squares * * Compute magic squares of arbitrary size * * See problem 19 at http://www.csplib.org/. * * \ingroup Example * */ class MagicSquare : public Script { private: /// Size of magic square const int n; /// Fields of square IntVarArray x; public: /// Post constraints MagicSquare(const SizeOptions& opt) : n(opt.size()), x(*this,n*n,1,n*n) { // Number of fields on square const int nn = n*n; // Sum of all a row, column, or diagonal const int s = nn*(nn+1) / (2*n); // Matrix-wrapper for the square Matrix m(x, n, n); for (int i = n; i--; ) { linear(*this, m.row(i), IRT_EQ, s, opt.icl()); linear(*this, m.col(i), IRT_EQ, s, opt.icl()); } // Both diagonals must have sum s { IntVarArgs d1y(n); IntVarArgs d2y(n); for (int i = n; i--; ) { d1y[i] = m(i,i); d2y[i] = m(n-i-1,i); } linear(*this, d1y, IRT_EQ, s, opt.icl()); linear(*this, d2y, IRT_EQ, s, opt.icl()); } // All fields must be distinct distinct(*this, x, opt.icl()); // Break some (few) symmetries rel(*this, m(0,0), IRT_GR, m(0,n-1)); rel(*this, m(0,0), IRT_GR, m(n-1,0)); branch(*this, x, INT_VAR_SIZE_MIN(), INT_VAL_SPLIT_MIN()); } /// Constructor for cloning \a s MagicSquare(bool share, MagicSquare& s) : Script(share,s), n(s.n) { x.update(*this, share, s.x); } /// Copy during cloning virtual Space* copy(bool share) { return new MagicSquare(share,*this); } /// Print solution virtual void print(std::ostream& os) const { // Matrix-wrapper for the square Matrix m(x, n, n); for (int i = 0; i(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/minesweeper.cpp0000644000175000010010000001646512166527420016747 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * * Copyright: * Guido Tack, 2006 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include using namespace Gecode; namespace { extern const char *specs[]; extern const unsigned int n_examples; int spec_size(const char *s); int mineField(const char *s, int n, int i, int j); } /** * \brief %Example: Minesweeper * * This is the classical MineSweeper game. * * The instances are taken from * http://www.janko.at/Raetsel/Minesweeper/index.htm * * \ingroup Example * */ class MineSweeper : public Script { private: const char *spec; int size; BoolVarArray b; /// Access position (\a h,\a w) in the matrix. BoolVar pos(int h, int w) { return b[h*size + w]; } /// Access position (\a h,\a w) in the matrix. const BoolVar pos(int h, int w) const { return b[h*size + w]; } /// Return the fields in \a m around position (\a x,\a y) BoolVarArgs fieldsAround(Matrix& m, int x, int y) { int bvsize=0; for (int ix = std::max(0, x-1); ix<=x+1 && ix m(b, size, size); // Initialize matrix and post constraints for (int h=0; h= n_examples) { std::cerr << "Error: size must be between 0 and " << n_examples-1 << std::endl; return 1; } Script::run(opt); return 0; } namespace { /** \name Minesweeper specifications * * A specification is a square matrix of characters. Alphanumeric characters represent * the number of mines adjacent to that field. Dots represent fields with an unknown number * of mines adjacent to it (or an actual mine). * * \relates MineSweeper */ //@{ /// The specifications const char* specs[] = { // 0 "..2.3." "2....." "..24.3" "1.34.." ".....3" ".3.3..", // 1 ".2.211.." "..4.2..2" "2..2..3." "2.22.3.3" "..1...4." "1...2..3" ".2.22.3." "1.1..1.1", // 2 "1..2.2.2.." ".32...4..1" "...13...4." "3.1...3..." ".21.1..3.2" ".3.2..2.1." "2..32..2.." ".3...32..3" "..3.33...." ".2.2...22.", // 3 "2...3.1." ".5.4...1" "..5..4.." "2...4.5." ".2.4...2" "..5..4.." "2...5.4." ".3.3...2", // 4 "0.0.1..11." "1.2.2.22.." "......2..2" ".23.11...." "0......2.1" "...22.1..." ".....3.32." ".5.2...3.1" ".3.1..3..." ".2...12..0", // 5 ".21.2.2..." ".4..3...53" "...4.44..3" "4.4..5.6.." "..45....54" "34....55.." "..4.4..5.5" "2..33.6..." "36...3..4." "...4.2.21.", // 6 ".32..1.." "....1..3" "3..2...4" ".5...5.." "..6...5." "3...5..4" "2..5...." "..2..34.", // 7 ".1.....3." "...343..." "244...443" "...4.4..." ".4.4.3.6." "...4.3..." "123...133" "...322..." ".2.....3.", // 8 "......." ".23435." ".1...3." "...5..." ".1...3." ".12234." ".......", // 9 "2...2...2" ".4.4.3.4." "..4...1.." ".4.3.3.4." "2.......2" ".5.4.5.4." "..3...3.." ".4.3.5.6." "2...1...2" }; /// Number of specifications const unsigned int n_examples = sizeof(specs)/sizeof(char*); /// Compute the size of a specification int spec_size(const char *s) { int l = std::strlen(s); int res = static_cast(std::sqrt(static_cast(l))); return res; } /// Return value at position (\a i,\a j) in the example \a s of size \a n int mineField(const char *s, int n, int i, int j) { assert(spec_size(s) == n); assert(i >= 0 && i < n); assert(j >= 0 && j < n); char c = s[i*n + j]; if (!std::isalnum(c)) return -1; if (std::isdigit(c)) return c - '0'; if (std::islower(c)) c = static_cast(std::toupper(c)); // std::alpha(c) == true int res = (c - 'A') + 10; if (res > n) return 0; else return res; } //@} } // STATISTICS: example-any gecode-4.2.1/examples/money.cpp0000644000175000010010000000734512166527420015550 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2001 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** * \brief %Example: SEND+MORE=MONEY puzzle * * Well-known cryptoarithmetic puzzle. * Henry Dudeney, Strand Magazine, July 1924. * * \ingroup Example * */ class Money : public Script { protected: /// Number of letters static const int nl = 8; /// Array of letters IntVarArray le; public: /// Model variants enum { MODEL_SINGLE, ///< Use single linear equation MODEL_CARRY ///< Use carries }; /// Actual model Money(const Options& opt) : le(*this,nl,0,9) { IntVar s(le[0]), e(le[1]), n(le[2]), d(le[3]), m(le[4]), o(le[5]), r(le[6]), y(le[7]); rel(*this, s, IRT_NQ, 0); rel(*this, m, IRT_NQ, 0); distinct(*this, le, opt.icl()); switch (opt.model()) { case MODEL_SINGLE: rel(*this, 1000*s+100*e+10*n+d + 1000*m+100*o+10*r+e == 10000*m+1000*o+100*n+10*e+y, opt.icl()); break; case MODEL_CARRY: { IntVar c0(*this,0,1), c1(*this,0,1), c2(*this,0,1), c3(*this,0,1); rel(*this, d+e == y+10*c0, opt.icl()); rel(*this, c0+n+r == e+10*c1, opt.icl()); rel(*this, c1+e+o == n+10*c2, opt.icl()); rel(*this, c2+s+m == o+10*c3, opt.icl()); rel(*this, c3 == m, opt.icl()); } break; default: GECODE_NEVER; } branch(*this, le, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); } /// Print solution virtual void print(std::ostream& os) const { os << "\t" << le << std::endl; } /// Constructor for cloning \a s Money(bool share, Money& s) : Script(share,s) { le.update(*this, share, s.le); } /// Copy during cloning virtual Space* copy(bool share) { return new Money(share,*this); } }; /** \brief Main-function * \relates Money */ int main(int argc, char* argv[]) { Options opt("SEND+MORE=MONEY"); opt.model(Money::MODEL_SINGLE); opt.model(Money::MODEL_SINGLE, "single", "use single linear equation"); opt.model(Money::MODEL_CARRY, "carry", "use carry"); opt.solutions(0); opt.iterations(20000); opt.parse(argc,argv); Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/nonogram.cpp0000644000175000010010000006437512166527420016247 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Mikael Lagerkvist * * Copyright: * Mikael Lagerkvist, 2005 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; namespace { /// List of specifications extern const int* specs[]; /// Number of specifications extern const unsigned int n_examples; } /** * \brief %Example: %Nonogram * * This example solves nonograms. A nonogram is composed of a matrix of * markers. For each row/column there is a specification on how many groups * of markers (separated by one or more unmarked spots) and their length. * The objective is to find a valid assignment, which incidentally may also * produce a pretty picture. * * See problem 12 at http://www.csplib.org/. * * Note that "Modeling and Programming with Gecode" uses this example * as a case study. * * \ingroup Example * */ class Nonogram : public Script { protected: /// Specification to be used const int* spec; /// Fields of board BoolVarArray b; /// Return width of board int width(void) const { return spec[0]; } /// Return height of board int height(void) const { return spec[1]; } /// Returns next regular expression for line starting from spos DFA line(int& spos) { REG r0(0), r1(1); REG border = *r0; REG between = +r0; int hints = spec[spos++]; REG r = border; if (hints > 0) { r += r1(spec[spos],spec[spos]); spos++; for (int i=hints-1; i--; spos++) r += between + r1(spec[spos],spec[spos]); } return r + border; } public: // Branching variants enum { BRANCH_NONE, ///< Branch on rows/columns in order BRANCH_AFC, ///< Use AFC for branching }; /// Construction of the model. Nonogram(const SizeOptions& opt) : spec(specs[opt.size()]), b(*this,width()*height(),0,1) { Matrix m(b, width(), height()); { int spos = 2; // Post constraints for columns for (int w=0; w cols*height()) { for (int w=0; w m(b, width(), height()); for (int h = 0; h < height(); ++h) { os << '\t'; for (int w = 0; w < width(); ++w) os << ((m(w,h).val() == 1) ? '#' : ' '); os << std::endl; } os << std::endl; } }; /** \brief Main-function * \relates Nonogram */ int main(int argc, char* argv[]) { SizeOptions opt("Nonogram"); opt.size(8); opt.branching(Nonogram::BRANCH_AFC); opt.branching(Nonogram::BRANCH_NONE, "none", "Branch on rows/columns in order"); opt.branching(Nonogram::BRANCH_AFC, "afc", "Use AFC for branching"); opt.parse(argc,argv); if (opt.size() >= n_examples) { std::cerr << "Error: size must be between 0 and " << n_examples-1 << std::endl; return 1; } Script::run(opt); return 0; } namespace { /** \name Picture specifications * * A specification is given by a list of integers. The first two * integers (w and h) specify the number of columns and rows * respectively. Then w + h groups of integers follows. Each group is * started by the number of integers it contains (n), followed by n integers * specifying the sizes of the stretches of markers in that row/column. * * \relates Nonogram */ //@{ /// Specification for a heart-shaped picture. const int heart[] = { 9, 9, // Column constraints. 1, 3, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 1, 3, // Row constraints 2, 2, 2, 2, 4, 4, 3, 1, 3, 1, 3, 2, 1, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1 }; /// Specification for a bear/bunny-shaped picture. const int bear[] = { 13, 8, // Column constraints 1, 2, 2, 2, 1, 2, 3, 2, 1, 6, 2, 1, 4, 1, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 4, 2, 1, 3, 1, 2, // Row constraints 1, 1, 1, 2, 2, 4, 4, 1, 12, 1, 8, 1, 9, 2, 3, 4, 2, 2, 2 }; /// Specification for a crocodile-shaped picture const int crocodile[] = { 15, 9, // Column constraints 1, 3, 1, 4, 2, 2, 2, 2, 3, 1, 2, 2, 3, 2, 3, 2, 2, 2, 3, 2, 4, 2, 2, 3, 2, 1, 6, 2, 1, 3, 2, 1, 3, 2, 1, 4, 1, 5, 1, 5, // Row constraints 1, 3, 3, 2, 3, 2, 2, 10, 3, 1, 15, 5, 1, 1, 1, 1, 6, 2, 1, 7, 2, 1, 4, 2, 1, 4, 1, 4 }; /// Specification for an unknown picture const int unknown[] = { 10, 10, // Column constraints 1, 3, 2, 2, 1, 2, 2, 2, 2, 2, 1, 3, 1, 2, 1, 2, 1, 1, 3, 1, 4, 1, 3, 1, 1, 2, 2, 3, 1, 1, 4, // Row constraints 1, 3, 2, 2, 1, 2, 1, 1, 2, 1, 4, 4, 1, 1, 1, 1, 4, 2, 1, 1, 1, 3, 2, 1, 1, 2, 1, 2, 2, 2, 3, 1, 3 }; /// Specification for a pinwheel-picture const int pinwheel[] = { 6, 6, // Column constraints 2, 1, 2, 1, 1, 1, 2, 1, 2, 1, 1, 2, 2, 1, // Row constraints 2, 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 2 }; /// Specification for a more difficult picture. const int difficult[] = { 15, 15, // Column constraints 1, 3, 1, 2, 1, 2, 1, 1, 1, 2, 1, 3, 1, 2, 1, 4, 1, 3, 1, 4, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 3, // Row constraints 1, 3, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 5, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 3 }; /// Specification for a non-unique picture const int non_unique[] = { 11, 15, // Column constraints 1, 5, 3, 1, 2, 4, 3, 2, 1, 3, 4, 2, 2, 1, 1, 4, 1, 1, 1, 1, 2, 1, 5, 5, 2, 1, 1, 3, 2, 5, 2, 1, 1, 1, 1, 3, 1, 4, 1, 2, 1, 1, 1, 1, // Row constraints 2, 2, 2, 2, 2, 2, 1, 4, 2, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 2, 1, 1, 2, 1, 4, 3, 1, 1, 1, 3, 1, 1, 4, 2, 1, 3, 2, 1, 2, 1, 5, 2, 2, 2, 2, 3, 3 }; /** \brief Specification for a dragonfly-picture. * * From http://www.oberlin.edu/math/faculty/bosch/pbn-page.html, where * it is claimed that it is hard. */ const int dragonfly[] = { 20, 20, // Column constraints. 4, 1, 1, 1, 2, 5, 3, 1, 2, 1, 1, 5, 1, 4, 2, 1, 1, 4, 1, 3, 2, 4, 4, 1, 4, 6, 1, 3, 1, 11, 1, 4, 5, 1, 6, 2, 1, 14, 2, 7, 2, 2, 7, 2, 3, 6, 1, 1, 2, 9, 2, 4, 3, 1, 1, 1, 3, 3, 1, 3, 3, 2, 1, 3, 3, 2, 1, 5, 3, 3, 2, 2, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 6, // Row constraints 2, 7, 1, 3, 1, 1, 2, 3, 2, 1, 2, 3, 1, 2, 2, 3, 4, 2, 3, 3, 3, 1, 4, 3, 3, 1, 3, 3, 2, 1, 4, 2, 2, 9, 3, 2, 1, 5, 2, 2, 7, 1, 14, 2, 8, 2, 3, 6, 2, 2, 4, 2, 8, 1, 3, 4, 1, 5, 5, 2, 5, 1, 3, 2, 4, 1, 5, 3, 1, 2, 4, 1, 5, 1, 1, 3, 1, 3, 4, 2, 1, 1, 2 }; /// From http://www.cs.kuleuven.be/~bmd/nonogram.pl const int castle[] = { 60, 35, // Column constraints 7, 2,3,1,5,1,7,1, 7, 2,4,2,3,2,3,5, 8, 2,6,3,1,1,5,1,5, 10, 2,4,2,1,1,1,4,1,1,2, 7, 2,8,2,1,5,2,5, 7, 3,1,6,2,5,1,5, 9, 3,3,3,1,1,6,1,1,1, 9, 3,2,2,2,2,8,1,1,3, 7, 1,4,4,3,7,1,1, 7, 1,2,2,2,3,7,9, 8, 1,2,3,1,1,5,2,2, 7, 2,2,3,1,1,6,1, 6, 1,3,1,5,4,1, 8, 1,3,1,1,6,1,3,1, 8, 3,3,4,5,1,4,2,1, 6, 2,3,3,9,7,1, 8, 2,3,2,2,1,1,3,5, 8, 4,2,1,1,1,1,2,3, 7, 4,2,2,1,4,3,2, 4, 4,3,16,2, 5, 1,2,5,7,1, 6, 4,3,2,2,7,1, 5, 2,3,1,10,1, 6, 2,4,2,1,4,1, 5, 1,6,7,3,1, 4, 3,11,3,1, 5, 7,1,11,2,1, 7, 2,2,2,2,2,2,2, 7, 3,1,1,1,1,2,1, 7, 2,2,2,2,1,1,1, 7, 1,1,1,1,2,1,2, 8, 2,2,2,2,1,1,1,1, 5, 4,1,1,2,2, 5, 5,2,17,2,1, 6, 9,2,3,1,4,2, 6, 9,4,2,1,1,1, 5, 5,4,2,1,4, 7, 11,1,2,1,4,1,2, 5, 3,4,2,4,4, 8, 2,1,4,1,2,1,5,2, 5, 8,4,1,1,2, 5, 1,1,3,2,3, 6, 1,3,1,8,1,6, 4, 2,1,7,14, 7, 1,2,4,4,1,2,3, 10, 1,1,4,2,1,1,1,1,1,4, 6, 3,5,3,1,1,4, 6, 2,4,2,2,1,2, 5, 4,2,3,8,4, 5, 4,15,2,2,4, 6, 4,1,10,2,1,2, 6, 2,12,6,1,2,4, 7, 3,1,3,1,3,3,4, 6, 3,1,2,3,4,1, 7, 5,2,2,2,3,3,3, 9, 1,2,2,2,2,4,1,1,3, 7, 2,1,4,2,7,1,1, 6, 5,2,2,3,6,3, 7, 3,3,2,2,3,2,3, 7, 4,1,2,1,1,2,1, // Row constraints 4, 12,1,1,1, 5, 8,6,3,1,3, 6, 5,8,4,3,1,5, 8, 7,3,4,1,3,5,1,7, 13, 2,2,4,9,1,5,1,1,1,1,1,1,1, 8, 4,5,10,2,1,8,7,1, 7, 5,1,3,3,16,1,2, 8, 8,5,1,2,4,9,1,3, 12, 4,5,3,14,1,1,1,1,4,1,1,3, 19, 3,3,2,2,2,4,1,1,1,1,1,1,1,1,3,1,1,3,2, 11, 8,2,7,2,1,1,2,1,1,3,3, 13, 1,5,9,12,2,1,1,3,1,1,2,2,1, 17, 3,2,2,1,1,1,1,4,1,1,1,3,3,1,1,2,2, 12, 5,2,2,2,2,1,5,2,1,1,2,5, 12, 3,5,9,2,1,1,6,3,1,3,2,3, 12, 1,4,1,1,1,4,1,5,5,3,3,3, 10, 4,1,1,1,1,3,4,6,6,3, 12, 3,1,3,1,1,3,3,1,1,4,6,1, 11, 3,1,5,1,1,3,1,1,9,4,1, 14, 2,1,1,7,1,4,1,1,1,1,1,1,3,5, 11, 9,2,1,3,1,1,1,1,4,2,1, 10, 1,14,1,1,2,2,2,10,1,2, 10, 1,9,2,1,2,6,1,5,3,2, 12, 1,9,9,1,2,2,3,1,1,4,3,1, 10, 10,1,3,4,1,3,2,1,2,8, 9, 9,1,3,5,1,1,1,2,7, 12, 4,5,1,2,5,1,3,1,1,2,1,3, 14, 1,1,1,1,2,6,2,3,2,1,1,2,3,1, 11, 1,6,1,5,7,1,3,3,2,4,3, 10, 1,2,1,2,9,1,5,2,6,2, 8, 10,2,2,13,1,3,3,1, 11, 2,2,1,6,2,3,3,2,2,2,1, 12, 2,2,1,1,12,2,2,9,2,2,2,2, 9, 5,1,2,4,1,5,11,2,2, 3, 15,6,18, }; /** \brief Specification for a picture of cupid. * * From http://www.icparc.ic.ac.uk/eclipse/examples/nono.ecl.txt, the * hardest instance. */ const int p200[] = { 25, 25, // Column constraints 4, 1,1,2,2, 3, 5,5,7, 4, 5,2,2,9, 4, 3,2,3,9, 5, 1,1,3,2,7, 3, 3,1,5, 5, 7,1,1,1,3, 6, 1,2,1,1,2,1, 3, 4,2,4, 4, 1,2,2,2, 3, 4,6,2, 4, 1,2,2,1, 4, 3,3,2,1, 3, 4,1,15, 6, 1,1,1,3,1,1, 6, 2,1,1,2,2,3, 4, 1,4,4,1, 4, 1,4,3,2, 4, 1,1,2,2, 5, 7,2,3,1,1, 5, 2,1,1,1,5, 3, 1,2,5, 4, 1,1,1,3, 3, 4,2,1, 1, 3, // Row constraints 3, 2,2,3, 5, 4,1,1,1,4, 5, 4,1,2,1,1, 7, 4,1,1,1,1,1,1, 6, 2,1,1,2,3,5, 6, 1,1,1,1,2,1, 5, 3,1,5,1,2, 6, 3,2,2,1,2,2, 7, 2,1,4,1,1,1,1, 6, 2,2,1,2,1,2, 6, 1,1,1,3,2,3, 5, 1,1,2,7,3, 5, 1,2,2,1,5, 5, 3,2,2,1,2, 4, 3,2,1,2, 3, 5,1,2, 4, 2,2,1,2, 4, 4,2,1,2, 4, 6,2,3,2, 4, 7,4,3,2, 3, 7,4,4, 3, 7,1,4, 3, 6,1,4, 3, 4,2,2, 2, 2,1 }; // The following instances are from the http://webpbn.com site and // are all designed by Jan Wolter. // See also the survey at http://webpbn.com/survey/ /// Petro const int webpbn436[]= { 40, 35, // Column constraints 1, 1, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 4, 4, 2, 2, 2, 4, 3, 3, 2, 3, 4, 3, 2, 2, 2, 3, 3, 2, 6, 2, 2, 9, 3, 2, 3, 3, 5, 4, 4, 3, 2, 4, 5, 7, 2, 5, 2, 6, 6, 12, 2, 3, 2, 3, 2, 6, 3, 1, 2, 2, 2, 3, 6, 2, 2, 3, 2, 2, 2, 6, 6, 2, 6, 2, 2, 2, 5, 12, 4, 3, 2, 2, 4, 12, 2, 2, 2, 3, 2, 6, 2, 4, 2, 6, 5, 2, 4, 10, 9, 2, 2, 5, 12, 3, 3, 2, 2, 7, 6, 2, 2, 2, 2, 2, 2, 6, 2, 2, 3, 2, 2, 2, 6, 4, 3, 2, 2, 2, 3, 6, 7, 3, 3, 2, 3, 2, 5, 5, 3, 5, 2, 6, 5, 4, 3, 3, 3, 4, 3, 3, 5, 3, 2, 3, 9, 3, 4, 2, 6, 4, 4, 2, 2, 2, 4, 4, 2, 2, 3, 4, 3, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 2, 3, 3, 2, 2, 1, // Row constraints 2, 2, 2, 3, 2, 3, 2, 4, 3, 3, 3, 2, 4, 3, 3, 3, 3, 6, 2, 3, 3, 3, 3, 2, 6, 3, 3, 3, 3, 3, 3, 6, 4, 2, 3, 2, 2, 4, 7, 4, 2, 2, 2, 2, 3, 1, 7, 3, 1, 2, 2, 2, 3, 3, 7, 3, 2, 2, 2, 2, 2, 4, 5, 3, 2, 15, 2, 4, 3, 5, 19, 4, 4, 6, 4, 3, 3, 3, 6, 4, 4, 4, 2, 4, 6, 2, 6, 2, 2, 3, 3, 3, 2, 6, 9, 2, 2, 2, 3, 9, 7, 10, 2, 2, 2, 2, 2, 10, 9, 4, 2, 3, 3, 2, 2, 3, 2, 5, 5, 2, 5, 2, 4, 2, 5, 5, 3, 2, 2, 5, 5, 6, 3, 2, 3, 7, 4, 6, 8, 9, 7, 4, 4, 8, 7, 5, 1, 4, 1, 2, 1, 2, 1, 14, 1, 16, 2, 3, 3, 2, 2, 2, 2, 2, 2, 2, 4, 4, 1, 16, 1, 12, }; /// Skid const int webpbn21[]= { 14, 25, // Column constraints 1, 2, 2, 4, 6, 4, 9, 4, 4, 2, 4, 1, 6, 2, 6, 3, 1, 5, 2, 2, 1, 6, 2, 1, 5, 2, 1, 4, 2, 1, 4, 3, 1, 4, 2, 3, 1, 4, 6, 5, 1, 6, 4, 4, 2, 3, 9, 2, 6, 2, 4, 2, // Row constraints 1, 9, 2, 1, 1, 3, 1, 1, 1, 3, 1, 3, 1, 1, 13, 1, 13, 1, 13, 1, 13, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; /// Bucks const int webpbn27[]= { 27, 23, // Column constraints 2, 4, 12, 3, 6, 1, 1, 3, 8, 1, 1, 5, 3, 2, 2, 1, 1, 6, 2, 1, 1, 2, 1, 6, 4, 1, 1, 1, 1, 6, 3, 1, 1, 2, 1, 1, 5, 3, 2, 3, 1, 1, 3, 10, 1, 1, 5, 4, 2, 2, 1, 1, 6, 3, 1, 1, 2, 1, 1, 4, 2, 1, 1, 1, 6, 3, 1, 1, 2, 1, 1, 5, 3, 2, 3, 1, 6, 3, 10, 1, 1, 5, 4, 2, 2, 1, 1, 6, 3, 1, 1, 2, 1, 1, 4, 1, 1, 1, 9, 6, 2, 1, 1, 2, 1, 1, 5, 2, 2, 3, 1, 3, 3, 8, 1, 5, 3, 6, 1, 1, 3, 4, 9, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 1, 4, // Row constraints 1, 11, 1, 17, 4, 3, 5, 5, 3, 4, 2, 2, 2, 1, 7, 2, 1, 3, 1, 3, 1, 4, 4, 3, 3, 3, 3, 7, 5, 1, 3, 1, 3, 1, 3, 4, 3, 2, 2, 4, 4, 5, 5, 5, 5, 1, 23, 0, 1, 23, 2, 1, 1, 2, 1, 1, 3, 1, 2, 1, 4, 1, 1, 1, 1, 4, 1, 1, 1, 1, 5, 1, 10, 1, 2, 1, 7, 1, 1, 1, 1, 1, 1, 3, 8, 1, 1, 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 2, 2, 3, 5, 5, 3, }; /// Dancer const int webpbn1[]= { 5, 10, // Column constraints 2, 2, 1, 3, 2, 1, 3, 1, 7, 2, 1, 3, 2, 2, 1, // Row constraints 1, 2, 2, 2, 1, 2, 1, 1, 1, 3, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 2, 1, 2, 1, 2, }; /// Cat const int webpbn6[]= { 20, 20, // Column constraints 1, 5, 2, 5, 3, 3, 2, 3, 4, 3, 1, 7, 2, 1, 8, 1, 9, 1, 9, 1, 8, 1, 7, 1, 8, 1, 9, 1, 10, 1, 13, 2, 6, 2, 1, 4, 1, 6, 1, 6, 1, 5, 1, 6, 1, 6, // Row constraints 1, 2, 1, 2, 1, 1, 1, 1, 2, 1, 3, 2, 2, 5, 4, 1, 7, 1, 1, 4, 1, 8, 2, 2, 3, 1, 9, 5, 2, 2, 16, 2, 1, 17, 2, 7, 11, 3, 5, 5, 3, 2, 5, 4, 2, 3, 3, 2, 2, 2, 2, 2, 1, 2, 1, 1, 2, 2, 2, 2, 2, 2, }; /// Edge const int webpbn23[]= { 10, 11, // Column constraints 1, 1, 1, 3, 1, 1, 2, 2, 2, 1, 2, 1, 4, 1, 1, 1, 3, 1, 3, 1, 1, // Row constraints 1, 1, 1, 3, 1, 1, 1, 2, 1, 1, 1, 3, 1, 3, 1, 1, 1, 2, 1, 2, 1, 4, }; /// Knot const int webpbn16[]= { 34, 34, // Column constraints 2, 1, 1, 2, 2, 2, 2, 3, 3, 4, 2, 1, 1, 2, 4, 2, 1, 1, 2, 4, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 18, 6, 2, 1, 1, 1, 1, 2, 6, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 26, 8, 2, 1, 1, 1, 1, 1, 1, 2, 8, 2, 1, 1, 2, 2, 1, 1, 2, 8, 2, 1, 1, 2, 2, 1, 1, 2, 2, 14, 14, 4, 1, 1, 1, 1, 4, 1, 1, 1, 1, 2, 14, 14, 8, 2, 1, 1, 2, 2, 1, 1, 2, 8, 2, 1, 1, 2, 2, 1, 1, 2, 8, 2, 1, 1, 1, 1, 1, 1, 2, 1, 26, 6, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 6, 2, 1, 1, 1, 1, 2, 1, 18, 4, 1, 1, 1, 1, 4, 1, 1, 1, 1, 4, 2, 1, 1, 2, 4, 2, 1, 1, 2, 2, 3, 3, 2, 2, 2, 2, 1, 1, // Row constraints 2, 1, 1, 2, 2, 2, 2, 3, 3, 4, 2, 1, 1, 2, 4, 2, 1, 1, 2, 4, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 18, 6, 2, 1, 1, 1, 1, 2, 6, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 26, 8, 2, 1, 1, 1, 1, 1, 1, 2, 8, 2, 1, 1, 2, 2, 1, 1, 2, 8, 2, 1, 1, 2, 2, 1, 1, 2, 2, 14, 14, 4, 1, 1, 1, 1, 4, 1, 1, 1, 1, 2, 14, 14, 8, 2, 1, 1, 2, 2, 1, 1, 2, 8, 2, 1, 1, 2, 2, 1, 1, 2, 8, 2, 1, 1, 1, 1, 1, 1, 2, 1, 26, 6, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 6, 2, 1, 1, 1, 1, 2, 1, 18, 4, 1, 1, 1, 1, 4, 1, 1, 1, 1, 4, 2, 1, 1, 2, 4, 2, 1, 1, 2, 2, 3, 3, 2, 2, 2, 2, 1, 1, }; /// Swing const int webpbn529[]= { 45, 45, // Column constraints 6, 7, 1, 1, 1, 1, 1, 13, 2, 2, 4, 1, 4, 1, 5, 1, 4, 1, 4, 1, 2, 10, 3, 1, 4, 1, 4, 1, 14, 4, 1, 2, 8, 1, 1, 5, 1, 2, 3, 4, 1, 4, 3, 13, 1, 10, 3, 1, 9, 4, 4, 6, 7, 2, 2, 4, 8, 4, 1, 4, 6, 2, 8, 3, 2, 5, 3, 5, 10, 1, 3, 7, 2, 6, 8, 6, 2, 8, 1, 2, 7, 1, 1, 2, 2, 8, 1, 1, 11, 2, 1, 1, 1, 2, 1, 3, 1, 3, 3, 1, 8, 2, 1, 1, 1, 5, 4, 2, 1, 8, 2, 1, 1, 1, 1, 7, 2, 1, 8, 2, 1, 1, 2, 9, 1, 2, 1, 5, 4, 6, 12, 1, 3, 4, 16, 13, 3, 2, 3, 12, 21, 2, 3, 2, 13, 23, 3, 2, 14, 19, 4, 2, 14, 20, 2, 6, 2, 13, 7, 2, 8, 2, 5, 12, 8, 1, 7, 2, 9, 5, 1, 1, 1, 2, 8, 1, 5, 2, 8, 2, 1, 1, 1, 9, 1, 1, 4, 8, 2, 1, 1, 1, 6, 1, 3, 5, 6, 2, 2, 1, 5, 6, 2, 8, 2, 1, 3, 1, 3, 7, 3, 2, 9, 2, 3, 2, 1, 1, 2, 4, 4, 2, 9, 2, 2, 1, 1, 2, 3, 1, 8, 2, 5, 9, 3, 1, 7, 2, 5, 12, 4, 1, 6, 2, 5, 7, 4, 1, 2, 5, 5, 2, 6, 6, 5, 6, 4, 8, 8, 6, 3, 5, 3, 10, 8, 4, 2, 5, 5, 11, 9, 5, 2, 5, 3, 1, 12, 16, 2, 4, 3, 1, 12, 16, 4, 5, 2, 13, 21, 6, 6, 1, 3, 3, 1, 1, 14, 5, 1, 3, 1, 3, 1, 1, 2, 1, 4, 1, 3, 1, 3, 13, 5, 1, 3, 1, 3, 1, 4, 1, 4, 1, 3, 1, 3, 6, 1, 1, 1, 1, 1, 1, // Row constraints 6, 7, 1, 1, 1, 1, 1, 13, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 2, 14, 1, 1, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 2, 9, 2, 1, 2, 1, 1, 1, 1, 6, 2, 4, 3, 30, 1, 5, 9, 1, 5, 8, 1, 1, 7, 1, 1, 3, 7, 3, 4, 8, 1, 5, 1, 2, 4, 3, 20, 6, 6, 6, 3, 3, 7, 2, 5, 1, 9, 3, 3, 1, 1, 9, 1, 1, 5, 6, 7, 2, 3, 8, 1, 3, 4, 2, 7, 5, 3, 1, 10, 4, 5, 2, 6, 1, 2, 3, 8, 4, 6, 5, 2, 2, 3, 11, 10, 5, 2, 2, 3, 10, 7, 6, 2, 3, 1, 7, 12, 2, 6, 2, 3, 1, 4, 11, 2, 6, 4, 1, 2, 1, 11, 2, 4, 9, 1, 2, 9, 5, 6, 2, 1, 4, 11, 6, 2, 5, 1, 2, 6, 6, 5, 6, 2, 4, 8, 4, 4, 4, 2, 16, 1, 4, 2, 2, 15, 2, 4, 3, 2, 15, 4, 4, 3, 3, 13, 4, 3, 4, 12, 9, 3, 1, 9, 10, 5, 2, 1, 17, 7, 2, 6, 2, 2, 8, 3, 8, 2, 6, 2, 3, 6, 3, 8, 2, 6, 2, 4, 5, 4, 7, 2, 5, 2, 5, 5, 4, 6, 5, 4, 4, 5, 4, 9, 5, 1, 4, 6, 4, 4, 6, 4, 3, 6, 4, 3, 2, 7, 2, 1, 2, 7, 4, 4, 2, 7, 2, 2, 2, 9, 5, 5, 2, 6, 2, 2, 2, 10, 6, 6, 5, 3, 2, 1, 9, 18, 3, 8, 4, 23, 9, 1, 2, 1, 2, 2, 1, 1, 1, 2, 12, 2, 1, 4, 2, 1, 4, 1, 5, 1, 3, 1, 2, 11, 2, 1, 5, 4, 4, 1, 5, 1, 3, 1, 2, 5, 1, 10, 1, 1, 1, }; /// Mum const int webpbn65[]= { 34, 40, // Column constraints 1, 5, 3, 3, 2, 1, 4, 3, 2, 2, 1, 5, 3, 2, 2, 2, 2, 6, 3, 2, 2, 2, 2, 3, 7, 1, 2, 2, 2, 2, 2, 16, 9, 1, 2, 2, 2, 2, 2, 2, 1, 2, 9, 1, 2, 2, 2, 2, 2, 2, 13, 1, 10, 3, 2, 2, 2, 2, 2, 2, 4, 1, 1, 9, 6, 5, 2, 2, 2, 2, 6, 1, 1, 11, 1, 7, 3, 2, 2, 2, 2, 2, 1, 1, 1, 12, 3, 4, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 11, 6, 1, 2, 3, 2, 2, 2, 2, 1, 1, 1, 6, 1, 7, 2, 16, 1, 1, 11, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 1, 2, 1, 3, 1, 1, 6, 1, 1, 1, 1, 9, 2, 7, 1, 1, 11, 1, 1, 1, 1, 9, 2, 7, 1, 1, 11, 1, 1, 1, 1, 11, 1, 2, 1, 3, 1, 1, 6, 1, 1, 1, 1, 11, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 7, 2, 16, 1, 1, 11, 6, 1, 2, 3, 2, 2, 2, 2, 1, 1, 1, 12, 3, 4, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 11, 1, 7, 3, 2, 2, 2, 2, 2, 1, 1, 1, 9, 6, 5, 2, 2, 2, 2, 6, 1, 1, 10, 3, 2, 2, 2, 2, 2, 2, 4, 1, 1, 9, 1, 2, 2, 2, 2, 2, 2, 13, 1, 9, 1, 2, 2, 2, 2, 2, 2, 1, 2, 7, 1, 2, 2, 2, 2, 2, 16, 6, 3, 2, 2, 2, 2, 3, 5, 3, 2, 2, 2, 2, 4, 3, 2, 2, 1, 3, 3, 2, 1, 1, 5, // Row constraints 1, 12, 3, 5, 2, 5, 4, 5, 2, 2, 5, 7, 1, 2, 2, 2, 2, 2, 1, 7, 4, 2, 2, 4, 2, 2, 4, 7, 4, 2, 2, 4, 2, 2, 4, 7, 1, 2, 2, 2, 2, 2, 1, 7, 6, 2, 2, 2, 2, 2, 6, 7, 6, 2, 2, 2, 2, 2, 6, 3, 1, 14, 1, 2, 10, 10, 4, 8, 3, 3, 8, 8, 1, 1, 2, 1, 1, 2, 1, 1, 6, 9, 2, 2, 2, 2, 9, 2, 9, 9, 6, 1, 1, 1, 1, 1, 1, 3, 12, 2, 12, 2, 12, 12, 5, 1, 1, 4, 1, 1, 2, 14, 14, 2, 12, 12, 5, 2, 1, 4, 1, 2, 3, 9, 4, 9, 5, 1, 7, 4, 7, 1, 7, 1, 1, 1, 4, 1, 1, 1, 5, 1, 7, 4, 7, 1, 5, 1, 7, 4, 7, 1, 7, 1, 2, 1, 2, 1, 2, 1, 5, 1, 7, 2, 7, 1, 7, 1, 1, 6, 2, 6, 1, 1, 9, 1, 1, 1, 1, 2, 1, 1, 1, 1, 7, 1, 1, 6, 2, 6, 1, 1, 6, 1, 1, 5, 5, 1, 1, 7, 1, 1, 1, 8, 1, 1, 1, 6, 1, 1, 4, 4, 1, 1, 5, 1, 2, 6, 2, 1, 4, 2, 4, 4, 2, 3, 2, 6, 2, 2, 4, 4, 1, 6, }; const int *specs[] = {heart, bear, crocodile, unknown, pinwheel, difficult, non_unique, dragonfly, castle, p200, // From the webpbn survey webpbn1, // 10 webpbn6, // 11 webpbn21, // 12 webpbn27, // 13 webpbn23, // 14 webpbn16, // 15 webpbn529, // 16 webpbn65, // 17 webpbn436, // 18 }; const unsigned n_examples = sizeof(specs)/sizeof(int*); //@} } // STATISTICS: example-any gecode-4.2.1/examples/open-shop.cpp0000644000175000010010000003055012166527420016323 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * * Copyright: * Guido Tack, 2009 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; namespace { /** * \brief Specification of an open shop instance * */ class OpenShopSpec { public: const int m; //< number of machines const int n; //< number of jobs const int* p; //< processing times of the tasks /// Constructor OpenShopSpec(int m0, int n0, const int* p0) : m(m0), n(n0), p(p0) {} }; extern OpenShopSpec examples[]; extern const unsigned int n_examples; } /** * \brief %Example: open-shop scheduling * * \ingroup Example * */ class OpenShop : public IntMinimizeScript { protected: /// The instance specification const OpenShopSpec& spec; /// Precedences BoolVarArray b; /// Makespan IntVar makespan; /// Start times IntVarArray _start; /// %Task representation for CROSH heuristic class Task { public: int j; //< Job int m; //< Machine int p; //< Processing time /// Default constructor Task(void) {} /// Constructor Task(int j0, int m0, int p0) : j(j0), m(m0), p(p0) {} }; /** \brief Use Constructive Randomized Open-Shop Heuristics * to compute lower and upper bounds * * This heuristic is taken from the paper * A. Malapert, H. Cambazard, C. Gueret, N. Jussien, A. Langevin, * L.-M. Rousseau: An Optimal Constraint Programming Approach to the * Open-Shop Problem. Technical report, CIRRELT-2009-25. * */ void crosh(Matrix& dur, int& minmakespan, int& maxmakespan) { Support::RandomGenerator rnd; // Compute maximum makespan as the sum of all production times. maxmakespan = 0; for (int i=0; i(spec.n); // Job completion time int* ct_m = re.alloc(spec.m); // Machine completion time Task* tasks = re.alloc(spec.n*spec.m); // Tasks int k=0; for (int i=spec.m; i--;) for (int j=spec.n; j--;) new (&tasks[k++]) Task(j,i,dur(i,j)); int* t0_tasks = re.alloc(spec.n*spec.m); // Earliest possible tasks bool stopCROSH = false; int maxIterations; switch (spec.n) { case 3: maxIterations = 5; break; case 4: maxIterations = 25; break; case 5: maxIterations = 50; break; case 6: maxIterations = 1000; break; case 7: maxIterations = 10000; break; case 8: maxIterations = 10000; break; case 9: maxIterations = 10000; break; default: maxIterations = 25000; break; } int iteration = 0; while (!stopCROSH && maxmakespan > minmakespan) { for (int i=spec.n; i--;) ct_j[i] = 0; for (int i=spec.m; i--;) ct_m[i] = 0; int cmax = 0; // Current makespan int u = spec.n*spec.m; // Consider all tasks while (u > 0) { int u_t0 = 0; // Set of selectable tasks int t0 = maxmakespan; // Minimal head of unscheduled tasks for (int i=0; i tasks[t0_tasks[t_j0m0]].p) t_j0m0 = i; } else { t_j0m0 = rnd(u_t0); // Select random task } const Task& t = tasks[t0_tasks[t_j0m0]]; int ect = t0 + t.p; ct_j[t.j] = ect; ct_m[t.m] = ect; std::swap(tasks[--u],tasks[t0_tasks[t_j0m0]]); // Remove task from u cmax = std::max(cmax, ect); if (cmax > maxmakespan) break; } maxmakespan = std::min(maxmakespan,cmax); if (iteration++ > maxIterations) stopCROSH = true; // Iterate a couple of times } } public: /// The actual problem OpenShop(const SizeOptions& opt) : spec(examples[opt.size()]), b(*this, (spec.n+spec.m-2)*spec.n*spec.m/2, 0,1), makespan(*this, 0, Int::Limits::max), _start(*this, spec.m*spec.n, 0, Int::Limits::max) { Matrix start(_start, spec.m, spec.n); IntArgs _dur(spec.m*spec.n, spec.p); Matrix dur(_dur, spec.m, spec.n); int minmakespan; int maxmakespan; crosh(dur, minmakespan, maxmakespan); rel(*this, makespan <= maxmakespan); rel(*this, makespan >= minmakespan); int k=0; for (int m=0; m start(m,j0))); } for (int j=0; j start(m0,j))); } // The makespan is greater than the end time of the latest job for (int m=0; m(spec.n); for (int i=0; i= n_examples) { std::cerr << "Error: size must be between 0 and " << n_examples-1 << std::endl; return 1; } IntMinimizeScript::run(opt); return 0; } namespace { /** \name Open shop specifications * * Each specification gives the processing times of the tasks for each * job, as well as the number of jobs and machines. * * \relates OpenShop */ //@{ const int ex0_p[] = { 661,6,333, 168,489,343, 171,505,324 }; OpenShopSpec ex0(3,3,ex0_p); const int ex1_p[] = { 54, 34, 61, 2, 9, 15, 89, 70, 38, 19, 28, 87, 95, 34, 7, 29 }; OpenShopSpec ex1(4,4,ex1_p); const int ex2_p[] = { 5, 70, 45, 83, 24, 80, 58, 45, 29, 56, 29, 61, 43, 64, 45, 74 }; OpenShopSpec ex2(4,4,ex2_p); const int ex3_p[] = { 89, 39, 54, 34, 71, 92, 56, 19, 13, 81, 46, 91, 73, 27, 66, 95, 48, 24, 96, 18, 14, 48, 46, 78, 94, 19, 68, 63, 60, 28, 91, 75, 52, 9, 7, 33, 98, 37, 11, 2, 30, 38, 83, 45, 37, 77, 52, 88, 52 }; OpenShopSpec ex3(7,7,ex3_p); const int ex4_p[] = { 49, 58, 37, 79, 16, 64, 71, 65, 6, 44, 17, 85, 99, 57, 89, 4, 16, 8, 40, 66, 43, 65, 42, 35, 57, 3, 8, 65, 79, 76, 82, 80, 96, 82, 98, 57, 73, 43, 6, 20, 82, 49, 7, 18, 94, 76, 41, 17, 43, 15, 53, 10, 83, 24, 79, 62, 53, 77, 23, 70, 18, 30, 80, 7, 97, 84, 10, 27, 7, 91, 14, 12, 7, 31, 24, 97, 16, 33, 99, 15, 31, 65, 51, 95, 45, 70, 57, 10, 84, 52, 28, 43, 54, 40, 83, 9, 21, 57, 45, 67, 70, 45, 48, 39, 10, 37, 22, 53, 48, 50, 76, 48, 57, 6, 43, 13, 45, 93, 42, 11, 80, 5, 53, 97, 75, 22, 10, 70, 79, 92, 96, 18, 57, 3, 82, 52, 1, 21, 23, 38, 43, 79, 67, 57, 33, 52, 1, 44, 82, 10, 27, 23, 89, 9, 62, 6, 38, 33, 37, 22, 68, 20, 5, 25, 16, 80, 13, 73, 35, 36, 13, 53, 97, 50, 17, 54, 35, 86, 24, 56, 60, 83, 8, 81, 3, 4, 48, 14, 77, 10, 71, 57, 86, 94, 49, 36, 62, 62, 41, 56, 31, 77, 5, 97, 19, 19, 31, 19, 26, 41, 77, 64, 74, 11, 98, 30, 22, 22, 33, 61, 7, 89, 46, 13, 33, 55, 84, 16, 21, 45, 15, 71, 57, 42, 82, 13, 62, 98, 36, 45, 84, 90, 20, 61, 24, 59, 8, 49, 53, 53, 83, 76, 28, 62, 59, 11, 41, 2, 58, 46, 32, 23, 53, 5, 8, 91, 97, 53, 90, 90, 28, 16, 61, 27, 32, 74, 23, 11, 57, 20, 62, 85, 79, 96, 62, 85, 43, 53, 12, 36, 95, 37, 2, 48, 46, 81, 97, 54, 5, 77, 57, 35, 41, 55, 72, 98, 22, 81, 6, 8, 70, 64, 55, 53, 7, 38, 58, 30, 83, 81, 15, 11, 24, 63, 27, 90, 35, 22, 53, 22, 66, 75, 59, 80, 31, 91, 63, 82, 99, 62, 4, 18, 99, 6, 65, 21, 28, 93, 16, 26, 1, 16, 46, 59, 45, 90, 69, 76, 25, 53, 50, 24, 66, 2, 17, 85, 5, 86, 4, 88, 44, 5, 29, 19, 27, 14, 36, 57, 59, 15, 71, 79, 7, 61, 45, 72, 61, 45, 61, 54, 90, 33, 81, 5, 45, 64, 87, 82, 61, 8 }; OpenShopSpec ex4(20,20,ex4_p); /// The instances OpenShopSpec examples[] = { ex0, ex1, ex2, ex3, ex4 }; /// The number of instances const unsigned int n_examples = sizeof(examples) / sizeof(OpenShopSpec); //@} } // STATISTICS: example-any gecode-4.2.1/examples/ortho-latin.cpp0000755000175000010010000001125412166527420016656 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2004 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include using namespace Gecode; /** * \brief %Example: Orthogonal latin squares * * \ingroup Example */ class OrthoLatinSquare : public Script { protected: /// Size of squares const int n; /// Fields of first square IntVarArray x1; /// Fields of second square IntVarArray x2; public: /// Access field at position \a i and \a j in first square IntVar& y1(int i, int j) { return x1[i*n+j]; } /// Access field at position \a i and \a j in first square const IntVar& y1(int i, int j) const { return x1[i*n+j]; } /// Access field at position \a i and \a j in second square IntVar& y2(int i, int j) { return x2[i*n+j]; } /// Access field at position \a i and \a j in second square const IntVar& y2(int i, int j) const { return x2[i*n+j]; } /// Actual model OrthoLatinSquare(const SizeOptions& opt) : n(opt.size()), x1(*this,n*n,1,n), x2(*this,n*n,1,n) { const int nn = n*n; IntVarArgs z(*this,nn,0,n*n-1); distinct(*this, z, opt.icl()); // Connect { IntArgs mod(n*n); IntArgs div(n*n); for (int i=0; i(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/partition.cpp0000755000175000010010000000772112166527420016433 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2003 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** * \brief %Example: partition numbers into two groups * * \ingroup Example */ class Partition : public Script { protected: /// First group of numbers IntVarArray x; /// Second group of numbers IntVarArray y; public: /// Actual model Partition(const SizeOptions& opt) : x(*this,opt.size(),1,2*opt.size()), y(*this,opt.size(),1,2*opt.size()) { const int n = opt.size(); // Break symmetries by ordering numbers in each group rel(*this, x, IRT_LE); rel(*this, y, IRT_LE); rel(*this, x[0], IRT_LE, y[0]); IntVarArgs xy(2*n); for (int i = n; i--; ) { xy[i] = x[i]; xy[n+i] = y[i]; } distinct(*this, xy, opt.icl()); IntArgs c(2*n); for (int i = n; i--; ) { c[i] = 1; c[n+i] = -1; } linear(*this, c, xy, IRT_EQ, 0); // Array of products IntVarArgs sxy(2*n), sx(n), sy(n); for (int i = n; i--; ) { sx[i] = sxy[i] = expr(*this, sqr(x[i])); sy[i] = sxy[n+i] = expr(*this, sqr(y[i])); } linear(*this, c, sxy, IRT_EQ, 0); // Redundant constraints linear(*this, x, IRT_EQ, 2*n*(2*n+1)/4); linear(*this, y, IRT_EQ, 2*n*(2*n+1)/4); linear(*this, sx, IRT_EQ, 2*n*(2*n+1)*(4*n+1)/12); linear(*this, sy, IRT_EQ, 2*n*(2*n+1)*(4*n+1)/12); branch(*this, xy, INT_VAR_AFC_SIZE_MAX(opt.decay()), INT_VAL_MIN()); } /// Constructor used during cloning \a s Partition(bool share, Partition& s) : Script(share,s) { x.update(*this, share, s.x); y.update(*this, share, s.y); } /// Copying during cloning virtual Space* copy(bool share) { return new Partition(share,*this); } /// Print solution virtual void print(std::ostream& os) const { os << "\t"; int a, b; a = b = 0; for (int i = 0; i < x.size(); i++) { a += x[i].val(); b += x[i].val()*x[i].val(); os << x[i] << ", "; } os << " = " << a << ", " << b << std::endl << "\t"; a = b = 0; for (int i = 0; i < y.size(); i++) { a += y[i].val(); b += y[i].val()*y[i].val(); os << y[i] << ", "; } os << " = " << a << ", " << b << std::endl; } }; /** * \brief Main-functiona * \relates Partition */ int main(int argc, char* argv[]) { SizeOptions opt("Partition"); opt.size(32); opt.icl(ICL_BND); opt.parse(argc,argv); Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/pentominoes.cpp0000644000175000010010000005762212166527420016764 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Mikael Lagerkvist * * Contributing authors: * Guido Tack * * Copyright: * Mikael Lagerkvist, 2006 * Guido Tack, 2006 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** \brief Specification of one tile * * This structure can be used to specify a tile with specified width * and height, number of such tiles (all with unique values), and a * char-array tile showing the tile in row-major order. * * \relates Pentominoes */ class TileSpec { public: int width; ///< Width of tile int height; ///< Height of tile int amount; ///< Number of tiles const char *tile; ///< Picture of tile }; /** \brief Board specifications * * Each board specification repurposes the first two TileSpecs to * record width and height of the board (TileSpec 0) as well as the * number of tiles and whether the board is filled (TileSpec 1). * * \relates Pentominoes */ extern const TileSpec *examples[]; /** \brief Board specification sizes * * \relates Pentominoes */ extern const int examples_size[]; /** \brief Number of board specifications * * \relates Pentominoes */ extern const unsigned int n_examples; namespace { /** \name Symmetry functions * * These functions implement the 8 symmetries of 2D planes. The * functions are templatized so that they can be used both for the * pieces (defined using C-strings) and for arrays of variables. * * \relates Pentominoes */ //@{ /** Return index of (\a h, \a w) in the row-major layout of a matrix with * width \a w1 and height \a h1. */ int pos(int h, int w, int h1, int w1); /// Type for tile symmetry functions typedef void (*tsymmfunc)(const char*, int, int, char*, int&, int&); /// Type for board symmetry functions typedef void (*bsymmfunc)(const IntVarArgs, int, int, IntVarArgs&, int&, int&); /// Identity symmetry template void id(CArray t1, int w1, int h1, Array t2, int& w2, int&h2); /// Rotate 90 degrees template void rot90(CArray t1, int w1, int h1, Array t2, int& w2, int& h2); /// Rotate 180 degrees template void rot180(CArray t1, int w1, int h1, Array t2, int& w2, int& h2); /// Rotate 270 degrees template void rot270(CArray t1, int w1, int h1, Array t2, int& w2, int& h2); /// Flip x-wise template void flipx(CArray t1, int w1, int h1, Array t2, int& w2, int& h2); /// Flip y-wise template void flipy(CArray t1, int w1, int h1, Array t2, int& w2, int& h2); /// Flip diagonal 1 template void flipd1(CArray t1, int w1, int h1, Array t2, int& w2, int& h2); /// Flip diagonal 2 template void flipd2(CArray t1, int w1, int h1, Array t2, int& w2, int& h2); //@} } /** * \brief %Example: %Pentominoes * * \section ScriptPentominoesProblem The Problem * * This example places pieces of a puzzle, where each piece is * composed of a collection of squares, onto a grid. The pieces may * all be rotated and flipped freely. The goal is to place all the * pieces on the grid, without any overlaps. An example piece to be * placed looks like * \code * XXX * X * XXX * \endcode * in one of its rotations. * * The most famous instance of such a puzzle is the Pentominoes * puzzle, where the pieces are all pieces formed by 5 four-connected * squares. * * * \section ScriptPentominoesVariables The Variables * * The variables for the model is the grid of squares that the pieces * are placed on, where each of the variables for the squares takes * the value of the number of the piece which is placed overonto it. * * * \section ScriptPentominoesOnePiece Placing one piece * * The constraint for each piece placement uses regular expressions * (and consequently the extensional constraint) for expressing * placement of (rotated) pieces on the grid. Consider the simple * example of placing the piece * \code * XX * X * X * \endcode * onto the 4 by 4 board * \code * 0123 * 4567 * 89AB * CDEF * \endcode * * Let the variables 0-F be 0/1-variables indicating if the piece is * placed on that position or not. First consider placing the piece on * some location, say covering 1,2,6, and A. Then, writing the * sequence of values for the variables 0-F out, we get the string * 0110001000100000. This string and all other strings corresponding * to placing the above piece in that particular rotation can be * described using the regular expression \f$0^*11000100010^*\f$. The * expression indicates that first comes some number of zeroes, then * two ones in a row (covering places 1 and 2 in our example * placement), then comes exactly three 0's (not covering places 3, 4, * and 5), and so on. The variable number of 0's at the beginning and at the end * makes the expression match any placement of the piece on the board. * * There is one problem with the above constraint, since it allows * placing the piece covering places 3, 4, 8, and C. That is, the * piece may wrap around the board. To prohibit this, we add a new * dummy-column to the board, so that it looks like * \code * 0123G * 4567H * 89ABI * CDEFJ * \endcode * The variables for places G to J are all set to zero initially, and the * regular expression for the placement of the piece is modified to * include the extra column, \f$0^*1100001000010^*\f$. * * * \section ScriptPentominoesRotatingPiece Rotating pieces * * To handle rotations of the piece, we can use disjunctions of * regular expressions for all the relevant rotations. Consider the * rotated version of the above piece, depicted below. * \code * X * XXX * \endcode * The corresponding regular expression for this piece is * \f$0^*1001110^*\f$. To combine these two regular expressions, we * can simply use disjunction of regular expressions, arriving at the * expression \f$0^*1100001000010^*|0^*1001110^*\f$ for enforcing * the placement of the piece in one of the above two rotations. * * There are 8 symmetries for the pieces in general. The 8 disjuncts * for a particular piece might, however, contain less than 8 distinct * expressions (for example, any square has only one distinct * disjunct). This is removed when then automaton for the expression * is computed, since it is minimized. * * * \section ScriptPentominoesSeveral Placing several pieces * * To generalize the above model to several pieces, we let the * variables range from 0 to n, where n is the number of pieces to * place. Given that we place three pieces, and that the above shown * piece is number one, we will replace each \f$0\f$-expression with * the expression \f$(0|2|3)\f$. Thus, the second regular expression * becomes \f$(0|2|3)^*1(0|2|3)(0|2|3)111(0|2|3)^*\f$. Additionaly, * the end of line marker gets its own value. * * This generalization suffers from the fact that the automata become * much more complex. This problem can be solved by instead * projecting out each component, which gives a new board of * 0/1-variables for each piece to place. * * * \section ScriptPentominoesHeuristic The Branching * * This model does not use any advanced heuristic for the * branching. The variables selection is simply in order, and the * value selection is minimum value first. * * The static value selection allows us to order the pieces in the * specification of the problem. The pieces are approximately ordered by * largness or hardness to place. * * * \section ScriptPentominoesSymmetries Removing board symmetries * * Especially when searching for all solutions of a puzzle instance, * we might want to remove the symmetrical boards from the * solutions-space. This is done using the same symmetry functions as * for the piece symmetries and lexicographical order constraints. * * * \ingroup Example * */ class Pentominoes : public Script { public: /// Choice of propagators enum { PROPAGATION_INT, ///< Use integer propagators PROPAGATION_BOOLEAN, ///< Use Boolean propagators }; /// Choice of symmetry breaking enum { SYMMETRY_NONE, ///< Do not remove symmetric solutions SYMMETRY_FULL, ///< Remove symmetric solutions }; private: /// Specification of the tiles to place. const TileSpec *spec; /// Width and height of the board int width, height; /// Whether the board is filled or not bool filled; /// Number of specifications of tiles to place int nspecs; /// Number of tiles to place int ntiles; /// The variables for the board. IntVarArray board; /// Compute number of tiles int compute_number_of_tiles(const TileSpec* ts, int nspecs) { int res = 0; for (int i = nspecs; i--; ) { res += ts[i].amount; } return res; } /// Returns the regular expression for placing a specific tile \a /// tile in a specific rotation. REG tile_reg(int twidth, int theight, const char* tile, REG mark, REG other, REG eol) { REG oe = other | eol; REG res = *oe; REG color[] = {other, mark}; for (int h = 0; h < theight; ++h) { for (int w = 0; w < twidth; ++w) { int which = tile[h*twidth + w] == 'X'; res += color[which]; } if (h < theight-1) { res += oe(width-twidth, width-twidth); } } res += *oe + oe; return res; } /// Returns the regular expression for placing tile number \a t in /// any rotation. REG get_constraint(int t, REG mark, REG other, REG eol) { // This should be done for all rotations REG res; char *t2 = new char[width*height]; int w2, h2; tsymmfunc syms[] = {id, flipx, flipy, flipd1, flipd2, rot90, rot180, rot270}; int symscnt = sizeof(syms)/sizeof(tsymmfunc); for (int i = 0; i < symscnt; ++i) { syms[i](spec[t].tile, spec[t].width, spec[t].height, t2, w2, h2); res = res | tile_reg(w2, h2, t2, mark, other, eol); } delete [] t2; return res; } public: /// Construction of the model. Pentominoes(const SizeOptions& opt) : spec(examples[opt.size()]), width(spec[0].width+1), // Add one for extra row at end. height(spec[0].height), filled(spec[0].amount), nspecs(examples_size[opt.size()]-1), ntiles(compute_number_of_tiles(spec+1, nspecs)), board(*this, width*height, filled,ntiles+1) { spec += 1; // No need for the specification-part any longer // Set end-of-line markers for (int h = 0; h < height; ++h) { for (int w = 0; w < width-1; ++w) rel(*this, board[h*width + w], IRT_NQ, ntiles+1); rel(*this, board[h*width + width - 1], IRT_EQ, ntiles+1); } // Post constraints if (opt.propagation() == PROPAGATION_INT) { int tile = 0; for (int i = 0; i < nspecs; ++i) { for (int j = 0; j < spec[i].amount; ++j) { // Color int col = tile+1; // Expression for color col REG mark(col); // Build expression for complement to color col REG other; bool first = true; for (int j = filled; j <= ntiles; ++j) { if (j == col) continue; if (first) { other = REG(j); first = false; } else { other |= REG(j); } } // End of line marker REG eol(ntiles+1); extensional(*this, board, get_constraint(i, mark, other, eol)); ++tile; } } } else { // opt.propagation() == PROPAGATION_BOOLEAN int ncolors = ntiles + 2; // Boolean variables for channeling BoolVarArgs p(*this,ncolors * board.size(),0,1); // Post channel constraints for (int i=board.size(); i--; ) { BoolVarArgs c(ncolors); for (int j=ncolors; j--; ) c[j]=p[i*ncolors+j]; channel(*this, c, board[i]); } // For placing tile i, we construct the expression over // 0/1-variables and apply it to the projection of // the board on the color for the tile. REG other(0), mark(1); int tile = 0; for (int i = 0; i < nspecs; ++i) { for (int j = 0; j < spec[i].amount; ++j) { int col = tile+1; // Projection for color col BoolVarArgs c(board.size()); for (int k = board.size(); k--; ) { c[k] = p[k*ncolors+col]; } extensional(*this, c, get_constraint(i, mark, other, other)); ++tile; } } } if (opt.symmetry() == SYMMETRY_FULL) { // Remove symmetrical boards IntVarArgs orig(board.size()-height), symm(board.size()-height); int pos = 0; for (int i = 0; i < board.size(); ++i) { if ((i+1)%width==0) continue; orig[pos++] = board[i]; } int w2, h2; bsymmfunc syms[] = {flipx, flipy, flipd1, flipd2, rot90, rot180, rot270}; int symscnt = sizeof(syms)/sizeof(bsymmfunc); for (int i = 0; i < symscnt; ++i) { syms[i](orig, width-1, height, symm, w2, h2); if (width-1 == w2 && height == h2) rel(*this, orig, IRT_LQ, symm); } } // Install branching branch(*this, board, INT_VAR_NONE(), INT_VAL_MIN()); } /// Constructor for cloning \a s Pentominoes(bool share, Pentominoes& s) : Script(share,s), spec(s.spec), width(s.width), height(s.height), filled(s.filled), nspecs(s.nspecs) { board.update(*this, share, s.board); } /// Copy space during cloning virtual Space* copy(bool share) { return new Pentominoes(share,*this); } /// Print solution virtual void print(std::ostream& os) const { for (int h = 0; h < height; ++h) { os << "\t"; for (int w = 0; w < width-1; ++w) { int val = board[h*width + w].val(); char c = val < 10 ? '0'+val : 'A' + (val-10); os << c; } os << std::endl; } os << std::endl; } }; /** \brief Main-function * \relates Pentominoes */ int main(int argc, char* argv[]) { SizeOptions opt("Pentominoes"); opt.size(1); opt.symmetry(Pentominoes::SYMMETRY_FULL); opt.symmetry(Pentominoes::SYMMETRY_NONE, "none", "do not remove symmetric solutions"); opt.symmetry(Pentominoes::SYMMETRY_FULL, "full", "remove symmetric solutions"); opt.propagation(Pentominoes::PROPAGATION_BOOLEAN); opt.propagation(Pentominoes::PROPAGATION_INT, "int", "use integer propagators"); opt.propagation(Pentominoes::PROPAGATION_BOOLEAN, "bool", "use Boolean propagators"); opt.parse(argc,argv); if (opt.size() >= n_examples) { std::cerr << "Error: size must be between 0 and " << n_examples-1 << std::endl; return 1; } Script::run(opt); return 0; } /** \name Puzzle specifications * * \relates Pentominoes */ //@{ /// Small specification static const TileSpec puzzle0[] = { // Width and height of board {4, 4, true, ""}, {2, 3, 1, "XX" "X " "X "}, {2, 1, 1, "XX"}, {3, 3, 1, " XX" " X" "XXX"}, {1, 1, 1, "X"}, {3, 1, 1, "XXX"} }; /// Standard specification static const TileSpec puzzle1[] = { // Width and height of board {8, 8, true, ""}, {3, 3, 1, "XXX" "XXX" "XX "}, {5, 3, 1, " XXX" " X " "XXX "}, {3, 4, 1, "XXX" "XXX" " X" " X"}, {3, 4, 1, "XXX" " X" " X" " X"}, {2, 5, 1, " X" " X" " X" "XX" "XX"}, {4, 2, 1, "XX " "XXXX"}, {3, 3, 1, "XXX" " X" " X"}, {2, 3, 1, "XX" "X " "X "}, {2, 4, 1, "XX" "XX" "XX" "XX"}, {3, 2, 1, "XX " "XXX"} }; // Perfect square number 2 from examples/perfect-square.cc static const TileSpec square2[] = { // Width and height of board {10, 10, true, ""}, {6, 6, 1, "XXXXXX" "XXXXXX" "XXXXXX" "XXXXXX" "XXXXXX" "XXXXXX" }, {4, 4, 3, "XXXX" "XXXX" "XXXX" "XXXX"}, {2, 2, 4, "XX" "XX"} }; // Perfect square number 3 from examples/perfect-square.cc static const TileSpec square3[] = { // Width and height of board {20, 20, true, ""}, {9, 9, 1, "XXXXXXXXX" "XXXXXXXXX" "XXXXXXXXX" "XXXXXXXXX" "XXXXXXXXX" "XXXXXXXXX" "XXXXXXXXX" "XXXXXXXXX" "XXXXXXXXX" }, {8, 8, 2, "XXXXXXXX" "XXXXXXXX" "XXXXXXXX" "XXXXXXXX" "XXXXXXXX" "XXXXXXXX" "XXXXXXXX" "XXXXXXXX" }, {7, 7, 1, "XXXXXXX" "XXXXXXX" "XXXXXXX" "XXXXXXX" "XXXXXXX" "XXXXXXX" "XXXXXXX" }, {5, 5, 1, "XXXXX" "XXXXX" "XXXXX" "XXXXX" "XXXXX" }, {4, 4, 5, "XXXX" "XXXX" "XXXX" "XXXX"}, {3, 3, 3, "XXX" "XXX" "XXX"}, {2, 2, 2, "XX" "XX"}, {1, 1, 2, "X"} }; static const TileSpec pentomino6x10[] = { // Width and height of board {10, 6, true, ""}, {2, 4, 1, "X " "X " "X " "XX"}, {3,3, 1, "XX " " XX" " X "}, {3,3, 1, "XXX" " X " " X "}, {3,3, 1, " X" " XX" "XX "}, {2,4, 1, " X" "XX" " X" " X"}, {5,1, 1, "XXXXX"}, {3,3, 1, "X " "XXX" " X"}, {4,2, 1, " XXX" "XX "}, {2,3, 1, "XX" "XX" " X"}, {3,2, 1, "X X" "XXX"}, {3,3, 1, " X " "XXX" " X "}, {3,3, 1, " X" " X" "XXX"} }; static const TileSpec pentomino5x12[] = { // Width and height of board {12, 5, true, ""}, {2, 4, 1, "X " "X " "X " "XX"}, {3,3, 1, "XX " " XX" " X "}, {3,3, 1, "XXX" " X " " X "}, {3,3, 1, " X" " XX" "XX "}, {2,4, 1, " X" "XX" " X" " X"}, {5,1, 1, "XXXXX"}, {3,3, 1, "X " "XXX" " X"}, {4,2, 1, " XXX" "XX "}, {2,3, 1, "XX" "XX" " X"}, {3,2, 1, "X X" "XXX"}, {3,3, 1, " X " "XXX" " X "}, {3,3, 1, " X" " X" "XXX"} }; static const TileSpec pentomino4x15[] = { // Width and height of board {15, 4, true, ""}, {2, 4, 1, "X " "X " "X " "XX"}, {3,3, 1, "XX " " XX" " X "}, {3,3, 1, "XXX" " X " " X "}, {3,3, 1, " X" " XX" "XX "}, {2,4, 1, " X" "XX" " X" " X"}, {5,1, 1, "XXXXX"}, {3,3, 1, "X " "XXX" " X"}, {4,2, 1, " XXX" "XX "}, {2,3, 1, "XX" "XX" " X"}, {3,2, 1, "X X" "XXX"}, {3,3, 1, " X " "XXX" " X "}, {3,3, 1, " X" " X" "XXX"} }; static const TileSpec pentomino3x20[] = { // Width and height of board {20, 3, true, ""}, {2, 4, 1, "X " "X " "X " "XX"}, {3,3, 1, "XX " " XX" " X "}, {3,3, 1, "XXX" " X " " X "}, {3,3, 1, " X" " XX" "XX "}, {2,4, 1, " X" "XX" " X" " X"}, {5,1, 1, "XXXXX"}, {3,3, 1, "X " "XXX" " X"}, {4,2, 1, " XXX" "XX "}, {2,3, 1, "XX" "XX" " X"}, {3,2, 1, "X X" "XXX"}, {3,3, 1, " X " "XXX" " X "}, {3,3, 1, " X" " X" "XXX"} }; /// List of specifications const TileSpec *examples[] = {puzzle0, puzzle1, square2, square3, pentomino6x10,pentomino5x12, pentomino4x15,pentomino3x20}; const int examples_size[] = {sizeof(puzzle0)/sizeof(TileSpec), sizeof(puzzle1)/sizeof(TileSpec), sizeof(square2)/sizeof(TileSpec), sizeof(square3)/sizeof(TileSpec), sizeof(pentomino6x10)/sizeof(TileSpec), sizeof(pentomino5x12)/sizeof(TileSpec), sizeof(pentomino4x15)/sizeof(TileSpec), sizeof(pentomino3x20)/sizeof(TileSpec)}; /// Number of specifications const unsigned n_examples = sizeof(examples)/sizeof(TileSpec*); //@} // Symmetry functions namespace { int pos(int h, int w, int h1, int w1) { if (!(0 <= h && h < h1) || !(0 <= w && w < w1)) { std::cerr << "Cannot place (" << h << "," << w << ") on board of size " << h1 << "x" << w1 << std::endl; } return h * w1 + w; } template void id(CArray t1, int w1, int h1, Array t2, int& w2, int&h2) { w2 = w1; h2 = h1; for (int h = 0; h < h1; ++h) for (int w = 0; w < w1; ++w) t2[pos(h, w, h2, w2)] = t1[pos(h, w, h1, w1)]; } template void rot90(CArray t1, int w1, int h1, Array t2, int& w2, int& h2) { w2 = h1; h2 = w1; for (int h = 0; h < h1; ++h) for (int w = 0; w < w1; ++w) t2[pos(w, w2-h-1, h2, w2)] = t1[pos(h, w, h1, w1)]; } template void rot180(CArray t1, int w1, int h1, Array t2, int& w2, int& h2) { w2 = w1; h2 = h1; for (int h = 0; h < h1; ++h) for (int w = 0; w < w1; ++w) t2[pos(h2-h-1, w2-w-1, h2, w2)] = t1[pos(h, w, h1, w1)]; } template void rot270(CArray t1, int w1, int h1, Array t2, int& w2, int& h2) { w2 = h1; h2 = w1; for (int h = 0; h < h1; ++h) for (int w = 0; w < w1; ++w) t2[pos(h2-w-1, h, h2, w2)] = t1[pos(h, w, h1, w1)]; } template void flipx(CArray t1, int w1, int h1, Array t2, int& w2, int& h2) { w2 = w1; h2 = h1; for (int h = 0; h < h1; ++h) for (int w = 0; w < w1; ++w) t2[pos(h, w2-w-1, h2, w2)] = t1[pos(h, w, h1, w1)]; } template void flipy(CArray t1, int w1, int h1, Array t2, int& w2, int& h2) { w2 = w1; h2 = h1; for (int h = 0; h < h1; ++h) for (int w = 0; w < w1; ++w) t2[pos(h2-h-1, w, h2, w2)] = t1[pos(h, w, h1, w1)]; } template void flipd1(CArray t1, int w1, int h1, Array t2, int& w2, int& h2) { w2 = h1; h2 = w1; for (int h = 0; h < h1; ++h) for (int w = 0; w < w1; ++w) t2[pos(w, h, h2, w2)] = t1[pos(h, w, h1, w1)]; } template void flipd2(CArray t1, int w1, int h1, Array t2, int& w2, int& h2) { w2 = h1; h2 = w1; for (int h = 0; h < h1; ++h) for (int w = 0; w < w1; ++w) t2[pos(h2-w-1, w2-h-1, h2, w2)] = t1[pos(h, w, h1, w1)]; } } // STATISTICS: example-any gecode-4.2.1/examples/perfect-square.cpp0000755000175000010010000002311612166527420017344 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Mikael Lagerkvist * * Copyright: * Christian Schulte, 2003 * Mikael Lagerkvist, 2005 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** * \name Specifications for perfect square problems * * The first element is the number of squares to be placed, the * second the size of the master square, and the remaining the * sizes of the squares to be packed. * * The data is taken from: C. J. Bouwkamp and A. J. W. * Duijvestijn, Catalogue of Simple Perfect Squared Squares of Orders * 21 Through 25, Eindhoven Univ. Technology, Dept. of Math., * Report 92-WSK-03, Nov. 1992. * * \relates PerfectSquare */ //@ const int s00[] = { 21, 112, 50,42,37,35,33,29,27,25,24,19,18,17,16,15,11,9,8,7,6,4,2 }; const int s01[] = { 22, 110, 60,50,28,27,26,24,23,22,21,18,17,16,15,14,13,12,8,7,6,4,3,2 }; const int s02[] = { 22, 192, 86,71,62,59,57,49,47,41,37,36,35,31,28,26,19,17,14,12,10,9,8,4 }; const int s03[] = { 23, 110, 44,41,38,37,32,31,29,28,21,19,16,15,14,13,12,10,8,7,5,4,3,2,1 }; const int s04[] = { 23, 332, 129,123,120,112,91,89,83,68,58,56,53,50,49,48,47,38,31,30,26,24,17,15,1 }; const int s05[] = { 24, 120, 47,46,41,40,34,33,32,25,23,20,19,17,16,15,14,13,12,10,9,8,6,5,4,3 }; const int s06[] = { 24, 479, 175,174,164,160,155,150,140,130,86,77,68,60,52,44,43,35,29,28,26,24,23,17,6,5 }; const int s07[] = { 25, 147, 74,73,41,40,34,33,32,27,25,23,20,19,17,16,15,14,13,12,10,9,8,6,5,4,3 }; const int s08[] = { 25, 661, 262,248,238,210,203,196,175,161,111,106,102,84,83,77,73,64,41,38,36,31,23,18,17,7,5 }; const int s09[] = { 26, 212, 99,85,65,62,57,56,55,48,39,38,32,28,26,24,23,20,19,17,16,12,7,6,5,4,2,1 }; const int s10[] = { 26, 214, 86,72,67,64,61,56,55,44,43,39,36,35,34,32,30,29,27,26,23,20,19,10,9,8,6,5 }; const int s11[] = { 26, 825, 304,302,288,277,246,235,233,189,157,135,127,117,109,92,90,83,81,76,57,53,49,37,26,25,8,5 }; const int s12[] = { 27, 180, 89,56,51,50,48,43,41,40,39,36,34,31,29,25,23,21,19,16,15,13,12,10,9,7,6,4,1 }; const int s13[] = { 27, 1179, 484,440,387,379,360,352,316,308,198,194,168,149,145,119,114,108,82,80,69,66,63,50,42,35,29,24,18 }; const int s14[] = { 28, 201, 77,70,68,67,64,56,54,39,38,36,34,32,30,24,22,21,18,17,16,13,12,11,10,6,4,3,2,1 }; const int s15[] = { 28, 1544, 649,615,510,473,456,439,419,385,260,216,214,208,203,175,147,135,125,116,104,94,81,55,49,17,12,7,6,4 }; const int s16[] = { 29, 255, 112,107,84,75,68,64,59,51,49,43,37,36,31,29,28,27,26,25,24,22,17,15,13,11,8,7,6,2,1 }; const int s17[] = { 29, 2134, 855,769,761,717,648,604,562,518,338,293,292,286,265,226,224,204,186,179,174,165,161,109,100,91,69,45,43,17,9 }; const int s18[] = { 30, 237, 88,82,79,76,73,56,53,46,45,43,40,39,36,34,33,32,29,27,25,24,23,21,20,16,11,10,9,5,3,1 }; const int s19[] = { 30, 2710, 992,981,948,936,826,782,781,737,465,440,418,289,272,264,260,242,227,210,208,154,140,124,122,108,92,64,29,16,15,4 }; const int s20[] = { 40, 510, 219,173,156,135,134,128,124,118,114,95,81,79,71,65,63,59,58,55,54,51,49,46,34,33,32,31,28,24,21,20,19,18,17,16,14,10,8,4,3,1 }; const int s21[] = { 40, 1121, 409,408,396,345,317,316,242,238,221,198,166,159,157,143,130,123,120,117,109,102,101,93,87,79,76,67,64,55,53,49,46,44,39,33,21,19,14,13,5,3 }; const int s22[] = { 50, 788, 301,300,246,242,187,182,177,168,145,139,135,128,114,110,103,93,87,84,82,81,79,73,69,63,58,57,52,51,49,47,41,40,34,33,26,23,22,21,20,19,18,15,13,11,10,9,8,7,4,2 }; const int s23[] = { 50, 1034, 588,446,305,283,175,163,160,138,132,130,128,124,120,116,110,107,106,103,101,100,94,86,85,82,80,77,74,64,63,62,61,60,57,54,47,46,45,43,40,39,32,30,28,27,26,25,22,7,6,1 }; const int s24[] = { 60, 1097, 645,452,268,264,204,188,184,176,172,165,161,143,132,127,116,114,108,104,100,94,92,90,88,84,75,74,72,71,69,68,67,64,62,61,56,51,46,36,34,30,29,28,26,25,21,20,19,18,17,16,15,14,12,10,9,7,5,4,2,1 }; const int s25[] = { 60, 1192, 638,554,335,303,285,271,219,180,174,159,149,148,136,125,110,98,94,85,77,76,75,74,72,71,69,65,63,62,61,60,59,57,55,51,50,49,48,47,46,45,44,43,40,39,37,35,32,31,25,16,15,14,12,10,9,8,6,4,2,1 }; const int s26[] = { 75, 1412, 793,619,473,320,287,207,188,181,179,170,167,153,151,149,142,140,132,127,121,117,116,106,105,103,97,93,92,91,90,87,84,83,82,76,74,73,72,71,70,69,67,66,65,64,63,61,54,53,49,45,39,38,35,34,33,32,30,29,28,27,26,24,21,20,19,18,15,14,13,11,10,9,6,5,3 }; const int* specs[] = { &s00[0],&s01[0],&s02[0],&s03[0],&s04[0], &s05[0],&s06[0],&s07[0],&s08[0],&s09[0], &s10[0],&s11[0],&s12[0],&s13[0],&s14[0], &s15[0],&s16[0],&s17[0],&s18[0],&s19[0], &s20[0],&s21[0],&s22[0],&s23[0],&s24[0], &s25[0],&s26[0] }; const unsigned int n_specs = sizeof(specs) / sizeof(int*); //@} /** * \brief %Example: Packing squares into a rectangle * * See problem 9 at http://www.csplib.org/. * * \ingroup Example */ class PerfectSquare : public Script { protected: /// Array of x-coordinates of squares IntVarArray x; /// Array of y-coordinates of squares IntVarArray y; public: /// Propagation to use for model enum { PROP_REIFIED, ///< Use reified constraints PROP_CUMULATIVES ///< Use cumulatives constraint }; /// Actual model PerfectSquare(const SizeOptions& opt) : x(*this,specs[opt.size()][0],0,specs[opt.size()][1]-1), y(*this,specs[opt.size()][0],0,specs[opt.size()][1]-1) { const int* s = specs[opt.size()]; int n = *s++; int w = *s++; // Restrict position according to square size for (int i=n; i--; ) { rel(*this, x[i], IRT_LQ, w-s[i]); rel(*this, y[i], IRT_LQ, w-s[i]); } IntArgs sa(n,s); // Squares do not overlap nooverlap(*this, x, sa, y, sa); /* * Capacity constraints * */ switch (opt.propagation()) { case PROP_REIFIED: { for (int cx=0; cx= n_specs) { std::cerr << "Error: size must be between 0 and " << n_specs - 1 << std::endl; return 1; } Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/photo.cpp0000644000175000010010000001144112166527420015542 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2001 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /// Specifications for the photo example class PhotoSpec { public: const int n_names; ///< Number of people on picture const int n_prefs; ///< Number of preferences const int* prefs; ///< Array of preferences PhotoSpec(const int n_n, const int n_p, const int* p) : n_names(n_n), n_prefs(n_p), prefs(p) {} }; /// Preferences for small example const int s_prefs[] = { 0,2, 1,4, 2,3, 2,4, 3,0, 4,3, 4,0, 4,1 }; /// Small Photo example const PhotoSpec p_small(5, 8, s_prefs); /// Preferences for large example const int l_prefs[] = { 0,2, 0,4, 0,7, 1,4, 1,8, 2,3, 2,4, 3,0, 3,4, 4,5, 4,0, 5,0, 5,8, 6,2, 6,7, 7,8, 7,6 }; /// Large Photo example const PhotoSpec p_large(9,17, l_prefs); /** * \brief %Example: Placing people on a photo * * A group of people wants to take a group photo. Each person can give * preferences next to whom he or she wants to be placed on the * photo. The problem to be solved is to find a placement that * violates as few preferences as possible. * * \ingroup Example * */ class Photo : public IntMinimizeScript { protected: /// Photo specification const PhotoSpec& spec; /// Person's position on photo IntVarArray pos; /// Number of violated preferences IntVar violations; public: /// Branching to use for model enum { BRANCH_NONE, ///< Choose variables from left to right BRANCH_DEGREE ///< Choose variable with largest degree }; /// Actual model Photo(const SizeOptions& opt) : spec(opt.size() == 0 ? p_small : p_large), pos(*this,spec.n_names, 0, spec.n_names-1), violations(*this,0,spec.n_prefs) { // Map preferences to violation BoolVarArgs viol(spec.n_prefs); for (int i=0; i 1); } rel(*this, violations == sum(viol)); distinct(*this, pos, opt.icl()); // Break some symmetries rel(*this, pos[0] < pos[1]); if (opt.branching() == BRANCH_NONE) { branch(*this, pos, INT_VAR_NONE(), INT_VAL_MIN()); } else { branch(*this, pos, tiebreak(INT_VAR_DEGREE_MAX(),INT_VAR_SIZE_MIN()), INT_VAL_MIN()); } } /// Constructor for cloning \a s Photo(bool share, Photo& s) : IntMinimizeScript(share,s), spec(s.spec) { pos.update(*this, share, s.pos); violations.update(*this, share, s.violations); } /// Copy during cloning virtual Space* copy(bool share) { return new Photo(share,*this); } /// Print solution virtual void print(std::ostream& os) const { os << "\tpos[] = " << pos << std::endl << "\tviolations: " << violations << std::endl; } /// Return solution cost virtual IntVar cost(void) const { return violations; } }; /** \brief Main-function * \relates Photo */ int main(int argc, char* argv[]) { SizeOptions opt("Photo"); opt.solutions(0); opt.size(1); opt.iterations(10); opt.icl(ICL_BND); opt.branching(Photo::BRANCH_DEGREE); opt.branching(Photo::BRANCH_NONE, "none"); opt.branching(Photo::BRANCH_DEGREE, "degree"); opt.parse(argc,argv); IntMaximizeScript::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/queen-armies.cpp0000644000175000010010000002336412166527420017013 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Mikael Lagerkvist * * Copyright: * Mikael Lagerkvist, 2006 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include using namespace Gecode; /** \name Constant sets for attacking queens. * * \relates QueenArmies */ IntSet* A; /** * \brief %Example: Peaceable co-existing armies of queens * * The goal of this problem is to place as many white and black queens * on a chess-board without any two queens of different color * attacking each other. The number of black queens should * be greater than or equal to the number of white queens. * * This model is based on the one presented in "Models and Symmetry * Breaking for 'Peaceable Armies of Queens'", by Barbara M. Smith, Karen * E. Petrie, and Ian P. Gent. * * The smart version uses a custom brancher implementing a heuristic * from the above paper, that helps speeding up the proof of * optimality. * * \ingroup Example * */ class QueenArmies : public IntMaximizeScript { public: const int n; SetVar U, ///< Set of un-attacked squares W; ///< Set of squares occupied by white queens BoolVarArray w, ///< The placement of the white queens b; ///< The placement of the black queens IntVar q; ///< The number of white queens placed. /// Branching to use for model enum { BRANCH_NAIVE, ///< Choose variables left to right BRANCH_SPECIFIC ///< Choose variable with problem specific strategy }; /// Constructor QueenArmies(const SizeOptions& opt) : n(opt.size()), U(*this, IntSet::empty, IntSet(0, n*n)), W(*this, IntSet::empty, IntSet(0, n*n)), w(*this, n*n, 0, 1), b(*this, n*n, 0, 1), q(*this, 0, n*n) { // Basic rules of the model for (int i = n*n; i--; ) { // w[i] means that no blacks are allowed on A[i] rel(*this, w[i] == (U || A[i])); // Make sure blacks and whites are disjoint. rel(*this, !w[i] || !b[i]); // If i in U, then b[i] has a piece. rel(*this, b[i] == (singleton(i) <= U)); } // Connect optimization variable to number of pieces linear(*this, w, IRT_EQ, q); linear(*this, b, IRT_GQ, q); // Connect cardinality of U to the number of black pieces. IntVar unknowns = expr(*this, cardinality(U)); rel(*this, q <= unknowns); linear(*this, b, IRT_EQ, unknowns); if (opt.branching() == BRANCH_NAIVE) { branch(*this, w, INT_VAR_NONE(), INT_VAL_MAX()); branch(*this, b, INT_VAR_NONE(), INT_VAL_MAX()); } else { QueenBranch::post(*this); assign(*this, b, INT_ASSIGN_MAX()); } } /// Constructor for cloning QueenArmies(bool share, QueenArmies& s) : IntMaximizeScript(share,s), n(s.n) { U.update(*this, share, s.U); W.update(*this, share, s.W); w.update(*this, share, s.w); b.update(*this, share, s.b); q.update(*this, share, s.q); } /// Return copy during cloning virtual Space* copy(bool share) { return new QueenArmies(share,*this); } /// Return solution cost virtual IntVar cost(void) const { return q; } /// Print solution virtual void print(std::ostream& os) const { os << '\t'; for (int i = 0; i < n*n; ++i) { if (w[i].assigned() && w[i].val()) os << "W"; else if (b[i].assigned() && b[i].val()) os << "B"; else if (!w[i].assigned() && !b[i].assigned()) os << " "; else os << "."; if ((i+1)%n == 0) os << std::endl << (i!=(n*n-1)?"\t":""); } os << "Number of white queens: " << q << std::endl << std::endl; } /** \brief Custom brancher for Peacable queens * * Custom brancher that tries to place white queens so that they * maximise the amount of un-attacked squares that become attacked. * * \relates QueenArmies */ class QueenBranch : public Brancher { private: /// Cache of last computed decision mutable int start; /// Choice class Choice : public Gecode::Choice { public: /// Position of variable int pos; /// Value of variable bool val; /** Initialize choice for brancher \a b, position \a pos0, * and value \a val0. */ Choice(const Brancher& b, int pos0, bool val0) : Gecode::Choice(b,2), pos(pos0), val(val0) {} /// Report size occupied virtual size_t size(void) const { return sizeof(Choice); } /// Archive into \a e virtual void archive(Archive& e) const { Gecode::Choice::archive(e); e << pos << val; } }; /// Construct brancher QueenBranch(Home home) : Brancher(home), start(0) {} /// Constructor for cloning QueenBranch(Space& home, bool share, QueenBranch& b) : Brancher(home, share, b), start(b.start) {} public: /// Check status of brancher, return true if alternatives left. virtual bool status(const Space& home) const { const QueenArmies& q = static_cast(home); for (int i = start; i < q.n*q.n; ++i) if (!q.w[i].assigned()) { start = i; return true; } // No non-assigned orders left return false; } /// Return choice virtual Gecode::Choice* choice(Space& home) { const QueenArmies& q = static_cast(home); int maxsize = -1; int pos = -1; for (int i = start; i < q.n*q.n; ++i) { if (q.w[i].assigned()) continue; IntSetRanges ai(A[i]); SetVarUnknownRanges qU(q.U); Iter::Ranges::Inter r(ai, qU); int size = Iter::Ranges::size(r); if (size > maxsize) { maxsize = size; pos = i; } } assert(pos != -1); return new Choice(*this, pos, true); } /// Return choice virtual Choice* choice(const Space&, Archive& e) { int pos, val; e >> pos >> val; return new Choice(*this, pos, val); } /** \brief Perform commit for choice \a _c and * alternative \a a. */ virtual ExecStatus commit(Space& home, const Gecode::Choice& _c, unsigned int a) { QueenArmies& q = static_cast(home); const Choice& c = static_cast(_c); bool val = (a == 0) ? c.val : !c.val; return me_failed(Int::BoolView(q.w[c.pos]).eq(q, val)) ? ES_FAILED : ES_OK; } /// Print explanation virtual void print(const Space&, const Gecode::Choice& _c, unsigned int a, std::ostream& o) const { const Choice& c = static_cast(_c); bool val = (a == 0) ? c.val : !c.val; o << "w[" << c.pos << "] = " << val; } /// Copy brancher during cloning virtual Actor* copy(Space& home, bool share) { return new (home) QueenBranch(home, share, *this); } /// Post brancher static BrancherHandle post(QueenArmies& home) { return *new (home) QueenBranch(home); } /// Delete brancher and return its size virtual size_t dispose(Space&) { return sizeof(*this); } }; }; /** \brief Position of a piece in a square board. * * \relates QueenArmies */ int pos(int i, int j, int n) { return i*n + j; } /** \brief Main-function * \relates QueenArmies */ int main(int argc, char* argv[]) { SizeOptions opt("QueenArmies"); opt.size(6); opt.branching(QueenArmies::BRANCH_SPECIFIC); opt.branching(QueenArmies::BRANCH_NAIVE, "naive"); opt.branching(QueenArmies::BRANCH_SPECIFIC, "specific"); opt.solutions(0); opt.parse(argc,argv); // Set up the A-sets // A[i] will contain the values attacked by a queen at position i int n = opt.size(); A = new IntSet[n*n]; int *p = new int[std::max(n*n, 25)]; int pn = 0; for (int i = n; i--; ) { for (int j = n; j--; ) { int dir[][2] = { { 0, 1}, { 1, 1}, { 1, 0}, { 0, -1}, {-1, -1}, {-1, 0}, { 1, -1}, {-1, 1} }; p[pn++] = pos(i, j, n); for (int k = 8; k--; ) { for (int l = 0; l < n && 0 <= (i+l*dir[k][0]) && (i+l*dir[k][0]) < n && 0 <= (j+l*dir[k][1]) && (j+l*dir[k][1]) < n; ++l) { p[pn++] = pos(i+l*dir[k][0], j+l*dir[k][1], n); } } A[pos(i, j, n)] = IntSet(p, pn); pn = 0; } } delete [] p; IntMaximizeScript::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/queens.cpp0000644000175000010010000001444612166527420015721 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2001 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #if defined(GECODE_HAS_QT) && defined(GECODE_HAS_GIST) #include #if QT_VERSION >= 0x050000 #include #endif #endif using namespace Gecode; /** * \brief %Example: n-%Queens puzzle * * Place n queens on an n times n chessboard such that they do not * attack each other. * * \ingroup Example * */ class Queens : public Script { public: /// Position of queens on boards IntVarArray q; /// Propagation to use for model enum { PROP_BINARY, ///< Use only binary disequality constraints PROP_MIXED, ///< Use single distinct and binary disequality constraints PROP_DISTINCT ///< Use three distinct constraints }; /// The actual problem Queens(const SizeOptions& opt) : q(*this,opt.size(),0,opt.size()-1) { const int n = q.size(); switch (opt.propagation()) { case PROP_BINARY: for (int i = 0; i(s); if (!scene) initialize(); QList itemList = scene->items(); foreach (QGraphicsItem* i, scene->items()) { scene->removeItem(i); delete i; } for (int i=0; iaddRect(i*unit,j*unit,unit,unit); } QBrush b(q.q[i].assigned() ? Qt::black : Qt::red); QPen p(q.q[i].assigned() ? Qt::black : Qt::white); for (IntVarValues xv(q.q[i]); xv(); ++xv) { scene->addEllipse(QRectF(i*unit+unit/4,xv.val()*unit+unit/4, unit/2,unit/2), p, b); } } mw->show(); } /// Set up main window void initialize(void) { mw = new QMainWindow(); scene = new QGraphicsScene(); QGraphicsView* view = new QGraphicsView(scene); view->setRenderHints(QPainter::Antialiasing); mw->setCentralWidget(view); mw->setAttribute(Qt::WA_QuitOnClose, false); mw->setAttribute(Qt::WA_DeleteOnClose, false); QAction* closeWindow = new QAction("Close window", mw); closeWindow->setShortcut(QKeySequence("Ctrl+W")); mw->connect(closeWindow, SIGNAL(triggered()), mw, SLOT(close())); mw->addAction(closeWindow); } /// Name of the inspector virtual std::string name(void) { return "Board"; } /// Finalize inspector virtual void finalize(void) { delete mw; mw = NULL; } }; #endif /* GECODE_HAS_GIST */ /** \brief Main-function * \relates Queens */ int main(int argc, char* argv[]) { SizeOptions opt("Queens"); opt.iterations(500); opt.size(100); opt.propagation(Queens::PROP_DISTINCT); opt.propagation(Queens::PROP_BINARY, "binary", "only binary disequality constraints"); opt.propagation(Queens::PROP_MIXED, "mixed", "single distinct and binary disequality constraints"); opt.propagation(Queens::PROP_DISTINCT, "distinct", "three distinct constraints"); #if defined(GECODE_HAS_QT) && defined(GECODE_HAS_GIST) QueensInspector ki; opt.inspect.click(&ki); #endif opt.parse(argc,argv); Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/radiotherapy.cpp0000644000175000010010000012111512166527420017104 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * * Contributing authors: * Mikael Lagerkvist * * Copyright: * Guido Tack, 2009 * Mikael Lagerkvist, 2009 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /// Instance data for radio therapy problem class RadiotherapyData { private: /// Compute incremental sum int incr_sum(int row) { int sum = intensity[row*n]; for (int i=1; i= y[i]-y[i-1]); t[i] = s[i-1]; } linear(*this, t, IRT_LQ, x); } /// Constructor for cloning \a s Radiotherapy(bool share, Radiotherapy& s) : IntMinimizeScript(share,s), rd(s.rd) { beamtime.update(*this, share, s.beamtime); N.update(*this, share, s.N); K.update(*this, share, s.K); _cost.update(*this, share, s._cost); q.update(*this, share, s.q); } /// Perform copying during cloning virtual Space* copy(bool share) { return new Radiotherapy(share,*this); } /// Cost to be minimized virtual IntVar cost(void) const { return _cost; } /// Print solution virtual void print(std::ostream& os) const { os << std::endl << "B / K = " << beamtime << " / " << K << ",\nN = " << N << std::endl; } /// Nested search on the q variables class NestedSearch : public Brancher { private: /// Flag that the brancher is done after one commit bool done; /// Mapping of index to weight struct Idx { int idx; ///< Index int weight; ///< Weight /// Sort order (higher weights go first) bool operator<(const Idx& rhs) const { return weight > rhs.weight; } }; /// Weighted ordering of rows SharedArray index; /// Choice that only signals failure or success class Choice : public Gecode::Choice { public: /// Whether brancher should fail bool fail; /// Initialize choice for brancher \a b Choice(const Brancher& b, bool fail0) : Gecode::Choice(b,1), fail(fail0) {} /// Report size occupied virtual size_t size(void) const { return sizeof(Choice); } /// Archive into \a e virtual void archive(Archive& e) const { Gecode::Choice::archive(e); e.put(fail); } }; /// Construct brancher NestedSearch(Space& home) : Brancher(home), done(false) { Radiotherapy& rt = static_cast(home); // Set up ordering of rows. As a heuristic, pre-order the rows // with the potentially cheapest ones first. index.init(rt.rd.m+1); for (int i = rt.rd.m; i--; ) { index[i].idx = i; index[i].weight = 0; for (int j = rt.rd.n; j--; ) index[i].weight += rt.rd.intensity[i*rt.rd.n + j] == 0; } Support::quicksort(&(index[0]), rt.rd.m); for (int i = rt.rd.m; i--; ) index[i].weight = 0; index[rt.rd.m].idx = 10; // A shared object must be disposed properly home.notice(*this, AP_DISPOSE); } /// Copy constructor NestedSearch(Space& home, bool share, NestedSearch& b) : Brancher(home, share, b), done(b.done) { index.update(home, share, b.index); } public: virtual bool status(const Space&) const { return !done; } IntVarArgs getRow(Radiotherapy* row, int i) { IntVarArgs ri(row->rd.n*row->rd.btMax); for (int j=0; jrd.n; j++) { for (int b=0; brd.btMax; b++) { ri[j*row->rd.btMax+b] = row->q[i*row->rd.n*row->rd.btMax+j*row->rd.btMax+b]; } } return ri; } /// Return choice virtual Gecode::Choice* choice(Space& home) { done = true; Radiotherapy& rt = static_cast(home); std::cout << "*"; // Perform nested search for each row bool fail = false; for (int i=0; i(rt.clone()); // Branch over row i branch(*row, getRow(row, index[i].idx), INT_VAR_NONE(), INT_VAL_SPLIT_MIN()); Search::Options o; o.clone = false; if (Radiotherapy* newSol = dfs(row, o) ) { // Found a solution for row i, so try to find one for i+1 delete newSol; std::cerr << index[i].idx; } else { // Found no solution for row i, so back to search the N variables fail = true; index[i].weight += 1; if (i && index[i] < index[i-1]) std::swap(index[i], index[i-1]); break; } } return new Choice(*this, fail); } /// Return choice virtual Choice* choice(const Space&, Archive& e) { bool fail; e >> fail; return new Choice(*this, fail); } /// Perform commit for choice \a _c and alternative \a a virtual ExecStatus commit(Space&, const Gecode::Choice& _c, unsigned int) { return static_cast(_c).fail ? ES_FAILED : ES_OK; } /// Print explanation virtual void print(const Space&, const Gecode::Choice& _c, unsigned int, std::ostream& o) const { const Choice& c = static_cast(_c); o << (c.fail ? "fail" : "ok"); } /// Copy brancher virtual Actor* copy(Space& home, bool share) { return new (home) NestedSearch(home, share, *this); } /// Post brancher static BrancherHandle post(Home home) { return *new (home) NestedSearch(home); } /// Dispose member function size_t dispose(Space& home) { home.ignore(*this,AP_DISPOSE); // Periodic scaling of weights if (!--index[index.size()-1].idx) { index[index.size()-1].idx = 10; for (int i = index.size()-1; i--; ) index[i].weight *= 0.9; } (void) Brancher::dispose(home); (void) index.~SharedArray(); return sizeof(*this); } }; }; /** \brief Main-function * \relates Radiotherapy */ int main(int argc, char* argv[]) { SizeOptions opt("Radiotherapy"); opt.solutions(0); opt.size(0); opt.parse(argc,argv); if (opt.size() >= rds_n) { std::cerr << "Error: size must be between 0 and " << rds_n-1 << std::endl; return 1; } IntMinimizeScript::run(opt); return 0; } namespace { /** \brief Radiotherapy specifications. * * \relates Radiotherapy */ //@{ // Small instance static const int intensity0[] = { 7, 2, 14, 8, 9, 13, 4, 1, 2, 9, 5, 12, 2, 11, 9, 10, 2, 4, 9, 7, 10, 2, 8, 11, 1 }; RadiotherapyData rd0(5,5,intensity0); // Larger instance static const int intensity1[] = { 6, 10, 6, 8, 10, 0, 4, 10, 0, 6, 2, 8, 0, 2, 0 , 1, 8, 3, 1, 0, 8, 0, 3, 6, 10, 9, 8, 9, 6, 9 , 8, 5, 6, 7, 7, 0, 6, 8, 2, 7, 5, 2, 0, 9, 2 , 9, 2, 10, 5, 7, 1, 3, 7, 5, 1, 8, 2, 3, 10, 4 , 8, 7, 4, 1, 6, 3, 0, 1, 2, 6, 4, 4, 0, 5, 0 , 9, 0, 7, 4, 9, 7, 4, 1, 4, 1, 1, 9, 2, 9, 9 , 3, 6, 10, 0, 6, 6, 10, 10, 7, 0, 10, 2, 10, 2, 4 , 8, 9, 5, 2, 6, 1, 9, 0, 4, 2, 4, 1, 5, 1, 4 , 6, 10, 0, 0, 7, 0, 0, 5, 8, 5, 10, 3, 2, 2, 10 , 4, 3, 0, 6, 10, 7, 2, 7, 2, 9, 2, 8, 9, 7, 9 , 10, 2, 0, 5, 5, 1, 3, 7, 1, 6, 5, 4, 2, 8, 1 , 3, 6, 4, 3, 7, 10, 6, 7, 7, 6, 5, 9, 10, 8, 3 , 9, 9, 5, 2, 4, 2, 3, 3, 1, 2, 9, 2, 5, 6, 3 , 7, 5, 2, 6, 4, 8, 1, 0, 2, 4, 7, 9, 3, 3, 0 , 5, 3, 8, 7, 10, 6, 7, 7, 6, 10, 4, 4, 5, 8, 0 }; RadiotherapyData rd1(15,15,intensity1); /* * The following 25 clinical instances were provided by * - James F. Dempsey, ViewRay, Inc. * - H. Edwin Romeijn, Department of Industrial and Operations * Engineering, The University of Michigan * - J. Cole Smith, Department of Industrial and Systems * Engineering, University of Florida * - Z. Caner Taskin, Department of Industrial and Systems * Engineering, University of Florida * - Chunhua Men, Department of Industrial and Systems Engineering, * University of Florida * They are from the articles * - "Mixed-Integer Programming Techniques for Decomposing IMRT * Fluence Maps Using Rectangular Apertures", Z. Caner Taskin, * J. Cole Smith, H. Edwin Romeijn * - "Optimal Multileaf Collimator Leaf Sequencing in IMRT Treatment * Planning", Z. Caner Tasin, J. Cole Smith, H. Edwin Romeijn, James * F. Dempsey */ static const int case1_beam1_matrix[] = { 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 5, 0, 3, 0, 2, 3, 1, 0, 0, 0, 0, 0, 0, 18, 0, 0, 4, 6, 0, 2, 0, 0, 3, 11, 8, 15, 1, 11, 0, 0, 0, 10, 0, 0, 0, 0, 9, 11, 14, 6, 2, 7, 0, 0, 0, 7, 0, 0, 8, 2, 7, 10, 11, 7, 2, 0, 7, 0, 0, 0, 1, 0, 0, 4, 1, 6, 7, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 1, 0, 4, 6, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 5, 6, 8, 8, 5, 0, 2, 0, 0, 0, 7, 0, 0, 5, 2, 8, 10, 11, 5, 3, 7, 0, 2, 4, 11, 0, 0, 0, 0, 1, 12, 13, 9, 7, 11, 1, 2, 3, 6, 0, 0, 0, 0, 0, 0, 0, 0, 4, 20, 0, 0, 8, 5, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 1 }; RadiotherapyData case1_beam1(15, 14, case1_beam1_matrix); static const int case1_beam2_matrix[] = { 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 4, 0, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 3, 0, 0, 0, 5, 5, 3, 0, 0, 3, 2, 8, 6, 0, 0, 3, 0, 0, 7, 11, 10, 11, 5, 8, 4, 11, 13, 20, 0, 0, 3, 0, 10, 10, 9, 7, 7, 7, 2, 9, 0, 0, 0, 9, 0, 2, 0, 4, 7, 7, 5, 6, 2, 0, 4, 0, 0, 0, 3, 0, 2, 0, 10, 2, 7, 1, 2, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 5, 6, 3, 1, 0, 6, 8, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2 }; RadiotherapyData case1_beam2(11, 15, case1_beam2_matrix); static const int case1_beam3_matrix[] = { 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 1, 2, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 1, 2, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 6, 4, 1, 12, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 11, 6, 1, 9, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 11, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 1, 1, 0, 3, 0, 2, 6, 7, 6, 6, 4, 0, 0, 0, 0, 0, 2, 0, 0, 10, 12, 11, 10, 13, 13, 12, 5, 0, 0, 0, 0, 2, 0, 0, 11, 12, 10, 10, 14, 15, 15, 5, 2, 7, 12, 0, 2, 0, 9, 5, 9, 7, 6, 12, 16, 13, 8, 5, 7, 7, 0, 2, 2, 0, 0, 0, 0, 0, 4, 20, 12, 8, 1, 6, 8, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 7, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 1, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 1 }; RadiotherapyData case1_beam3(15, 15, case1_beam3_matrix); static const int case1_beam4_matrix[] = { 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 13, 0, 4, 0, 2, 0, 6, 5, 5, 8, 9, 11, 20, 8, 9, 18, 10, 7, 0, 2, 0, 3, 10, 9, 12, 11, 15, 15, 11, 11, 16, 15, 3, 0, 3, 0, 5, 7, 12, 14, 11, 15, 15, 13, 10, 15, 10, 5, 0, 3, 0, 5, 1, 9, 11, 9, 13, 9, 12, 6, 3, 0, 0, 0, 2, 0, 0, 0, 0, 4, 2, 4, 0, 7, 0, 0, 0, 0, 0, 2, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 1, 7, 4, 0, 0, 0, 10, 10, 4, 0, 1, 1, 2, 2, 0, 0, 0, 0, 0, 4, 0, 14, 14, 9, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 12, 16, 5, 1, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 1, 10, 12, 6, 3, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 2, 12, 15, 3, 0, 1, 2 }; RadiotherapyData case1_beam4(15, 15, case1_beam4_matrix); static const int case1_beam5_matrix[] = { 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 6, 4, 3, 1, 0, 0, 7, 0, 0, 0, 0, 3, 2, 0, 13, 6, 1, 1, 1, 5, 0, 2, 0, 0, 0, 0, 1, 2, 0, 2, 12, 5, 4, 2, 2, 0, 1, 20, 11, 11, 5, 0, 2, 0, 9, 12, 7, 3, 2, 7, 3, 5, 14, 12, 13, 11, 0, 2, 0, 5, 11, 13, 6, 6, 5, 5, 5, 15, 11, 13, 12, 0, 2, 0, 0, 0, 1, 4, 5, 0, 0, 0, 7, 9, 9, 8, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 4, 5, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 9, 0, 3 }; RadiotherapyData case1_beam5(11, 15, case1_beam5_matrix); static const int case2_beam1_matrix[] = { 1, 1, 1, 4, 1, 0, 1, 5, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 2, 7, 2, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 12, 12, 5, 8, 5, 3, 0, 2, 1, 3, 0, 0, 0, 0, 0, 4, 20, 10, 1, 0, 8, 7, 8, 6, 7, 2, 1, 1, 3, 1, 0, 3, 1, 13, 18, 14, 10, 5, 0, 3, 7, 7, 7, 6, 7, 2, 0, 2, 0, 0, 0, 3, 1, 9, 8, 8, 6, 2, 3, 4, 5, 11, 10, 9, 10, 3, 0, 2, 0, 0, 0, 1, 1, 7, 8, 5, 4, 1, 1, 0, 4, 3, 1, 0, 0, 0, 2, 2, 0, 0, 1, 0, 0, 4, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 4, 2, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 5, 6, 3, 1, 2, 5, 3, 1, 3, 0, 1, 0, 4, 5, 5, 9, 0, 1, 1, 0, 2, 8, 3, 2, 3, 6, 5, 3, 4, 6, 4, 5, 10, 11, 8, 10, 4, 0, 0, 0, 0, 8, 5, 4, 5, 8, 5, 7, 6, 5, 3, 5, 8, 7, 7, 10, 2, 0, 3, 0, 9, 11, 5, 5, 6, 11, 7, 6, 6, 6, 4, 6, 8, 7, 7, 9, 2, 0, 2, 0, 11, 11, 5, 6, 7, 9, 9, 6, 8, 5, 4, 6, 10, 6, 7, 7, 2, 0, 2, 0, 6, 11, 4, 3, 1, 0, 0, 0, 0, 4, 7, 6, 2, 0, 0, 3, 0, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 2 }; RadiotherapyData case2_beam1(18, 20, case2_beam1_matrix); static const int case2_beam2_matrix[] = { 2, 3, 2, 1, 5, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 3, 3, 3, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 2, 3, 3, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 8, 5, 1, 2, 3, 1, 0, 0, 0, 0, 1, 0, 0, 5, 6, 5, 5, 1, 2, 6, 2, 1, 2, 2, 2, 0, 0, 0, 0, 8, 0, 4, 2, 5, 2, 7, 5, 1, 4, 2, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 3, 4, 7, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 6, 7, 5, 7, 8, 7, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 7, 10, 7, 2, 3, 5, 12, 6, 0, 4, 0, 0, 0, 0, 6, 5, 6, 4, 8, 10, 12, 9, 7, 1, 6, 6, 6, 0, 0, 0, 0, 18, 18, 3, 3, 4, 6, 9, 12, 12, 7, 5, 0, 0, 0, 0, 2, 0, 0, 0, 20, 11, 0, 1, 4, 5, 10, 10, 8, 6, 1, 6, 3, 4, 1, 3, 0, 0, 0, 16, 11, 0, 3, 2, 7, 11, 10, 13, 7, 2, 2, 0, 0, 0, 2, 3, 0, 0, 14, 10, 1, 5, 2, 8, 15, 9, 9, 13, 5, 0, 0, 0, 0, 3, 2, 0, 0, 16, 9, 5, 5, 4, 7, 18, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 0, 15, 10, 7, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 18, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2 }; RadiotherapyData case2_beam2(17, 19, case2_beam2_matrix); static const int case2_beam3_matrix[] = { 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 4, 3, 2, 6, 2, 2, 1, 0, 0, 0, 0, 0, 0, 4, 2, 10, 11, 12, 7, 7, 4, 0, 4, 1, 2, 0, 0, 0, 0, 0, 0, 4, 6, 9, 10, 12, 6, 5, 4, 4, 3, 2, 2, 0, 0, 0, 0, 14, 0, 7, 2, 9, 8, 8, 3, 6, 4, 4, 2, 2, 3, 0, 0, 0, 10, 11, 0, 0, 1, 7, 4, 2, 2, 0, 0, 0, 2, 2, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 4, 1, 1, 0, 2, 2, 0, 0, 2, 0, 3, 0, 1, 2, 0, 0, 0, 0, 5, 5, 7, 7, 8, 9, 5, 8, 1, 1, 0, 0, 0, 3, 0, 0, 8, 0, 10, 10, 12, 15, 16, 10, 7, 6, 0, 3, 0, 0, 0, 3, 0, 0, 20, 4, 12, 12, 11, 19, 17, 17, 11, 9, 12, 12, 11, 13, 3, 1, 0, 0, 0, 11, 8, 10, 11, 15, 18, 12, 5, 3, 6, 8, 11, 12, 9, 0, 1, 0, 0, 6, 10, 1, 3, 17, 17, 13, 5, 1, 4, 16, 8, 15, 3, 1, 2, 0, 0, 8, 0, 0, 0, 0, 0, 11, 6, 0, 6, 0, 0, 0, 0, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2 }; RadiotherapyData case2_beam3(18, 18, case2_beam3_matrix); static const int case2_beam4_matrix[] = { 3, 0, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 2, 2, 0, 0, 5, 2, 2, 0, 7, 3, 3, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0, 0, 0, 4, 3, 0, 8, 11, 9, 4, 0, 2, 0, 0, 0, 0, 4, 1, 0, 0, 9, 5, 5, 2, 12, 13, 10, 7, 3, 1, 4, 0, 0, 0, 0, 3, 0, 16, 9, 4, 10, 7, 15, 16, 8, 5, 6, 4, 7, 10, 0, 11, 0, 2, 0, 0, 12, 6, 12, 12, 18, 18, 14, 9, 7, 7, 8, 12, 13, 12, 10, 0, 0, 0, 0, 8, 13, 15, 18, 20, 12, 13, 12, 12, 12, 13, 11, 10, 8, 0, 0, 0, 0, 3, 5, 14, 17, 16, 11, 8, 4, 10, 12, 11, 14, 9, 1, 3, 0, 0, 0, 0, 0, 3, 14, 8, 5, 4, 5, 9, 4, 0, 0, 0, 0, 3, 4, 3, 0, 0, 1, 0, 8, 3, 3, 0, 0, 0, 0, 0, 2, 0, 0, 3, 1, 7, 0, 0, 1, 2, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 5, 1, 4, 1, 4, 0, 0, 2, 2, 5, 4, 0, 0, 0, 0, 0, 0, 0, 8, 10, 7, 0, 6, 1, 4, 1, 2, 4, 4, 0, 0, 0, 0, 0, 0, 4, 5, 5, 6, 1, 6, 6, 2, 2, 2, 4, 3, 2, 0, 0, 0, 0, 4, 3, 12, 2, 1, 7, 3, 4, 2, 2, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 7, 3, 12, 5, 5, 1, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 3, 3, 5, 0, 3, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 3 }; RadiotherapyData case2_beam4(18, 18, case2_beam4_matrix); static const int case2_beam5_matrix[] = { 0, 0, 0, 15, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2, 10, 16, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 0, 6, 9, 15, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 3, 2, 4, 9, 12, 15, 3, 4, 0, 3, 0, 2, 17, 13, 0, 0, 0, 2, 3, 0, 5, 12, 14, 17, 5, 2, 0, 0, 8, 17, 16, 13, 4, 0, 0, 0, 3, 0, 6, 13, 16, 17, 5, 2, 2, 4, 5, 12, 10, 10, 13, 6, 0, 0, 3, 0, 0, 20, 17, 18, 8, 4, 5, 6, 10, 14, 13, 11, 2, 1, 4, 0, 3, 0, 0, 0, 14, 18, 11, 8, 9, 9, 10, 13, 12, 8, 8, 5, 6, 5, 0, 0, 0, 0, 2, 11, 10, 6, 3, 1, 6, 10, 11, 5, 8, 9, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 3, 10, 4, 5, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 6, 6, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 1, 0, 3, 3, 4, 3, 4, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 4, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 8, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 2, 1, 3, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2, 1, 4, 8, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 }; RadiotherapyData case2_beam5(17, 18, case2_beam5_matrix); static const int case3_beam1_matrix[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 13, 8, 8, 1, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 11, 9, 5, 5, 4, 5, 0, 2, 0, 1, 0, 0, 0, 0, 0, 8, 13, 9, 6, 4, 4, 4, 8, 0, 2, 0, 0, 2, 17, 10, 13, 14, 10, 8, 7, 6, 4, 4, 5, 8, 0, 2, 0, 0, 12, 20, 9, 14, 15, 7, 2, 5, 5, 5, 3, 4, 9, 0, 1, 1, 0, 17, 13, 10, 15, 16, 5, 1, 5, 7, 5, 6, 4, 8, 0, 2, 1, 1, 0, 15, 9, 15, 20, 6, 1, 4, 7, 7, 6, 5, 9, 7, 1, 1, 0, 0, 2, 7, 16, 9, 5, 0, 3, 7, 5, 5, 4, 7, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 4, 2, 6, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, 3, 3, 3, 6, 5, 4, 0, 0, 0, 0, 5, 7, 5, 8, 0, 2, 7, 5, 4, 5, 7, 4, 5, 0, 0, 4, 9, 8, 16, 19, 5, 1, 3, 7, 6, 5, 6, 9, 6, 1, 1, 0, 13, 12, 8, 14, 14, 4, 2, 0, 8, 4, 5, 5, 8, 2, 0, 2, 0, 20, 11, 7, 14, 15, 3, 0, 0, 6, 3, 3, 5, 9, 0, 1, 1, 0, 6, 17, 4, 14, 14, 6, 1, 1, 5, 2, 3, 5, 7, 0, 1, 0, 0, 0, 0, 11, 6, 13, 7, 2, 2, 5, 2, 4, 3, 6, 0, 2, 0, 1, 0, 0, 0, 6, 0, 8, 2, 3, 5, 3, 7, 4, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 7, 10, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 5, 0, 10, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }; RadiotherapyData case3_beam1(22, 17, case3_beam1_matrix); static const int case3_beam2_matrix[] = { 0, 0, 1, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 1, 4, 5, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 2, 2, 1, 1, 0, 0, 1, 4, 7, 11, 9, 0, 0, 0, 2, 0, 0, 0, 3, 2, 2, 0, 2, 4, 1, 4, 7, 11, 10, 20, 1, 0, 0, 3, 0, 2, 0, 2, 2, 2, 1, 7, 8, 5, 9, 13, 16, 13, 14, 12, 0, 0, 2, 0, 1, 0, 3, 2, 4, 5, 15, 16, 12, 11, 15, 17, 15, 14, 9, 0, 3, 2, 0, 11, 0, 6, 3, 0, 5, 17, 16, 10, 10, 13, 17, 13, 14, 7, 1, 3, 2, 0, 5, 0, 8, 1, 0, 2, 16, 16, 9, 8, 10, 14, 12, 13, 12, 0, 3, 0, 0, 0, 2, 8, 1, 0, 7, 15, 17, 7, 8, 10, 12, 9, 12, 5, 1, 0, 0, 0, 0, 0, 5, 0, 2, 7, 15, 13, 5, 4, 9, 7, 4, 0, 0, 2, 0, 0, 0, 0, 0, 4, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; RadiotherapyData case3_beam2(15, 19, case3_beam2_matrix); static const int case3_beam3_matrix[] = { 0, 0, 0, 0, 0, 0, 0, 0, 15, 8, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 10, 7, 10, 7, 18, 0, 0, 0, 0, 0, 3, 5, 5, 3, 0, 7, 8, 12, 9, 12, 11, 20, 0, 0, 0, 0, 0, 0, 0, 4, 5, 2, 6, 5, 12, 9, 12, 12, 14, 3, 0, 1, 0, 0, 0, 0, 7, 2, 4, 7, 9, 11, 9, 10, 10, 7, 5, 0, 0, 0, 0, 0, 1, 7, 1, 2, 7, 8, 10, 4, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 3, 2, 4, 0, 0, 0, 0, 0, 0, 0, 2, 4, 4, 7, 10, 8, 0, 0, 0, 4, 4, 0, 0, 0, 9, 6, 7, 7, 10, 6, 13, 8, 10, 0, 0, 6, 12, 12, 0, 0, 0, 15, 9, 11, 15, 16, 15, 17, 4, 17, 0, 0, 5, 14, 12, 5, 0, 9, 18, 15, 18, 19, 18, 16, 17, 6, 14, 0, 0, 14, 7, 13, 3, 2, 16, 17, 13, 17, 17, 16, 17, 12, 8, 12, 0, 0, 4, 14, 8, 5, 1, 10, 12, 7, 19, 17, 18, 15, 13, 0, 0, 3, 0, 0, 6, 10, 0, 0, 0, 4, 5, 16, 17, 16, 13, 15, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 5, 17, 15, 16, 12, 15, 2, 2, 0, 1, 0, 0, 0, 0, 0, 2, 2, 0, 7, 15, 9, 11, 13, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 15, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0 }; RadiotherapyData case3_beam3(20, 17, case3_beam3_matrix); static const int case3_beam4_matrix[] = { 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 12, 0, 3, 0, 2, 0, 0, 0, 0, 0, 2, 0, 10, 9, 20, 0, 0, 15, 0, 3, 0, 0, 0, 0, 14, 0, 0, 0, 3, 7, 11, 16, 16, 6, 16, 2, 2, 0, 0, 0, 10, 9, 5, 0, 0, 16, 7, 10, 17, 16, 13, 11, 12, 0, 0, 0, 9, 10, 10, 5, 2, 11, 9, 9, 12, 16, 18, 12, 13, 3, 0, 3, 0, 5, 11, 10, 6, 4, 10, 15, 10, 13, 17, 18, 16, 5, 11, 0, 2, 0, 1, 13, 11, 7, 2, 19, 12, 14, 12, 16, 18, 16, 12, 7, 11, 0, 0, 0, 14, 6, 7, 0, 0, 11, 13, 13, 17, 16, 16, 11, 7, 11, 0, 0, 0, 5, 0, 0, 0, 0, 7, 4, 8, 11, 12, 12, 10, 7, 9, 0, 2, 0, 0, 0, 0, 0, 0, 1, 2, 2, 5, 5, 7, 7, 8, 1, 1, 3, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 6, 5, 11, 0, 2, 0, 6, 3, 2, 2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 2, 9, 12, 6, 5, 5, 5, 0, 0, 0, 1, 0, 0, 0, 4, 2, 4, 0, 7, 10, 8, 10, 10, 5, 0, 0, 1, 0, 1, 0, 0, 3, 0, 0, 0, 0, 6, 5, 11, 9, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 13, 13, 0, 0, 0, 0 }; RadiotherapyData case3_beam4(19, 17, case3_beam4_matrix); static const int case3_beam5_matrix[] = { 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 15, 0, 0, 0, 0, 4, 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 13, 2, 0, 5, 9, 9, 9, 1, 7, 0, 3, 0, 1, 0, 1, 2, 5, 0, 0, 3, 5, 0, 8, 10, 9, 12, 10, 17, 4, 2, 0, 3, 0, 0, 0, 5, 1, 0, 8, 9, 2, 10, 13, 12, 14, 12, 14, 10, 1, 3, 3, 0, 0, 0, 3, 2, 2, 11, 11, 8, 14, 15, 16, 17, 15, 15, 5, 2, 3, 3, 0, 2, 2, 2, 1, 3, 9, 8, 7, 7, 15, 13, 19, 18, 13, 15, 1, 0, 3, 0, 0, 2, 0, 2, 2, 6, 1, 3, 1, 7, 9, 12, 11, 19, 0, 0, 0, 3, 0, 0, 4, 0, 2, 3, 2, 1, 1, 0, 3, 4, 7, 20, 0, 0, 0, 0, 3, 0, 16, 0, 3, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 16, 3, 4, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; RadiotherapyData case3_beam5(15, 19, case3_beam5_matrix); static const int case4_beam1_matrix[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 5, 8, 10, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 9, 2, 0, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 10, 17, 12, 0, 7, 5, 0, 0, 1, 6, 7, 4, 4, 3, 1, 2, 0, 0, 0, 20, 0, 0, 0, 0, 0, 2, 1, 3, 1, 1, 1, 6, 7, 6, 4, 0, 1, 2, 1, 0, 8, 6, 0, 0, 0, 0, 0, 0, 2, 3, 2, 2, 1, 6, 7, 7, 7, 0, 0, 2, 0, 11, 5, 2, 4, 6, 0, 0, 3, 4, 2, 6, 1, 2, 1, 8, 5, 8, 8, 2, 0, 1, 0, 1, 1, 0, 0, 2, 4, 7, 2, 0, 1, 3, 1, 5, 0, 11, 4, 7, 9, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 6, 1, 10, 3, 7, 8, 3, 0, 1, 0, 0, 0, 0, 0, 3, 5, 8, 0, 1, 1, 2, 1, 7, 1, 11, 3, 6, 8, 4, 0, 1, 0, 7, 4, 2, 6, 6, 0, 6, 3, 2, 4, 7, 6, 10, 2, 11, 3, 6, 7, 4, 0, 0, 8, 16, 13, 0, 0, 0, 0, 0, 0, 2, 3, 6, 6, 7, 3, 10, 3, 5, 7, 4, 0, 2, 0, 0, 0, 16, 0, 0, 0, 0, 0, 3, 2, 4, 7, 9, 4, 9, 3, 5, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 12, 6, 8, 5, 4, 5, 8, 6, 3, 8, 3, 5, 6, 3, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 10, 0, 3, 9, 8, 4, 2, 7, 3, 4, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 4, 2, 7, 2, 4, 5, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 4, 1, 8, 2, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 12, 5, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 0, 0, 0 }; RadiotherapyData case4_beam1(19, 22, case4_beam1_matrix); static const int case4_beam2_matrix[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 3, 2, 9, 17, 10, 11, 6, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 7, 6, 0, 0, 0, 0, 1, 2, 7, 14, 16, 14, 16, 7, 5, 5, 0, 4, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 5, 10, 16, 20, 12, 17, 8, 13, 13, 0, 4, 0, 3, 7, 2, 0, 5, 5, 0, 6, 2, 0, 0, 3, 12, 16, 17, 17, 10, 19, 9, 11, 13, 0, 4, 3, 0, 19, 9, 11, 10, 3, 2, 0, 7, 7, 13, 20, 14, 17, 15, 18, 7, 18, 11, 11, 15, 0, 4, 0, 3, 4, 9, 10, 9, 0, 2, 0, 2, 0, 13, 13, 13, 14, 14, 17, 4, 17, 11, 11, 16, 0, 4, 0, 1, 0, 0, 0, 6, 0, 0, 1, 1, 0, 5, 13, 9, 11, 9, 12, 5, 14, 11, 10, 18, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 10, 9, 8, 7, 12, 2, 13, 10, 11, 17, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 8, 2, 0, 4, 13, 8, 12, 19, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 3, 0, 0, 0, 0, 5, 8, 15, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 3, 0, 0 }; RadiotherapyData case4_beam2(13, 24, case4_beam2_matrix); static const int case4_beam3_matrix[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 5, 4, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 4, 4, 6, 3, 1, 0, 0, 5, 5, 0, 0, 1, 0, 1, 0, 0, 0, 11, 0, 9, 8, 5, 6, 3, 5, 6, 2, 0, 0, 1, 3, 4, 7, 0, 0, 0, 2, 2, 0, 0, 7, 11, 0, 6, 8, 5, 6, 2, 3, 0, 0, 0, 2, 1, 5, 3, 3, 0, 0, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 1, 3, 2, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 7, 2, 0, 3, 1, 2, 0, 0, 1, 0, 6, 2, 4, 7, 3, 0, 0, 0, 3, 4, 6, 8, 6, 6, 4, 0, 2, 1, 3, 0, 2, 0, 7, 6, 7, 7, 13, 14, 9, 10, 6, 6, 8, 8, 9, 8, 6, 5, 0, 2, 0, 2, 0, 2, 0, 7, 8, 8, 8, 12, 12, 14, 10, 8, 7, 8, 7, 7, 7, 5, 6, 0, 1, 0, 2, 0, 2, 0, 0, 0, 1, 7, 20, 13, 8, 17, 11, 6, 6, 5, 6, 9, 7, 7, 0, 1, 0, 3, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 6, 7, 8, 8, 0, 1, 1, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 8, 0, 3, 2, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 }; RadiotherapyData case4_beam3(18, 23, case4_beam3_matrix); static const int case4_beam4_matrix[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 7, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 6, 0, 5, 0, 3, 1, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 7, 8, 10, 0, 2, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 8, 9, 8, 1, 2, 1, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 7, 6, 4, 9, 9, 7, 0, 2, 2, 3, 0, 0, 0, 0, 0, 0, 3, 17, 8, 9, 15, 14, 6, 10, 5, 5, 7, 5, 5, 1, 2, 3, 3, 0, 2, 0, 0, 2, 7, 12, 20, 19, 16, 12, 12, 12, 9, 8, 8, 5, 2, 5, 0, 2, 3, 4, 0, 3, 0, 12, 10, 13, 9, 15, 15, 11, 11, 14, 8, 10, 10, 10, 5, 4, 3, 0, 2, 4, 4, 0, 0, 0, 2, 13, 4, 6, 12, 10, 6, 4, 7, 5, 6, 8, 8, 5, 4, 2, 0, 3, 3, 4, 0, 0, 1, 0, 4, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 3, 1, 0, 3, 3, 2, 0, 0, 2, 1, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 4, 4, 0, 0, 0, 2, 3, 0, 0, 13, 0, 2, 9, 0, 8, 7, 8, 2, 0, 0, 0, 4, 2, 6, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 1, 3, 7, 9, 7, 4, 0, 0, 1, 7, 5, 5, 0, 1, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 9, 7, 8, 7, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 11, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 7, 0, 0, 0, 0, 0, 0, 0 }; RadiotherapyData case4_beam4(17, 23, case4_beam4_matrix); static const int case4_beam5_matrix[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 6, 0, 0, 0, 6, 2, 10, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 7, 9, 5, 6, 0, 12, 10, 7, 15, 0, 3, 0, 4, 0, 0, 0, 12, 0, 0, 0, 0, 9, 7, 10, 4, 4, 0, 8, 0, 15, 12, 10, 11, 0, 3, 0, 2, 0, 5, 12, 8, 0, 0, 9, 6, 14, 14, 8, 10, 8, 5, 5, 3, 18, 13, 12, 15, 0, 4, 0, 0, 19, 19, 15, 19, 1, 0, 17, 10, 14, 15, 13, 12, 9, 5, 8, 5, 20, 13, 13, 13, 0, 4, 1, 3, 3, 14, 0, 10, 0, 15, 8, 5, 9, 2, 5, 10, 11, 5, 9, 7, 20, 15, 11, 11, 0, 4, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 8, 14, 9, 18, 11, 10, 11, 0, 4, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 0, 3, 4, 11, 12, 12, 13, 8, 11, 0, 4, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 4, 0, 2, 0, 2, 10, 9, 13, 6, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 6, 4, 0, 0, 0, 0, 4, 0, 0 }; RadiotherapyData case4_beam5(12, 24, case4_beam5_matrix); static const int case5_beam1_matrix[] = { 1, 2, 1, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 4, 0, 11, 0, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 0, 1, 9, 8, 1, 8, 4, 5, 0, 1, 2, 0, 0, 5, 0, 4, 4, 1, 7, 4, 5, 5, 5, 4, 0, 0, 1, 0, 8, 2, 2, 1, 1, 0, 0, 0, 0, 2, 5, 1, 1, 0, 0, 2, 2, 4, 4, 4, 2, 0, 0, 0, 0, 0, 6, 3, 1, 0, 1, 3, 2, 3, 5, 4, 1, 2, 2, 4, 2, 2, 6, 4, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 2, 4, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 1, 0, 0, 1, 3, 3, 0, 2, 2, 1, 3, 6, 0, 0, 0, 0, 1, 0, 3, 2, 4, 7, 5, 2, 4, 4, 8, 0, 0, 2, 10, 3, 1, 0, 3, 3, 7, 9, 7, 4, 3, 0, 0, 0, 0, 0, 6, 4, 0, 2, 0, 1, 7, 0, 0, 0, 4, 0, 0, 0, 5, 0, 8, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 6, 0, 2, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 }; RadiotherapyData case5_beam1(15, 16, case5_beam1_matrix); static const int case5_beam2_matrix[] = { 2, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 1, 2, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 3, 4, 0, 0, 0, 0, 5, 5, 5, 0, 0, 5, 0, 1, 0, 1, 2, 2, 4, 0, 0, 0, 0, 0, 2, 2, 3, 0, 3, 0, 1, 5, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 8, 4, 0, 2, 2, 3, 8, 0, 3, 1, 1, 0, 0, 0, 3, 1, 2, 13, 14, 13, 4, 10, 2, 16, 0, 3, 2, 0, 0, 0, 0, 0, 0, 9, 19, 16, 6, 8, 18, 2, 9, 0, 3, 0, 0, 8, 8, 1, 6, 7, 6, 20, 8, 0, 0, 0, 0, 1, 2, 4, 2, 2, 17, 2, 0, 0, 0, 3, 13, 0, 1, 0, 1, 4, 0, 2, 2, 6, 0, 8, 0, 0, 3, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 5, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2 }; RadiotherapyData case5_beam2(13, 17, case5_beam2_matrix); static const int case5_beam3_matrix[] = { 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 4, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 10, 11, 5, 10, 3, 4, 1, 1, 2, 1, 2, 0, 0, 0, 3, 0, 0, 11, 5, 4, 0, 2, 0, 2, 1, 0, 9, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 3, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 4, 8, 6, 2, 7, 6, 9, 0, 0, 0, 0, 0, 2, 0, 0, 0, 12, 13, 11, 9, 12, 10, 7, 9, 5, 3, 10, 4, 0, 0, 0, 10, 14, 13, 10, 12, 15, 9, 11, 12, 8, 7, 8, 9, 0, 2, 0, 7, 13, 12, 12, 11, 14, 10, 10, 10, 1, 6, 7, 8, 0, 0, 1, 0, 9, 19, 11, 18, 14, 8, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 8, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 1, 2 }; RadiotherapyData case5_beam3(14, 16, case5_beam3_matrix); static const int case5_beam4_matrix[] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 11, 5, 3, 3, 12, 10, 20, 1, 0, 4, 6, 2, 6, 0, 1, 0, 9, 7, 7, 10, 11, 8, 8, 18, 12, 8, 6, 4, 8, 0, 0, 0, 9, 10, 9, 10, 12, 7, 9, 7, 6, 9, 5, 5, 6, 0, 0, 0, 0, 6, 11, 7, 8, 7, 4, 10, 6, 9, 1, 0, 5, 1, 3, 1, 0, 0, 5, 1, 3, 2, 0, 0, 0, 0, 0, 0, 0, 2, 1, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 2, 0, 0, 2, 0, 2, 0, 0, 3, 0, 1, 3, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 0, 11, 1, 6, 6, 4, 0, 3, 0, 1, 2, 0, 0, 0, 0, 0, 2, 9, 6, 3, 8, 6, 0, 6, 1, 1, 1, 1, 0, 0, 0, 0, 0, 6, 2, 0, 4, 1, 1, 3, 1, 1, 1, 1, 0, 0, 0, 0, 0, 3, 0, 0, 6, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 10, 1, 1, 0, 1 }; RadiotherapyData case5_beam4(14, 16, case5_beam4_matrix); static const int case5_beam5_matrix[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 7, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 9, 12, 3, 0, 1, 0, 0, 10, 0, 0, 0, 0, 0, 0, 1, 3, 0, 10, 11, 11, 1, 9, 3, 5, 0, 6, 3, 14, 12, 0, 0, 3, 2, 0, 5, 7, 12, 5, 9, 10, 4, 0, 0, 5, 20, 2, 5, 0, 0, 1, 4, 0, 2, 4, 7, 3, 5, 9, 0, 0, 15, 15, 17, 4, 1, 0, 2, 4, 0, 0, 0, 0, 0, 0, 6, 0, 5, 12, 9, 14, 6, 8, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 6, 3, 0, 2, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; RadiotherapyData case5_beam5(12, 17, case5_beam5_matrix); //@} /// Radiotherapy instances RadiotherapyData rds[] = {rd0, rd1, case1_beam1, case1_beam2, case1_beam3, case1_beam4, case1_beam5, case2_beam1, case2_beam2, case2_beam3, case2_beam4, case2_beam5, case3_beam1, case3_beam2, case3_beam3, case3_beam4, case3_beam5, case4_beam1, case4_beam2, case4_beam3, case4_beam4, case4_beam5, case5_beam1, case5_beam2, case5_beam3, case5_beam4, case5_beam5 }; /// Number of Radiotherapy instances const unsigned int rds_n = sizeof(rds) / sizeof(RadiotherapyData); } // STATISTICS: example-any gecode-4.2.1/examples/sat.cpp0000644000175000010010000001617112166527420015205 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Raphael Reischuk * Guido Tack * * Copyright: * Raphael Reischuk, 2008 * Guido Tack, 2008 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include #include using namespace Gecode; /** \brief Options for %SAT problems * * \relates SAT */ class SatOptions : public Options { public: /// Name of the DIMACS file to parse std::string filename; /// Initialize options with file name \a s SatOptions(const char* s) : Options(s) {} /// Parse options from arguments \a argv (number is \a argc) void parse(int& argc, char* argv[]) { // Parse regular options Options::parse(argc,argv); // Filename, should be at position 1 if (argc == 1) { help(); exit(1); } filename = argv[1]; argc--; } /// Print help message virtual void help(void) { Options::help(); std::cerr << "\t(string) " << std::endl << "\t\tdimacs file to parse (.cnf)" << std::endl; } }; /** * \brief %Example: CNF SAT solver * * SAT finds assignments of Boolean variables such * that a set of clauses is satisfied or shows that * no such assignment exists. * * This example parses a dimacs CNF file in which * the constraints are specified. For each line of * the file a clause propagator is posted. * * Format of dimacs CNF files: * * A dimacs file starts with comments (each line * starts with c). The number of variables and the * number of clauses is defined by the line * * p cnf \ \ * * Each of the subsequent lines specifies a clause. * A positive literal is denoted by a positive * integer, a negative literal is denoted by the * corresponding negative integer. Each line is * terminated by 0. * * c sample CNF file * p cnf 3 2 * 3 -1 0 * 1 2 -1 0 * * Benchmarks on satlib.org, for instance, * are in the dimacs CNF format. * * \ingroup Example */ class Sat : public Script { private: /// The Boolean variables BoolVarArray x; public: /// The actual problem Sat(const SatOptions& opt) { parseDIMACS(opt.filename.c_str()); branch(*this, x, INT_VAR_NONE(), INT_VAL_MIN()); } /// Constructor for cloning Sat(bool share, Sat& s) : Script(share,s) { x.update(*this, share, s.x); } /// Perform copying during cloning virtual Space* copy(bool share) { return new Sat(share,*this); } /// Print solution virtual void print(std::ostream& os) const { os << "solution:\n" << x << std::endl; } /// Post constraints according to DIMACS file \a f void parseDIMACS(const char* f) { int variables = 0; int clauses = 0; std::ifstream dimacs(f); if (!dimacs) { std::cerr << "error: file '" << f << "' not found" << std::endl; exit(1); } std::cout << "Solving problem from DIMACS file '" << f << "'" << std::endl; std::string line; int c = 0; while (dimacs.good()) { std::getline(dimacs,line); // Comments (ignore them) if (line[0] == 'c' || line == "") { } // Line has format "p cnf " else if (variables == 0 && clauses == 0 && line[0] == 'p' && line[1] == ' ' && line[2] == 'c' && line[3] == 'n' && line[4] == 'f' && line[5] == ' ') { int i = 6; while (line[i] >= '0' && line[i] <= '9') { variables = 10*variables + line[i] - '0'; i++; } i++; while (line[i] >= '0' && line[i] <= '9') { clauses = 10*clauses + line[i] - '0'; i++; } std::cout << "(" << variables << " variables, " << clauses << " clauses)" << std::endl << std::endl; // Add variables to array x = BoolVarArray(*this, variables, 0, 1); } // Parse regular clause else if (variables > 0 && ((line[0] >= '0' && line[0] <= '9') || line[0] == '-' || line[0] == ' ')) { c++; std::vector pos; std::vector neg; int i = 0; while (line[i] != 0) { if (line[i] == ' ') { i++; continue; } bool positive = true; if (line[i] == '-') { positive = false; i++; } int value = 0; while (line[i] >= '0' && line[i] <= '9') { value = 10 * value + line[i] - '0'; i++; } if (value != 0) { if (positive) pos.push_back(value-1); else neg.push_back(value-1); i++; } } // Create positive BoolVarArgs BoolVarArgs positives(pos.size()); for (int i=pos.size(); i--;) positives[i] = x[pos[i]]; BoolVarArgs negatives(neg.size()); for (int i=neg.size(); i--;) negatives[i] = x[neg[i]]; // Post propagators clause(*this, BOT_OR, positives, negatives, 1); } else { std::cerr << "format error in dimacs file" << std::endl; std::cerr << "context: '" << line << "'" << std::endl; std::exit(EXIT_FAILURE); } } dimacs.close(); if (clauses != c) { std::cerr << "error: number of specified clauses seems to be wrong." << std::endl; std::exit(EXIT_FAILURE); } } }; /** \brief Main-function * \relates SAT */ int main(int argc, char* argv[]) { SatOptions opt("SAT"); opt.parse(argc,argv); // Check whether all arguments are successfully parsed if (argc > 1) { std::cerr << "Could not parse all arguments." << std::endl; opt.help(); std::exit(EXIT_FAILURE); } // Run SAT solver Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/schurs-lemma.cpp0000644000175000010010000000775312166527420017024 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2011 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** * \brief %Options for Schur's Lemma * */ class SchurOptions : public Options { public: int c, n; ///< Parameters to be given on command line /// Initialize options for example with name \a s SchurOptions(const char* s, int c0, int n0) : Options(s), c(c0), n(n0) {} /// Parse options from arguments \a argv (number is \a argc) void parse(int& argc, char* argv[]) { Options::parse(argc,argv); if (argc < 3) return; c = atoi(argv[1]); n = atoi(argv[2]); } /// Print help message virtual void help(void) { Options::help(); std::cerr << "\t(unsigned int) default: " << c << std::endl << "\t\tparameter c (number of boxes)" << std::endl << "\t(unsigned int) default: " << n << std::endl << "\t\tparameter n (number of balls)" << std::endl; } }; /** * \brief %Example: Schur's lemma * * Put \f$n\f$ balls labeled \f${1,\ldots,n}\f$ into \f$c\f$ boxes such * that for any triple of balls \f$\langle x, y, z\rangle\f$ with * \f$x+y = z\f$, not all are in the same box. * * This problem has a solution for \f$c=3\f$ if \f$n < 14\f$. * * See also problem 15 at http://www.csplib.org/. * * \ingroup Example * */ class Schur : public Script { protected: /// Array of box per ball IntVarArray box; public: /// Actual model Schur(const SchurOptions& opt) : box(*this,opt.n,1,opt.c) { int n = opt.n; IntVarArgs triple(3); // Iterate over balls and find triples for (int i=1; i<=n; i++) { triple[0] = box[i-1]; for (int j=1; i+j<=n; j++) { triple[1] = box[j-1]; triple[2] = box[i+j-1]; rel(*this, triple, IRT_NQ); } } // Break value symmetries precede(*this, box, IntArgs::create(opt.c, 1)); branch(*this, box, INT_VAR_AFC_SIZE_MAX(opt.decay()), INT_VAL_MIN()); } /// Print solution virtual void print(std::ostream& os) const { os << "\t" << box << std::endl; } /// Constructor for cloning \a s Schur(bool share, Schur& s) : Script(share,s) { box.update(*this, share, s.box); } /// Copy during cloning virtual Space* copy(bool share) { return new Schur(share,*this); } }; /** \brief Main-function * \relates Schur */ int main(int argc, char* argv[]) { SchurOptions opt("Schur's Lemma",3,13); opt.parse(argc,argv); Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/scowl.hpp0000644000175000010010000334501411370747627015567 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Last modified: * $Date: 2010-05-07 10:30:15 +0200 (Fri, 07 May 2010) $ by $Author: zayenz $ * $Revision: 10883 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include /// Parse an additional file option class FileSizeOptions : public Gecode::SizeOptions { protected: /// The file name Gecode::Driver::StringValueOption _file; public: /// Initialize with name \a s FileSizeOptions(const char* s); /// Return file name (NULL if none given) const char* file(void) const; }; /// A simple dictionary class class Dictionary { protected: /// Maximal word length support static const unsigned int limit_len = 64; /// Actual maximal length in dictionary unsigned int max_len; /// Total number of words int n_all_words; /// Number of words of some length int n_words[limit_len]; /// Beginning of words of some length char* s_words[limit_len]; /// One big memory chunk for storing words char* chunk; public: /// Initialize as empty dictionary Dictionary(void); /** * \brief Perform actual initialization * * Reads words from file with name \a fn. If \a fn is NULL, the * predefined dictionary is used. */ void init(const char* fn); /// Return maximal length of a word int len(void) const; /// Return total number of words int words(void) const; /// Return number of words with length \a l int words(int l) const; /// Return word number \a i with length \a l const char* word(int l, int i) const; /// Print statistics summary template std::basic_ostream& print(std::basic_ostream& os) const; /// Destructor ~Dictionary(void); }; /// Print statistics summary template std::basic_ostream& operator <<(std::basic_ostream& os, const Dictionary& d); /// The dictionary to be used Dictionary dict; namespace { /* * The following wordlists are taken from SCOWL, english-55. Please * see below for details and copyright information. * */ const char* w_0[] = { "" }; const char* w_1[] = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" }; const char* w_2[] = { "ad", "ah", "am", "an", "as", "at", "be", "by", "cs", "do", "eh", "em", "es", "ex", "fa", "go", "gs", "ha", "he", "hi", "hm", "ho", "id", "if", "in", "is", "it", "kc", "ks", "la", "lo", "ls", "ma", "me", "mi", "ms", "mu", "my", "no", "nu", "of", "oh", "oi", "on", "or", "ow", "ox", "pa", "pi", "re", "rs", "sh", "so", "ta", "ti", "to", "ts", "uh", "um", "up", "us", "vs", "we", "ya", "ye", "yo" }; const char* w_3[] = { "aah", "ace", "act", "add", "ado", "ads", "adz", "aft", "age", "ago", "aha", "aid", "ail", "aim", "air", "alb", "ale", "all", "amp", "and", "ant", "any", "ape", "apt", "arc", "are", "ark", "arm", "art", "ash", "ask", "asp", "ate", "auk", "awe", "awl", "aye", "baa", "bad", "bag", "bah", "ban", "bap", "bar", "bat", "bay", "bed", "bee", "beg", "bet", "bib", "bid", "big", "bin", "bit", "biz", "boa", "bob", "bod", "bog", "boo", "bop", "bow", "box", "boy", "bra", "brr", "bub", "bud", "bug", "bum", "bun", "bur", "bus", "but", "buy", "bye", "cab", "cad", "cam", "can", "cap", "car", "cat", "caw", "chi", "cob", "cod", "cog", "con", "coo", "cop", "cot", "cow", "cox", "coy", "cry", "cub", "cud", "cue", "cup", "cur", "cut", "dab", "dad", "dag", "dam", "day", "deb", "den", "dew", "did", "die", "dig", "dim", "din", "dip", "dis", "dob", "doc", "doe", "dog", "don", "dos", "dot", "dry", "dub", "dud", "due", "dug", "duh", "dun", "duo", "dye", "ear", "eat", "ebb", "ecu", "eek", "eel", "eff", "egg", "ego", "eke", "elf", "elk", "ell", "elm", "ems", "emu", "end", "eon", "era", "ere", "erg", "err", "eta", "eve", "ewe", "eye", "fab", "fad", "fag", "fan", "far", "fat", "fax", "fed", "fee", "fen", "fer", "few", "fey", "fez", "fib", "fie", "fig", "fin", "fir", "fit", "fix", "flu", "fly", "fob", "foe", "fog", "fop", "for", "fox", "fro", "fry", "fug", "fun", "fur", "gab", "gad", "gag", "gal", "gap", "gas", "gay", "gee", "gel", "gem", "get", "gig", "gin", "git", "gnu", "gob", "god", "goo", "gos", "got", "gum", "gun", "gut", "guv", "guy", "gym", "gyp", "had", "hag", "haj", "ham", "has", "hat", "haw", "hay", "hem", "hen", "hep", "her", "hes", "hew", "hex", "hey", "hid", "hie", "him", "hip", "his", "hit", "hob", "hod", "hoe", "hog", "hop", "hos", "hot", "how", "hub", "hue", "hug", "huh", "hum", "hut", "ice", "icy", "ids", "ifs", "ilk", "ill", "imp", "ink", "inn", "ins", "ion", "ire", "irk", "ism", "its", "ivy", "jab", "jag", "jam", "jar", "jaw", "jay", "jet", "jib", "jig", "job", "jog", "jot", "joy", "jug", "jut", "keg", "ken", "key", "kid", "kin", "kip", "kit", "lab", "lad", "lag", "lam", "lap", "lav", "law", "lax", "lay", "lea", "led", "lee", "leg", "lei", "let", "lib", "lid", "lie", "lip", "lit", "lob", "log", "loo", "lop", "lot", "low", "lox", "lug", "luv", "lye", "mac", "mad", "mam", "man", "map", "mar", "mas", "mat", "maw", "may", "meg", "men", "mes", "met", "mew", "mic", "mid", "mil", "mix", "mob", "mod", "moi", "mom", "moo", "mop", "mow", "mud", "mug", "mum", "mys", "nab", "nae", "nag", "nah", "nan", "nap", "nay", "net", "new", "nib", "nil", "nip", "nit", "nix", "nob", "nod", "non", "nor", "not", "now", "nth", "nub", "nun", "nut", "oaf", "oak", "oar", "oat", "och", "odd", "ode", "off", "oft", "ohm", "oho", "ohs", "oik", "oil", "old", "one", "ooh", "ops", "opt", "orb", "ore", "our", "out", "ova", "owe", "owl", "own", "pad", "pah", "pal", "pan", "pap", "par", "pas", "pat", "paw", "pay", "pea", "pee", "peg", "pen", "pep", "per", "pet", "pew", "pic", "pie", "pig", "pin", "pip", "pis", "pit", "pix", "ply", "pod", "poi", "pol", "pom", "poo", "pop", "pot", "pow", "pox", "pro", "pry", "pub", "pud", "pug", "pun", "pup", "pus", "put", "pyx", "qua", "rag", "ram", "ran", "rap", "rat", "raw", "ray", "red", "ref", "rep", "rev", "rho", "rib", "rid", "rig", "rim", "rip", "rob", "rod", "roe", "rot", "row", "rub", "rue", "rug", "rum", "run", "rut", "rye", "sac", "sad", "sag", "sap", "sat", "saw", "sax", "say", "sea", "see", "set", "sew", "sex", "she", "shh", "shy", "sic", "sin", "sip", "sir", "sis", "sit", "six", "ska", "ski", "sky", "sly", "sob", "sod", "sol", "son", "sop", "sot", "sou", "sow", "soy", "spa", "spy", "ssh", "sty", "sub", "sue", "sum", "sun", "sup", "tab", "tad", "tag", "tam", "tan", "tap", "tar", "tat", "tax", "tea", "tee", "ten", "the", "tho", "thy", "tic", "tie", "til", "tin", "tip", "tit", "toe", "tog", "tom", "ton", "too", "top", "tor", "tot", "tow", "toy", "try", "tub", "tug", "tum", "tun", "tut", "tux", "two", "ugh", "ump", "uni", "ups", "urn", "use", "vac", "van", "vat", "veg", "vet", "vex", "via", "vie", "vim", "vow", "wad", "wag", "wan", "war", "was", "wax", "way", "web", "wed", "wee", "wen", "wet", "who", "why", "wig", "win", "wit", "woe", "wog", "wok", "won", "woo", "wop", "wot", "wow", "wry", "yak", "yam", "yap", "yaw", "yea", "yen", "yep", "yer", "yes", "yet", "yew", "yid", "yin", "yip", "yob", "yon", "you", "yuk", "yum", "yup", "zap", "zed", "zip", "zit", "zoo" }; const char* w_4[] = { "abed", "abet", "able", "ably", "abut", "aced", "aces", "ache", "achy", "acid", "acme", "acne", "acre", "acts", "adds", "afar", "agar", "aged", "ages", "agog", "ague", "ahas", "ahem", "ahoy", "aide", "aids", "ails", "aims", "airs", "airy", "ajar", "akin", "alas", "albs", "ales", "alga", "ally", "alms", "aloe", "also", "alto", "alum", "amen", "amid", "ammo", "amok", "amps", "anal", "ands", "anew", "ankh", "anon", "ante", "anti", "ants", "anus", "aped", "apes", "apex", "apse", "aqua", "arch", "arcs", "area", "ares", "aria", "arid", "arks", "arms", "army", "arts", "arty", "ashy", "asks", "asps", "ates", "atom", "atop", "auks", "aunt", "aura", "auto", "aver", "avid", "avow", "away", "awed", "awes", "awls", "awry", "axed", "axes", "axis", "axle", "axon", "ayes", "baas", "babe", "baby", "back", "bade", "bags", "bahs", "bail", "bait", "bake", "bald", "bale", "balk", "ball", "balm", "band", "bane", "bang", "bani", "bank", "bans", "baps", "barb", "bard", "bare", "barf", "bark", "barn", "bars", "base", "bash", "bask", "bass", "bast", "bate", "bath", "bats", "baud", "bawl", "bays", "bead", "beak", "beam", "bean", "bear", "beat", "beau", "beck", "beds", "beef", "been", "beep", "beer", "bees", "beet", "begs", "bell", "belt", "bend", "bent", "berg", "berk", "berm", "best", "beta", "bets", "bevy", "bias", "bibs", "bide", "bids", "bier", "biff", "bike", "bile", "bilk", "bill", "bind", "bins", "bird", "bite", "bits", "blab", "blag", "blah", "bled", "blew", "blip", "blob", "bloc", "blot", "blow", "blue", "blur", "boar", "boas", "boat", "bobs", "bode", "bods", "body", "bogs", "boil", "bola", "bold", "bole", "boll", "bolt", "bomb", "bond", "bone", "bong", "bonk", "bony", "boob", "book", "boom", "boon", "boor", "boos", "boot", "bops", "bore", "born", "bosh", "boss", "both", "bout", "bowl", "bows", "boxy", "boys", "bozo", "brad", "brae", "brag", "bran", "bras", "brat", "bray", "bred", "brew", "brie", "brig", "brim", "brow", "bubs", "buck", "buds", "buff", "bugs", "bulb", "bulk", "bull", "bumf", "bump", "bums", "bung", "bunk", "buns", "bunt", "buoy", "burg", "burk", "burn", "burp", "burr", "burs", "bury", "bush", "busk", "buss", "bust", "busy", "buts", "butt", "buys", "buzz", "byes", "byre", "byte", "cabs", "cads", "caff", "cage", "cake", "calf", "call", "calm", "came", "camp", "cams", "cane", "cans", "cant", "cape", "caps", "card", "care", "carp", "cars", "cart", "case", "cash", "cask", "cast", "cats", "cave", "caws", "cede", "cell", "cent", "chap", "char", "chat", "chef", "chew", "chic", "chin", "chip", "chit", "choc", "chop", "chow", "chug", "chum", "ciao", "cine", "cite", "city", "clad", "clam", "clan", "clap", "claw", "clay", "clef", "clew", "clip", "clod", "clog", "clop", "clot", "cloy", "club", "clue", "coal", "coat", "coax", "cobs", "cock", "coda", "code", "cods", "coed", "cogs", "coif", "coil", "coin", "coir", "coke", "cola", "cold", "cols", "colt", "coma", "comb", "come", "cone", "conk", "cons", "cony", "cook", "cool", "coon", "coop", "coos", "coot", "cope", "cops", "copy", "cord", "core", "cork", "corm", "corn", "cosh", "cost", "cote", "cots", "coup", "cove", "cowl", "cows", "crab", "crag", "cram", "crap", "craw", "cred", "crew", "crib", "crop", "crow", "crud", "crux", "cube", "cubs", "cuds", "cued", "cues", "cuff", "cull", "cult", "cums", "cunt", "cups", "curd", "cure", "curl", "curs", "curt", "cusp", "cuss", "cute", "cuts", "cyan", "cyst", "dabs", "dado", "dads", "daft", "dago", "dags", "dais", "dale", "dame", "damn", "damp", "dams", "dang", "dank", "dare", "dark", "darn", "dart", "dash", "data", "date", "daub", "dawn", "days", "daze", "dead", "deaf", "deal", "dean", "dear", "debs", "debt", "deck", "deed", "deem", "deep", "deer", "deft", "defy", "deli", "dell", "demo", "dens", "dent", "deny", "derv", "desk", "dewy", "dhow", "dial", "dice", "dick", "died", "dies", "diet", "digs", "dike", "dill", "dime", "dims", "dine", "ding", "dins", "dint", "dips", "dire", "dirk", "dirt", "disc", "dish", "disk", "diva", "dive", "dobs", "dock", "docs", "dodo", "doer", "does", "doff", "dogs", "dole", "doll", "dolt", "dome", "done", "dons", "doom", "door", "dope", "dork", "dorm", "dory", "dose", "dosh", "doss", "dost", "dote", "doth", "dots", "dour", "dove", "down", "doze", "dozy", "drab", "drag", "dram", "drat", "draw", "dray", "drew", "drip", "drop", "drub", "drug", "drum", "drys", "dual", "dubs", "duck", "duct", "dude", "duds", "duel", "dues", "duet", "duff", "duke", "dull", "duly", "dumb", "dump", "dune", "dung", "dunk", "duns", "duos", "dupe", "dusk", "dust", "duty", "dyed", "dyer", "dyes", "each", "earl", "earn", "ears", "ease", "east", "easy", "eats", "eave", "ebbs", "echo", "ecru", "eddy", "edge", "edgy", "edit", "eels", "effs", "eggs", "egos", "eked", "ekes", "elks", "ells", "elms", "else", "emir", "emit", "emus", "ends", "envy", "eons", "epic", "eras", "ergo", "ergs", "errs", "espy", "etch", "euro", "even", "ever", "eves", "evil", "ewer", "ewes", "exam", "exec", "exes", "exit", "expo", "eyed", "eyes", "face", "fact", "fade", "fads", "faff", "fags", "fail", "fain", "fair", "fake", "fall", "fame", "fang", "fans", "fare", "farm", "fart", "fast", "fate", "fats", "faun", "fave", "fawn", "faze", "fear", "feat", "feds", "feed", "feel", "fees", "feet", "fell", "felt", "fems", "fend", "fens", "fern", "fess", "fest", "feta", "feud", "fiat", "fibs", "fief", "fies", "fife", "figs", "file", "fill", "film", "filo", "find", "fine", "fink", "fins", "fire", "firm", "firs", "fish", "fist", "fits", "five", "fizz", "flab", "flag", "flak", "flan", "flap", "flat", "flaw", "flax", "flay", "flea", "fled", "flee", "flew", "flex", "flip", "flit", "floe", "flog", "flop", "flow", "flub", "flue", "flux", "foal", "foam", "fobs", "foes", "fogs", "foil", "fold", "folk", "fond", "font", "food", "fool", "foot", "fops", "ford", "fore", "fork", "form", "fort", "foul", "four", "fowl", "foxy", "frat", "fray", "free", "fret", "frig", "frog", "from", "fuck", "fuel", "full", "fume", "fund", "funk", "furl", "furs", "fury", "fuse", "fuss", "futz", "fuzz", "gabs", "gads", "gaff", "gaga", "gags", "gain", "gait", "gala", "gale", "gall", "gals", "game", "gamy", "gang", "gaol", "gape", "gaps", "garb", "gash", "gasp", "gate", "gave", "gawd", "gawk", "gawp", "gays", "gaze", "gear", "geed", "geek", "gees", "geld", "gels", "gems", "gene", "gens", "gent", "germ", "gets", "ghee", "gibe", "gift", "gigs", "gild", "gill", "gilt", "gins", "gird", "girl", "giro", "girt", "gist", "gite", "gits", "give", "glad", "glam", "glee", "glen", "glib", "glob", "glop", "glow", "glue", "glum", "glut", "gnat", "gnaw", "gnus", "goad", "goal", "goat", "gobs", "gods", "goer", "goes", "gold", "golf", "gone", "gong", "good", "goof", "gook", "goon", "goop", "gore", "gory", "gosh", "goth", "gout", "govs", "gown", "grab", "grad", "gram", "gran", "grew", "grid", "grim", "grin", "grip", "grit", "grog", "grow", "grub", "guff", "gulf", "gull", "gulp", "gums", "gunk", "guns", "guru", "gush", "gust", "guts", "guvs", "guys", "gyms", "gyps", "gyro", "hack", "haft", "hags", "hail", "hair", "hajj", "hake", "hale", "half", "hall", "halo", "halt", "hams", "hand", "hang", "hank", "hard", "hare", "hark", "harm", "harp", "hart", "hash", "hasp", "hast", "hate", "hath", "hats", "haul", "have", "hawk", "haws", "hays", "haze", "hazy", "head", "heal", "heap", "hear", "heat", "heck", "heed", "heel", "heft", "heir", "held", "hell", "helm", "help", "hemp", "hems", "hens", "heps", "herb", "herd", "here", "hero", "hers", "hews", "hick", "hide", "hied", "hies", "high", "hike", "hill", "hilt", "hims", "hind", "hint", "hips", "hire", "hiss", "hits", "hive", "hiya", "hoax", "hobo", "hobs", "hock", "hods", "hoed", "hoes", "hogs", "hold", "hole", "hols", "holy", "home", "hone", "honk", "hood", "hoof", "hook", "hoop", "hoot", "hope", "hops", "horn", "hose", "host", "hots", "hour", "hove", "howl", "hows", "hubs", "hued", "hues", "huff", "huge", "hugs", "huhs", "hula", "hulk", "hull", "hump", "hums", "hung", "hunk", "hunt", "hurl", "hurt", "hush", "husk", "huts", "hymn", "hype", "hypo", "iamb", "ibex", "ibis", "iced", "ices", "icky", "icon", "idea", "idem", "ides", "idle", "idly", "idol", "iffy", "ilks", "ills", "imam", "imps", "inch", "info", "inks", "inky", "inns", "inti", "into", "ions", "iota", "ired", "ires", "iris", "irks", "iron", "isle", "isms", "itch", "item", "jabs", "jack", "jade", "jags", "jail", "jamb", "jams", "jape", "jars", "jaws", "jays", "jazz", "jeep", "jeer", "jeez", "jell", "jerk", "jest", "jets", "jibs", "jigs", "jilt", "jink", "jinn", "jinx", "jive", "jobs", "jock", "joey", "jogs", "john", "join", "joke", "jolt", "josh", "jots", "jowl", "joys", "judo", "jugs", "jump", "junk", "jury", "just", "jute", "juts", "kale", "kart", "keel", "keen", "keep", "kegs", "kelp", "kens", "kept", "keys", "khan", "kick", "kids", "kike", "kill", "kiln", "kilo", "kilt", "kind", "king", "kink", "kins", "kips", "kirk", "kiss", "kite", "kith", "kits", "kiwi", "knee", "knew", "knit", "knob", "knot", "know", "kohl", "kook", "labs", "lace", "lack", "lacy", "lade", "lads", "lady", "lags", "laid", "lain", "lair", "lake", "lama", "lamb", "lame", "lamp", "lams", "land", "lane", "lank", "laps", "lard", "lark", "lash", "lass", "last", "late", "lath", "lats", "laud", "lava", "lavs", "lawn", "laws", "lays", "laze", "lazy", "lead", "leaf", "leak", "lean", "leap", "leas", "lech", "leek", "leer", "lees", "left", "legs", "leis", "lend", "lens", "lent", "less", "lest", "lets", "levy", "lewd", "liar", "libs", "lice", "lick", "lido", "lids", "lied", "lief", "lien", "lies", "lieu", "life", "lift", "like", "lilo", "lilt", "lily", "limb", "lime", "limn", "limo", "limp", "limy", "line", "link", "lino", "lint", "lion", "lips", "lira", "lire", "lisp", "list", "lite", "live", "load", "loaf", "loam", "loan", "lobe", "lobs", "loch", "loci", "lock", "loco", "lode", "loft", "loge", "logo", "logs", "loin", "loll", "lone", "long", "look", "loom", "loon", "loop", "loos", "loot", "lope", "lops", "lord", "lore", "lorn", "lose", "loss", "lost", "lots", "loud", "lour", "lout", "love", "lows", "luau", "lube", "luck", "ludo", "luge", "lugs", "lull", "lulu", "lump", "lung", "lure", "lurk", "lush", "lust", "lute", "luvs", "lynx", "lyre", "mace", "mack", "macs", "made", "mags", "maid", "mail", "maim", "main", "make", "male", "mall", "malt", "mama", "mams", "mane", "mans", "many", "maps", "mare", "mark", "mars", "mart", "mash", "mask", "mass", "mast", "mate", "math", "mats", "maul", "maws", "mayo", "maze", "mead", "meal", "mean", "meat", "meek", "meet", "mega", "megs", "meld", "melt", "memo", "mend", "menu", "mere", "mesa", "mesh", "mess", "mete", "mewl", "mews", "mica", "mice", "mick", "mics", "mien", "miff", "mike", "mild", "mile", "milk", "mill", "mils", "mime", "mind", "mine", "mini", "mink", "mint", "minx", "mire", "miss", "mist", "mite", "mitt", "moan", "moat", "mobs", "mock", "mode", "mods", "mole", "moll", "molt", "moms", "monk", "mono", "mood", "moon", "moor", "moos", "moot", "mope", "mops", "more", "morn", "mosh", "moss", "most", "mote", "moth", "move", "mows", "much", "muck", "muff", "mugs", "mule", "mull", "mums", "murk", "muse", "mush", "musk", "muss", "must", "mute", "mutt", "myna", "myth", "nabs", "naff", "nags", "nail", "name", "nans", "nape", "naps", "narc", "nary", "nave", "navy", "nays", "near", "neat", "neck", "need", "negs", "neon", "nerd", "nest", "nets", "nett", "news", "newt", "next", "nibs", "nice", "nick", "niff", "nigh", "nils", "nine", "nips", "nits", "nobs", "node", "nods", "noel", "noes", "none", "nook", "noon", "nope", "norm", "nose", "nosh", "note", "noun", "nous", "nova", "nowt", "nubs", "nude", "nuke", "null", "numb", "nuns", "nuts", "oafs", "oaks", "oars", "oath", "oats", "obey", "obit", "oboe", "odds", "odes", "offs", "ogle", "ogre", "ohms", "ohos", "oiks", "oils", "oily", "oink", "okay", "okra", "oleo", "omen", "omit", "once", "ones", "only", "onto", "onus", "onyx", "oohs", "oops", "ooze", "oozy", "opal", "open", "opts", "opus", "oral", "orbs", "ores", "orgy", "ouch", "ours", "oust", "outs", "ouzo", "oval", "oven", "over", "ovum", "owed", "owes", "owls", "owns", "oxen", "oxes", "pace", "pack", "pact", "pacy", "pads", "page", "paid", "pail", "pain", "pair", "pale", "pall", "palm", "pals", "pane", "pang", "pans", "pant", "papa", "paps", "para", "pare", "park", "pars", "part", "pass", "past", "pate", "path", "pats", "pave", "pawl", "pawn", "paws", "pays", "peak", "peal", "pear", "peas", "peat", "peck", "pecs", "peed", "peek", "peel", "peep", "peer", "pees", "pegs", "peke", "pelt", "pens", "pent", "peon", "peps", "perk", "perm", "pert", "peso", "pest", "pets", "pews", "phew", "pica", "pick", "pics", "pied", "pier", "pies", "pigs", "pike", "pile", "pill", "pimp", "pine", "ping", "pink", "pins", "pint", "piny", "pipe", "pips", "piss", "pita", "pith", "pits", "pity", "plan", "play", "plea", "pleb", "plod", "plop", "plot", "ploy", "plug", "plum", "plus", "pock", "pods", "poem", "poet", "poke", "poky", "pole", "poll", "polo", "pols", "poly", "pomp", "poms", "pond", "pone", "pong", "pony", "poof", "pooh", "pool", "poop", "poor", "poos", "pope", "pops", "pore", "pork", "porn", "port", "pose", "posh", "post", "posy", "pots", "pouf", "pour", "pout", "poxy", "pram", "prat", "pray", "prep", "prey", "prig", "prim", "prod", "prof", "prom", "prop", "pros", "prow", "psst", "pubs", "puce", "puck", "puds", "puff", "pugs", "puke", "pull", "pulp", "puma", "pump", "punk", "puns", "punt", "puny", "pupa", "pups", "pure", "purl", "purr", "push", "puss", "puts", "putt", "putz", "pyre", "quad", "quay", "quid", "quin", "quip", "quit", "quiz", "race", "rack", "racy", "raft", "raga", "rage", "rags", "raid", "rail", "rain", "rake", "ramp", "rams", "rand", "rang", "rank", "rant", "rape", "raps", "rapt", "rare", "rash", "rasp", "rate", "rats", "rave", "rays", "raze", "razz", "read", "real", "ream", "reap", "rear", "redo", "reds", "reed", "reef", "reek", "reel", "refs", "rein", "rely", "rend", "rent", "reps", "rest", "revs", "rhea", "ribs", "rice", "rich", "rick", "ride", "rids", "rife", "riff", "rift", "rigs", "rile", "rill", "rime", "rims", "rind", "ring", "rink", "riot", "ripe", "rips", "rise", "risk", "rite", "rive", "road", "roam", "roan", "roar", "robe", "robs", "rock", "rode", "rods", "roes", "roil", "role", "roll", "romp", "rood", "roof", "rook", "room", "root", "rope", "rose", "rosy", "rota", "rote", "rots", "rout", "roux", "rove", "rows", "rube", "rubs", "ruby", "ruck", "rude", "rued", "rues", "ruff", "rugs", "ruin", "rule", "rump", "rums", "rune", "rung", "runs", "runt", "ruse", "rush", "rusk", "rust", "ruts", "sack", "sacs", "safe", "saga", "sage", "sago", "sags", "said", "sail", "sake", "sale", "salt", "same", "sand", "sane", "sang", "sank", "sans", "saps", "sari", "sash", "sass", "sate", "save", "saws", "says", "scab", "scad", "scam", "scan", "scar", "scat", "scow", "scud", "scum", "seal", "seam", "sear", "seas", "seat", "secs", "sect", "seed", "seek", "seem", "seen", "seep", "seer", "sees", "self", "sell", "semi", "send", "sent", "sere", "serf", "sets", "sett", "sewn", "sews", "sexy", "shad", "shag", "shah", "sham", "shat", "shed", "shes", "shim", "shin", "ship", "shit", "shod", "shoe", "shoo", "shop", "shot", "show", "shun", "shut", "sick", "sics", "side", "sift", "sigh", "sign", "silk", "sill", "silo", "silt", "sine", "sing", "sink", "sins", "sips", "sire", "sirs", "site", "sits", "size", "skew", "skid", "skim", "skin", "skip", "skis", "skit", "skua", "slab", "slag", "slam", "slap", "slat", "slaw", "slay", "sled", "slew", "slid", "slim", "slip", "slit", "slob", "sloe", "slog", "slop", "slot", "slow", "slue", "slug", "slum", "slur", "slut", "smog", "smug", "smut", "snag", "snap", "snip", "snit", "snob", "snog", "snot", "snow", "snub", "snug", "soak", "soap", "soar", "sobs", "sock", "soda", "sods", "sofa", "soft", "soil", "sold", "sole", "solo", "sols", "some", "song", "sons", "soon", "soot", "sops", "sore", "sort", "sots", "souk", "soul", "soup", "sour", "sown", "sows", "spam", "span", "spar", "spas", "spat", "spay", "spec", "sped", "spew", "spic", "spin", "spit", "spiv", "spot", "spry", "spud", "spun", "spur", "stab", "stag", "star", "stay", "stem", "step", "stew", "stir", "stop", "stow", "stub", "stud", "stun", "subs", "such", "suck", "suds", "sued", "sues", "suet", "suit", "sulk", "sumo", "sump", "sums", "sung", "sunk", "suns", "sups", "sure", "surf", "suss", "swab", "swag", "swam", "swan", "swap", "swat", "sway", "swig", "swim", "swiz", "swot", "swum", "sync", "tabs", "tack", "taco", "tact", "tads", "tags", "tail", "take", "talc", "tale", "talk", "tall", "tame", "tamp", "tams", "tang", "tank", "tans", "tape", "taps", "tare", "tarn", "taro", "tarp", "tars", "tart", "task", "tats", "taut", "taxi", "teak", "teal", "team", "tear", "teas", "teat", "teds", "teed", "teem", "teen", "tees", "tell", "temp", "tend", "tens", "tent", "term", "tern", "test", "text", "than", "that", "thaw", "thee", "them", "then", "they", "thin", "this", "thou", "thud", "thug", "thus", "tick", "tics", "tide", "tidy", "tied", "tier", "ties", "tiff", "tile", "till", "tilt", "time", "ting", "tins", "tint", "tiny", "tips", "tits", "tizz", "toad", "toed", "toes", "toff", "tofu", "toga", "togs", "toil", "toke", "told", "toll", "tomb", "tome", "toms", "tone", "tong", "tons", "tony", "took", "tool", "toot", "tops", "tore", "torn", "tors", "tort", "tosh", "toss", "tote", "tots", "tour", "tout", "town", "tows", "toys", "trad", "tram", "trap", "tray", "tree", "trek", "trig", "trim", "trio", "trip", "trod", "trot", "troy", "true", "trug", "tuba", "tube", "tubs", "tuck", "tuft", "tugs", "tums", "tuna", "tune", "tuns", "turd", "turf", "turn", "tush", "tusk", "tuts", "tutu", "twat", "twee", "twig", "twin", "twit", "twos", "tyke", "type", "typo", "tyro", "ugly", "ulna", "umps", "undo", "unis", "unit", "unto", "upon", "urea", "urge", "uric", "urns", "used", "user", "uses", "vacs", "vain", "vale", "vamp", "vane", "vans", "vary", "vase", "vast", "vats", "veal", "veep", "veer", "veil", "vein", "veld", "vend", "vent", "verb", "very", "vest", "veto", "vets", "vial", "vibe", "vice", "vied", "vies", "view", "vile", "vine", "vino", "viol", "visa", "vise", "viva", "void", "vole", "volt", "vote", "vows", "wade", "wadi", "wads", "waft", "wage", "wags", "waif", "wail", "wait", "wake", "wale", "walk", "wall", "wand", "wane", "wank", "want", "ward", "ware", "warm", "warn", "warp", "wars", "wart", "wary", "wash", "wasp", "watt", "wave", "wavy", "waxy", "ways", "weak", "weal", "wean", "wear", "webs", "weds", "weed", "week", "weep", "weer", "wees", "weft", "weir", "weld", "well", "welt", "wend", "wens", "went", "wept", "were", "west", "wets", "wham", "what", "when", "whet", "whew", "whey", "whim", "whip", "whir", "whit", "whoa", "whom", "whop", "whup", "whys", "wick", "wide", "wife", "wigs", "wild", "wile", "will", "wilt", "wily", "wimp", "wind", "wine", "wing", "wink", "wino", "wins", "wipe", "wire", "wiry", "wise", "wish", "wisp", "wist", "with", "wits", "wive", "woad", "woes", "wogs", "woke", "woks", "wold", "wolf", "womb", "wonk", "wont", "wood", "woof", "wool", "woos", "wops", "word", "wore", "work", "worm", "worn", "wost", "wove", "wows", "wrap", "wren", "writ", "wuss", "yaks", "yams", "yang", "yank", "yaps", "yard", "yarn", "yawl", "yawn", "yaws", "yeah", "year", "yeas", "yell", "yelp", "yens", "yeps", "yest", "yeti", "yews", "yids", "yips", "yobs", "yoga", "yogi", "yoke", "yolk", "yore", "your", "yous", "yowl", "yuan", "yuck", "yuks", "yule", "yups", "zany", "zaps", "zeal", "zebu", "zeds", "zero", "zest", "zeta", "zinc", "zine", "zing", "zips", "zits", "zone", "zoom", "zoos" }; const char* w_5[] = { "aback", "abaft", "abase", "abash", "abate", "abbey", "abbot", "abeam", "abets", "abhor", "abide", "abler", "ables", "abode", "abort", "about", "above", "abuse", "abuts", "abuzz", "abyss", "ached", "aches", "achoo", "acids", "acing", "acmes", "acorn", "acres", "acrid", "acted", "actor", "acute", "adage", "adapt", "added", "adder", "addle", "adept", "adieu", "adman", "admen", "admit", "adobe", "adopt", "adore", "adorn", "adult", "adzes", "aegis", "aerie", "affix", "afire", "afoot", "afoul", "after", "again", "agape", "agate", "agave", "agent", "aggro", "agile", "aglow", "agony", "agree", "ahead", "ahems", "ahoys", "aided", "aides", "ailed", "aimed", "aired", "aisle", "aitch", "alarm", "album", "alder", "alert", "algae", "algal", "alias", "alibi", "alien", "align", "alike", "alive", "allay", "alley", "allot", "allow", "alloy", "aloes", "aloft", "aloha", "alone", "along", "aloof", "aloud", "alpha", "altar", "alter", "altos", "alums", "amass", "amaze", "amber", "ambit", "amble", "amend", "amens", "amids", "amigo", "amiss", "amity", "among", "amour", "amped", "ample", "amply", "amuse", "angel", "anger", "angle", "angry", "angst", "anion", "anise", "ankhs", "ankle", "annex", "annoy", "annul", "anode", "anons", "anted", "antes", "antic", "antis", "antsy", "anvil", "aorta", "apace", "apart", "aphid", "aping", "apple", "apply", "apron", "apses", "apter", "aptly", "aquas", "arced", "areas", "arena", "argon", "argot", "argue", "arias", "arise", "armed", "aroma", "arose", "array", "arrow", "arsed", "arson", "artsy", "ascot", "ashed", "ashen", "ashes", "aside", "asked", "askew", "aspen", "aspic", "assay", "asset", "aster", "astir", "atlas", "atoll", "atoms", "atone", "atria", "attar", "attic", "audio", "audit", "auger", "aught", "augur", "aunts", "aural", "auras", "autos", "avail", "avast", "avers", "avert", "avian", "avoid", "avows", "await", "awake", "award", "aware", "awash", "aways", "awful", "awing", "awoke", "axial", "axing", "axiom", "axles", "axons", "azure", "baaed", "babel", "babes", "baccy", "backs", "bacon", "badge", "badly", "bagel", "baggy", "bails", "bairn", "baits", "baize", "baked", "baker", "bakes", "balds", "baldy", "baled", "bales", "balks", "balky", "balls", "bally", "balms", "balmy", "balsa", "banal", "bands", "bandy", "baned", "banes", "bangs", "banjo", "banks", "banns", "barbs", "bards", "bared", "barer", "bares", "barfs", "barge", "barks", "barmy", "barns", "baron", "basal", "based", "baser", "bases", "basic", "basil", "basin", "basis", "basks", "basso", "baste", "basts", "batch", "bated", "bates", "bathe", "baths", "batik", "baton", "batty", "baulk", "bawdy", "bawls", "bayed", "bayou", "beach", "beads", "beady", "beaks", "beams", "beans", "beard", "bears", "beast", "beats", "beaus", "beaut", "bebop", "becks", "beech", "beefs", "beefy", "beeps", "beers", "beery", "beets", "befit", "befog", "began", "beget", "begin", "begot", "begum", "begun", "beige", "being", "belay", "belch", "belie", "belle", "bells", "belly", "below", "belts", "bench", "bends", "bendy", "bents", "beret", "bergs", "berks", "berms", "berry", "berth", "beryl", "beset", "besom", "besot", "bests", "betas", "betel", "bevel", "bevvy", "bhaji", "bible", "bicep", "biddy", "bides", "bidet", "biers", "biffs", "bight", "bigot", "bijou", "biked", "biker", "bikes", "bilge", "bilks", "bills", "billy", "bimbo", "binds", "binge", "bingo", "biped", "birch", "birds", "birth", "bison", "bitch", "bites", "bitty", "blabs", "black", "blade", "blags", "blahs", "blame", "bland", "blank", "blare", "blast", "blaze", "bleak", "bleat", "bleed", "bleep", "blend", "bless", "blimp", "blind", "blink", "blips", "bliss", "blitz", "bloat", "blobs", "block", "blocs", "bloke", "blond", "blood", "bloom", "blots", "blown", "blows", "blowy", "blued", "bluer", "blues", "bluff", "blunt", "blurb", "blurs", "blurt", "blush", "board", "boars", "boast", "boats", "bobby", "boded", "bodes", "bodge", "bogey", "boggy", "bogus", "boils", "bolas", "bolds", "boles", "bolls", "bolts", "bombs", "bonce", "bonds", "boned", "boner", "bones", "bongo", "bongs", "bonks", "bonny", "bonus", "boobs", "booby", "booed", "books", "booms", "boons", "boors", "boost", "booth", "boots", "booty", "booze", "boozy", "borax", "bored", "borer", "bores", "borne", "boron", "bosom", "bossy", "botch", "bough", "bound", "bouts", "bowed", "bowel", "bower", "bowls", "boxed", "boxer", "boxes", "bozos", "brace", "bract", "brads", "brags", "braid", "brain", "brake", "brand", "brash", "brass", "brats", "brave", "bravo", "brawl", "brawn", "brays", "bread", "break", "bream", "breed", "brews", "bribe", "brick", "bride", "brief", "brier", "brigs", "brill", "brims", "brine", "bring", "brink", "briny", "brisk", "broad", "broil", "broke", "brood", "brook", "broom", "broth", "brown", "brows", "bruin", "bruit", "brunt", "brush", "brute", "bucks", "buddy", "budge", "buffs", "buggy", "bugle", "build", "built", "bulbs", "bulge", "bulgy", "bulks", "bulky", "bulls", "bully", "bumph", "bumps", "bumpy", "bunch", "bungs", "bunks", "bunny", "bunts", "buoys", "burgh", "burgs", "burks", "burly", "burns", "burnt", "burps", "burro", "burrs", "burst", "busby", "bused", "buses", "bushy", "busks", "busts", "busty", "butch", "butte", "butts", "butty", "buxom", "buyer", "bylaw", "byres", "bytes", "byway", "cabal", "caber", "cabin", "cable", "cacao", "cache", "cacti", "cadet", "cadge", "cadre", "caffs", "caged", "cages", "cagey", "cairn", "caked", "cakes", "calls", "calms", "calve", "calyx", "camel", "cameo", "camps", "campy", "canal", "candy", "caned", "canes", "canny", "canoe", "canon", "canto", "cants", "caped", "caper", "capes", "capon", "carat", "cards", "cared", "carer", "cares", "caret", "cargo", "carob", "carol", "carom", "carpi", "carps", "carry", "carts", "carve", "cased", "cases", "casks", "caste", "casts", "catch", "cater", "catty", "caulk", "cause", "caved", "caver", "caves", "cavil", "cawed", "cease", "cedar", "ceded", "cedes", "celeb", "cello", "cells", "cents", "certs", "chafe", "chaff", "chain", "chair", "chalk", "champ", "chant", "chaos", "chaps", "chard", "charm", "chars", "chart", "chary", "chase", "chasm", "chats", "cheap", "cheat", "cheek", "cheep", "cheer", "chefs", "chess", "chest", "chews", "chewy", "chick", "chide", "chief", "child", "chili", "chill", "chime", "chimp", "china", "chink", "chino", "chins", "chips", "chirp", "chits", "chive", "chivy", "chock", "chocs", "choir", "choke", "chomp", "chops", "chord", "chore", "chose", "chows", "chuck", "chugs", "chump", "chums", "chunk", "churl", "churn", "chute", "cider", "cigar", "ciggy", "cilia", "cinch", "circa", "cissy", "cited", "cites", "civet", "civic", "civil", "clack", "claim", "clamp", "clams", "clang", "clank", "clans", "claps", "clash", "clasp", "class", "claws", "clean", "clear", "cleat", "clefs", "cleft", "clerk", "clews", "click", "cliff", "climb", "clime", "cling", "clink", "clips", "cloak", "clock", "clods", "clogs", "clomp", "clone", "clonk", "clops", "close", "cloth", "clots", "cloud", "clout", "clove", "clown", "cloys", "clubs", "cluck", "clued", "clues", "clump", "clung", "clunk", "coach", "coals", "coast", "coats", "cobra", "cocci", "cocks", "cocky", "cocoa", "codas", "coded", "codes", "codex", "coeds", "coifs", "coils", "coins", "coked", "cokes", "colas", "colds", "coled", "coley", "colic", "colon", "colts", "comae", "comas", "combo", "combs", "comer", "comes", "comet", "comfy", "comic", "comma", "conch", "condo", "coned", "cones", "conga", "conic", "conks", "cooed", "cooks", "cools", "coons", "coops", "coots", "coped", "copes", "copra", "copse", "coral", "cords", "cored", "cores", "corgi", "corks", "corms", "corns", "corny", "corps", "costs", "cotes", "couch", "cough", "could", "count", "coupe", "coups", "court", "coven", "cover", "coves", "covet", "covey", "cowed", "cower", "cowls", "coxed", "coxes", "coyer", "coyly", "coypu", "cozen", "crabs", "crack", "craft", "crags", "cramp", "crams", "crane", "crank", "crape", "craps", "crash", "crass", "crate", "crave", "crawl", "craws", "craze", "crazy", "creak", "cream", "credo", "creed", "creek", "creel", "creep", "crepe", "crept", "cress", "crest", "crews", "cribs", "crick", "cried", "crier", "cries", "crime", "crimp", "crisp", "croak", "crock", "croft", "crone", "crony", "crook", "croon", "crops", "cross", "croup", "crowd", "crown", "crows", "crude", "cruel", "cruet", "crumb", "crush", "crust", "crypt", "cubed", "cubes", "cubic", "cubit", "cuffs", "cuing", "culls", "cults", "cumin", "cunts", "cupid", "cuppa", "curds", "cured", "curer", "cures", "curie", "curio", "curls", "curly", "curry", "curse", "curve", "curvy", "cushy", "cusps", "cuter", "cutes", "cutey", "cutie", "cutup", "cycle", "cynic", "cysts", "dacha", "daddy", "daffy", "dagos", "daily", "dairy", "daisy", "dales", "dally", "dames", "damns", "damps", "dance", "dandy", "dared", "dares", "darns", "darts", "dated", "dates", "datum", "daubs", "daunt", "davit", "dawns", "dazed", "dazes", "deals", "dealt", "deans", "dears", "deary", "death", "debar", "debit", "debts", "debug", "debut", "decaf", "decal", "decay", "decks", "decor", "decoy", "decry", "deeds", "deems", "deeps", "defer", "defog", "deice", "deify", "deign", "deism", "deity", "delay", "delis", "dells", "delta", "delve", "demob", "demon", "demos", "demur", "denim", "dense", "dents", "depot", "depth", "derby", "desks", "deter", "detox", "deuce", "devil", "dhoti", "dhows", "dials", "diary", "diced", "dices", "dicey", "dicks", "dicta", "diets", "digit", "dikes", "dildo", "dills", "dilly", "dimer", "dimes", "dimly", "dinar", "dined", "diner", "dines", "dingo", "dings", "dingy", "dinky", "diode", "dippy", "dipso", "direr", "dirge", "dirks", "dirty", "disco", "discs", "dishy", "disks", "ditch", "ditto", "ditty", "divan", "divas", "dived", "diver", "dives", "divot", "divvy", "dizzy", "docks", "dodge", "dodgy", "dodos", "doers", "doest", "doffs", "doggy", "dogie", "dogma", "doily", "doing", "doled", "doles", "dolls", "dolly", "dolts", "domed", "domes", "donor", "dooms", "doors", "doped", "dopes", "dopey", "dorks", "dorky", "dorms", "dosed", "doses", "doted", "dotes", "dotty", "doubt", "dough", "douse", "doves", "dowdy", "dowel", "downs", "downy", "dowry", "dowse", "doyen", "dozed", "dozen", "dozes", "drabs", "drags", "drain", "drake", "drama", "drams", "drank", "drape", "drawl", "drawn", "draws", "drays", "dread", "dream", "drear", "dregs", "dress", "dried", "drier", "dries", "drift", "drill", "drink", "drips", "drive", "droll", "drone", "drool", "droop", "drops", "dross", "drove", "drown", "drubs", "drugs", "druid", "drums", "drunk", "dryad", "dryer", "dryly", "ducal", "ducat", "duchy", "ducks", "ducky", "ducts", "duded", "dudes", "duels", "duets", "duffs", "duked", "dukes", "dulls", "dully", "dumbo", "dumbs", "dummy", "dumps", "dumpy", "dunce", "dunes", "dungs", "dunks", "dunno", "duped", "dupes", "dusky", "dusts", "dusty", "duvet", "dwarf", "dweeb", "dwell", "dwelt", "dyers", "dying", "eager", "eagle", "earls", "early", "earns", "earth", "eased", "easel", "eases", "eaten", "eater", "eaves", "ebbed", "ebony", "edged", "edger", "edges", "edict", "edify", "edits", "eerie", "effed", "egged", "egret", "eider", "eight", "eject", "eking", "elate", "elbow", "elder", "elect", "elegy", "elfin", "elide", "elite", "elope", "elude", "elves", "email", "embed", "ember", "emcee", "emend", "emery", "emirs", "emits", "emote", "empty", "enact", "ended", "endow", "endue", "enema", "enemy", "enjoy", "ennui", "ensue", "enter", "entry", "envoy", "epics", "epoch", "epoxy", "equal", "equip", "erase", "erect", "erode", "erred", "error", "erupt", "essay", "ester", "ether", "ethic", "ethos", "euros", "evade", "evens", "event", "every", "evict", "evils", "evoke", "ewers", "exact", "exalt", "exams", "excel", "execs", "exert", "exile", "exist", "exits", "expat", "expel", "expos", "extol", "extra", "exude", "exult", "fable", "faced", "faces", "facet", "facts", "faddy", "faded", "fades", "faffs", "fails", "fains", "faint", "fairs", "fairy", "faith", "faked", "faker", "fakes", "fakir", "falls", "false", "famed", "fancy", "fangs", "fanny", "farce", "fared", "fares", "farms", "farts", "fasts", "fatal", "fated", "fates", "fatso", "fatty", "fatwa", "fault", "fauna", "fauns", "faves", "fawns", "faxed", "faxes", "fazed", "fazes", "fears", "feast", "feats", "fecal", "feces", "feeds", "feels", "feign", "feint", "fella", "fells", "felon", "felts", "femur", "fence", "fends", "feral", "ferns", "ferny", "ferry", "fests", "fetch", "feted", "fetid", "feuds", "fever", "fewer", "fiats", "fiche", "fiefs", "field", "fiend", "fiery", "fifes", "fifth", "fifty", "fight", "filch", "filed", "files", "fills", "filly", "films", "filmy", "filth", "final", "finch", "finds", "fined", "finer", "fines", "finis", "finks", "finny", "fired", "fires", "firms", "first", "firth", "fishy", "fists", "fitly", "fiver", "fives", "fixed", "fixer", "fixes", "fizzy", "fjord", "flack", "flags", "flail", "flair", "flake", "flaks", "flaky", "flame", "flank", "flans", "flaps", "flare", "flash", "flask", "flats", "flaws", "flays", "fleas", "fleck", "flees", "fleet", "flesh", "flick", "flied", "flier", "flies", "fling", "flint", "flips", "flirt", "flits", "float", "flock", "floes", "flogs", "flood", "floor", "flops", "flora", "floss", "flour", "flout", "flown", "flows", "flubs", "flues", "fluff", "fluid", "fluke", "fluky", "flume", "flung", "flunk", "flush", "flute", "flyby", "foals", "foams", "foamy", "focal", "focus", "foggy", "foils", "foist", "folds", "folio", "folks", "folly", "fonds", "fonts", "foods", "fools", "foots", "footy", "foray", "force", "fords", "fores", "forge", "forgo", "forks", "forms", "forte", "forth", "forts", "forty", "forum", "fouls", "found", "fount", "fours", "fowls", "foxed", "foxes", "foyer", "frail", "frame", "franc", "frank", "frats", "fraud", "frays", "freak", "freed", "freer", "frees", "fresh", "frets", "friar", "fried", "fries", "frigs", "frill", "frisk", "frizz", "frock", "frogs", "frond", "front", "frosh", "frost", "froth", "frown", "froze", "fruit", "frump", "fryer", "fucks", "fudge", "fuels", "fuggy", "fugue", "fulls", "fully", "fumed", "fumes", "funds", "fungi", "funks", "funky", "funny", "furls", "furor", "furry", "furze", "fused", "fuses", "fussy", "fusty", "futon", "fuzzy", "gabby", "gable", "gaffe", "gaffs", "gaily", "gains", "gaits", "galas", "gales", "galls", "gamed", "gamer", "games", "gamin", "gamma", "gammy", "gamut", "gangs", "ganja", "gaols", "gaped", "gapes", "garbs", "gases", "gasps", "gassy", "gated", "gates", "gator", "gaudy", "gaunt", "gauze", "gauzy", "gavel", "gawks", "gawky", "gawps", "gayer", "gazed", "gazer", "gazes", "gears", "gecko", "geeks", "geeky", "geese", "gelds", "gelid", "genes", "genie", "genii", "genre", "gents", "genus", "geode", "germs", "getup", "ghost", "ghoul", "giant", "gibed", "gibes", "giddy", "gifts", "gilds", "gills", "gilts", "gimme", "gimpy", "girds", "girls", "giros", "girth", "girts", "gites", "given", "giver", "gives", "glade", "glads", "gland", "glare", "glass", "glaze", "gleam", "glean", "glens", "glide", "glint", "glitz", "gloat", "globe", "globs", "gloom", "glops", "glory", "gloss", "glove", "glows", "glued", "glues", "gluey", "glums", "gluts", "glyph", "gnarl", "gnash", "gnats", "gnaws", "gnome", "goads", "goals", "goats", "godly", "goers", "gofer", "going", "golds", "golfs", "golly", "gonad", "goner", "gongs", "gonna", "goods", "goody", "gooey", "goofs", "goofy", "gooks", "goons", "goose", "gored", "gores", "gorge", "gorse", "goths", "gotta", "gouge", "gourd", "gouty", "gowns", "grabs", "grace", "grade", "grads", "graft", "grail", "grain", "grams", "grand", "grans", "grant", "grape", "graph", "grasp", "grass", "grate", "grave", "gravy", "graze", "great", "grebe", "greed", "green", "greet", "grids", "grief", "grill", "grime", "grimy", "grind", "grins", "gripe", "grips", "grist", "grits", "groan", "groin", "groom", "grope", "gross", "group", "grout", "grove", "growl", "grown", "grows", "grubs", "gruel", "gruff", "grump", "grunt", "guano", "guard", "guava", "guess", "guest", "guide", "guild", "guile", "guilt", "guise", "gulag", "gulch", "gulfs", "gulls", "gully", "gulps", "gumbo", "gummy", "gunge", "gungy", "gunny", "guppy", "gurus", "gushy", "gusto", "gusts", "gusty", "gutsy", "guyed", "gypsy", "gyros", "habit", "hacks", "haded", "hades", "hafts", "haiku", "hails", "hairs", "hairy", "hakes", "halal", "haled", "haler", "hales", "hallo", "halls", "halon", "halos", "halts", "halve", "hammy", "hands", "handy", "hangs", "hanks", "happy", "hardy", "hared", "harem", "hares", "harks", "harms", "harps", "harpy", "harry", "harsh", "harts", "hasps", "haste", "hasty", "hatch", "hated", "hater", "hates", "hauls", "haunt", "haven", "haves", "havoc", "hawed", "hawks", "hayed", "hazed", "hazel", "hazes", "heads", "heady", "heals", "heaps", "heard", "hears", "heart", "heath", "heats", "heave", "heavy", "hedge", "heeds", "heels", "hefts", "hefty", "heirs", "heist", "helix", "hello", "hells", "helms", "helot", "helps", "hence", "henna", "herbs", "herds", "heron", "hertz", "hewed", "hewer", "hexed", "hexes", "hicks", "hided", "hides", "highs", "hiked", "hiker", "hikes", "hills", "hilly", "hilts", "hinds", "hinge", "hints", "hippo", "hired", "hires", "hitch", "hived", "hives", "hoard", "hoary", "hobby", "hobos", "hocks", "hogan", "hoick", "hoist", "hokey", "hokum", "holds", "holed", "holes", "holly", "homed", "homer", "homes", "homey", "honed", "honer", "hones", "honey", "honks", "honky", "hooch", "hoods", "hooey", "hoofs", "hooks", "hooky", "hoops", "hoots", "hoped", "hopes", "horde", "horns", "horny", "horse", "hosed", "hoses", "hosts", "hotel", "hotly", "hound", "hours", "house", "hovel", "hover", "howdy", "howls", "hubby", "huffs", "huffy", "huger", "hulas", "hulks", "hullo", "hulls", "human", "humid", "humph", "humps", "humus", "hunch", "hunks", "hunky", "hunts", "hurls", "hurry", "hurts", "husks", "husky", "hussy", "hutch", "hydra", "hyena", "hying", "hymen", "hymns", "hyped", "hyper", "hypes", "hypos", "iambs", "icier", "icily", "icing", "icons", "ideal", "ideas", "idiom", "idiot", "idled", "idler", "idles", "idols", "idyll", "igloo", "image", "imams", "imbue", "impel", "imply", "inane", "inapt", "incur", "index", "indie", "inept", "inert", "infer", "infix", "ingot", "inked", "inlay", "inlet", "inned", "inner", "innit", "input", "inset", "inter", "inure", "iotas", "irate", "iring", "irked", "irons", "irony", "isles", "islet", "issue", "itchy", "items", "ivied", "ivies", "ivory", "jabot", "jacks", "jaded", "jades", "jails", "jambs", "jammy", "japan", "japed", "japes", "jaunt", "jawed", "jazzy", "jeans", "jeeps", "jeers", "jells", "jelly", "jemmy", "jerks", "jerky", "jests", "jetty", "jewel", "jiffy", "jihad", "jilts", "jimmy", "jinks", "jinns", "jived", "jives", "jocks", "joeys", "johns", "joins", "joint", "joist", "joked", "joker", "jokes", "jokey", "jolly", "jolts", "joule", "joust", "jowls", "jowly", "joyed", "judge", "juice", "juicy", "julep", "jumbo", "jumps", "jumpy", "junco", "junks", "junta", "juror", "kabob", "kapok", "kaput", "karat", "karma", "karts", "kayak", "kazoo", "kebab", "keels", "keens", "keeps", "ketch", "keyed", "khaki", "khans", "kicks", "kicky", "kiddo", "kikes", "kills", "kilns", "kilos", "kilts", "kinda", "kinds", "kings", "kinks", "kinky", "kiosk", "kirks", "kited", "kites", "kiths", "kitty", "kiwis", "klutz", "knack", "knave", "knead", "kneed", "kneel", "knees", "knell", "knelt", "knife", "knits", "knobs", "knock", "knoll", "knots", "known", "knows", "koala", "kooks", "kooky", "korma", "krill", "krone", "kudos", "kudzu", "label", "labia", "laced", "laces", "lacks", "laded", "laden", "lades", "ladle", "lager", "laird", "lairs", "laity", "laked", "lakes", "lamas", "lambs", "lamed", "lamer", "lames", "lamps", "lance", "lands", "lanes", "lanky", "lapel", "lapse", "larch", "lards", "large", "largo", "larks", "larva", "laser", "lasso", "lasts", "latch", "later", "latex", "lathe", "laths", "latte", "lauds", "laugh", "lawns", "laxer", "laxes", "laxly", "layer", "lazed", "lazes", "leach", "leads", "leafs", "leafy", "leaks", "leaky", "leans", "leaps", "learn", "lease", "leash", "least", "leave", "ledge", "leech", "leeks", "leers", "leery", "lefts", "lefty", "legal", "leggy", "legit", "lemma", "lemme", "lemon", "lemur", "lends", "leper", "letch", "letup", "levee", "level", "lever", "lexis", "liars", "libel", "licit", "licks", "lidos", "liefs", "liege", "liens", "lifer", "lifts", "light", "liked", "liken", "liker", "likes", "lilac", "lilos", "lilts", "limbo", "limbs", "limed", "limes", "limey", "limit", "limns", "limos", "limps", "lined", "linen", "liner", "lines", "lingo", "lings", "links", "lints", "lions", "lipid", "lippy", "lisle", "lisps", "lists", "lites", "lithe", "lived", "liven", "liver", "lives", "livid", "llama", "llano", "loads", "loafs", "loamy", "loans", "loath", "lobby", "lobed", "lobes", "local", "lochs", "locks", "locos", "locum", "locus", "lodes", "lodge", "lofts", "lofty", "loges", "logic", "logos", "loins", "lolls", "lolly", "loner", "longs", "looks", "looms", "loons", "loony", "loops", "loopy", "loose", "loots", "loped", "lopes", "lords", "lorry", "loser", "loses", "lotto", "lotus", "lough", "lours", "louse", "lousy", "louts", "loved", "lover", "loves", "lovey", "lowed", "lower", "lowly", "loxed", "loxes", "loyal", "luaus", "lubed", "lubes", "lucid", "lucks", "lucky", "lucre", "luges", "lulls", "lulus", "lumps", "lumpy", "lunar", "lunch", "lunge", "lungs", "lupus", "lurch", "lured", "lures", "lurgy", "lurid", "lurks", "lusts", "lusty", "lutes", "lying", "lymph", "lynch", "lyres", "lyric", "macaw", "maced", "maces", "macho", "macks", "macro", "madam", "madly", "mafia", "magic", "magma", "maids", "mails", "maims", "mains", "maize", "major", "maker", "makes", "males", "malls", "malts", "mamas", "mamba", "mambo", "mammy", "manes", "mange", "mango", "mangy", "mania", "manic", "manky", "manly", "manna", "manor", "manse", "maple", "march", "mares", "marge", "maria", "marks", "marry", "marsh", "marts", "masks", "mason", "masts", "match", "mated", "mater", "mates", "matey", "matte", "matzo", "mauls", "mauve", "maven", "mawed", "maxed", "maxes", "maxim", "maybe", "mayor", "mazes", "meals", "mealy", "means", "meant", "meats", "meaty", "mecca", "medal", "media", "medic", "meets", "melds", "melon", "melts", "memos", "mends", "menus", "mercy", "mered", "merer", "meres", "merge", "merit", "merry", "mesas", "messy", "metal", "meted", "metes", "meths", "metro", "mewed", "mewls", "mezzo", "micks", "micro", "middy", "midge", "midst", "miens", "miffs", "might", "miked", "mikes", "milch", "miler", "miles", "milks", "milky", "mills", "mimed", "mimes", "mimic", "mince", "minds", "mined", "miner", "mines", "mingy", "minim", "minis", "minks", "minor", "mints", "minty", "minus", "mired", "mires", "mirth", "misdo", "miser", "mists", "misty", "mites", "mitts", "mixed", "mixer", "mixes", "moans", "moats", "mocha", "mocks", "modal", "model", "modem", "moder", "modes", "moggy", "mogul", "moire", "moist", "molar", "moles", "molls", "molts", "momma", "mommy", "money", "monks", "month", "mooch", "moods", "moody", "mooed", "moons", "moors", "moose", "moots", "moped", "mopes", "moral", "moray", "mores", "morns", "moron", "moses", "mosey", "mossy", "motel", "motes", "motet", "moths", "motif", "motor", "motto", "moult", "mound", "mount", "mourn", "mouse", "mousy", "mouth", "moved", "mover", "moves", "movie", "mowed", "mower", "moxie", "mucks", "mucky", "mucus", "muddy", "muffs", "mufti", "muggy", "mulch", "muled", "mules", "mulls", "mummy", "mumps", "munch", "mural", "murks", "murky", "mused", "muses", "mushy", "music", "musks", "musky", "mussy", "musts", "musty", "muted", "muter", "mutes", "mutts", "muzak", "muzzy", "mynas", "myrrh", "myths", "nabob", "nacho", "nacre", "nadir", "naiad", "nails", "naive", "naked", "named", "names", "nanny", "napes", "nappy", "narcs", "narky", "nasal", "nasty", "natal", "natch", "natty", "naval", "navel", "naves", "navvy", "nears", "neath", "necks", "needs", "needy", "negro", "neigh", "nerds", "nerdy", "nerve", "nervy", "nests", "never", "newed", "newel", "newer", "newly", "newsy", "newts", "nexus", "nicer", "niche", "nicks", "niece", "niffy", "nifty", "night", "nimbi", "nimby", "nines", "ninja", "ninny", "ninth", "nippy", "nixed", "nixes", "noble", "nobly", "nodal", "noddy", "nodes", "noels", "nohow", "noise", "noisy", "nomad", "nonce", "nones", "nooks", "nooky", "noons", "noose", "nopes", "norms", "north", "nosed", "noses", "notch", "noted", "notes", "nouns", "novae", "novas", "novel", "noway", "nuder", "nudes", "nudge", "nuked", "nukes", "nulls", "numbs", "nurse", "nutty", "nylon", "nymph", "oaken", "oakum", "oared", "oases", "oasis", "oaten", "oaths", "obese", "obeys", "obits", "oboes", "occur", "ocean", "ocker", "octal", "octet", "odder", "oddly", "odium", "offal", "offed", "offer", "often", "ofter", "ogled", "ogles", "ogres", "oiled", "oinks", "okays", "okras", "olden", "older", "oldie", "olive", "omega", "omens", "omits", "onion", "onset", "oohed", "oomph", "oozed", "oozes", "opals", "opens", "opera", "opine", "opium", "opted", "optic", "orals", "orate", "orbit", "order", "organ", "osier", "other", "otter", "ought", "ounce", "ousts", "outdo", "outed", "outer", "outgo", "outta", "ouzos", "ovals", "ovary", "ovens", "overs", "overt", "ovoid", "ovule", "owing", "owlet", "owned", "owner", "oxbow", "oxide", "ozone", "paced", "paces", "pacey", "packs", "pacts", "paddy", "padre", "paean", "pagan", "paged", "pager", "pages", "pails", "pains", "paint", "pairs", "paled", "paler", "pales", "palls", "pally", "palms", "palmy", "palsy", "panda", "panel", "panes", "pangs", "panic", "pansy", "panto", "pants", "papal", "papas", "papaw", "paper", "pappy", "paras", "parch", "pared", "pares", "parka", "parks", "parky", "parry", "parse", "parts", "party", "pasha", "pasta", "paste", "pasts", "pasty", "patch", "pater", "pates", "paths", "patio", "patsy", "patty", "pause", "paved", "paves", "pawed", "pawls", "pawns", "payed", "payee", "payer", "peace", "peach", "peaks", "peaky", "peals", "pearl", "pears", "peaty", "pecan", "pecks", "pedal", "peeks", "peels", "peeps", "peers", "peeve", "pekes", "pekoe", "pelts", "penal", "pence", "pends", "penis", "penny", "pents", "peons", "peony", "peppy", "perch", "peril", "perks", "perky", "perms", "perts", "pervs", "pesky", "pesos", "pesto", "pests", "petal", "peter", "petty", "pewee", "phase", "phial", "phlox", "phone", "phony", "photo", "phyla", "piano", "picks", "picky", "piece", "piers", "piety", "piggy", "piing", "piked", "piker", "pikes", "pilaf", "piled", "piles", "pills", "pilot", "pimps", "pinch", "pined", "pines", "pings", "pinko", "pinks", "pinny", "pinto", "pints", "pinup", "pious", "piped", "piper", "pipes", "pipit", "pique", "piste", "pitas", "pitch", "pithy", "piton", "pitta", "pivot", "pixel", "pixie", "pizza", "place", "plaid", "plain", "plait", "plane", "plank", "plans", "plant", "plate", "plays", "plaza", "plead", "pleas", "pleat", "plebe", "plebs", "plied", "plies", "plods", "plonk", "plops", "plots", "ploys", "pluck", "plugs", "plumb", "plume", "plump", "plums", "plunk", "plush", "poach", "pocks", "poems", "poesy", "poets", "point", "poise", "poked", "poker", "pokes", "polar", "poled", "poles", "polio", "polka", "polls", "polyp", "pommy", "ponce", "poncy", "ponds", "pones", "pongs", "pooch", "pooed", "poofs", "poohs", "pools", "poops", "popes", "poppa", "poppy", "porch", "pored", "pores", "porky", "porno", "ports", "posed", "poser", "poses", "posit", "posse", "posts", "potty", "pouch", "poufs", "pound", "pours", "pouts", "power", "poxed", "poxes", "prams", "prang", "prank", "prate", "prats", "prawn", "prays", "preen", "preps", "press", "preys", "price", "prick", "pride", "pried", "prier", "pries", "prigs", "prime", "primp", "print", "prion", "prior", "prism", "privy", "probe", "prods", "profs", "prole", "promo", "proms", "prone", "prong", "proof", "props", "prose", "prosy", "proud", "prove", "prowl", "prows", "proxy", "prude", "prune", "psalm", "pshaw", "pssts", "psych", "pubes", "pubic", "pubis", "pucks", "pudgy", "puffs", "puffy", "puked", "pukes", "pukka", "pulls", "pulps", "pulpy", "pulse", "pumas", "pumps", "punch", "punks", "punts", "pupae", "pupal", "pupil", "puppy", "pured", "puree", "purer", "purge", "purls", "purrs", "purse", "pushy", "pussy", "putts", "putty", "pygmy", "pylon", "pyres", "pyxed", "pyxes", "pzazz", "quack", "quads", "quaff", "quail", "quake", "qualm", "quark", "quart", "quash", "quasi", "quays", "queen", "queer", "quell", "query", "quest", "queue", "quick", "quids", "quiet", "quiff", "quill", "quilt", "quins", "quint", "quips", "quire", "quirk", "quite", "quits", "quoit", "quota", "quote", "quoth", "rabbi", "rabid", "raced", "racer", "races", "racks", "radar", "radii", "radio", "radon", "rafts", "ragas", "raged", "rages", "ragga", "raids", "rails", "rains", "rainy", "raise", "rajah", "raked", "rakes", "rally", "ramps", "ranch", "randy", "ranee", "range", "rangy", "ranks", "rants", "raped", "rapes", "rapid", "rared", "rarer", "rares", "rasps", "raspy", "rated", "rates", "ratio", "ratty", "raved", "ravel", "raven", "raver", "raves", "rawer", "rayon", "razed", "razes", "razor", "reach", "react", "reads", "ready", "realm", "reams", "reaps", "rearm", "rears", "rebel", "rebus", "rebut", "recap", "recce", "recon", "recto", "recur", "redid", "reeds", "reedy", "reefs", "reeks", "reels", "reeve", "refer", "refit", "regal", "rehab", "reign", "reins", "rejig", "relax", "relay", "relic", "remit", "remix", "renal", "rends", "renew", "rents", "repay", "repel", "reply", "reran", "rerun", "resat", "reset", "resin", "resit", "rests", "retch", "retro", "retry", "reuse", "revel", "revue", "rheas", "rheum", "rhino", "rhyme", "riced", "rices", "ricks", "rider", "rides", "ridge", "rifer", "riffs", "rifle", "rifts", "right", "rigid", "riled", "riles", "rills", "rimed", "rimes", "rinds", "rings", "rinks", "rinse", "riots", "riped", "ripen", "riper", "ripes", "risen", "riser", "rises", "risks", "risky", "rites", "ritzy", "rival", "riven", "river", "rives", "rivet", "roach", "roads", "roams", "roans", "roars", "roast", "robed", "robes", "robin", "robot", "rocks", "rocky", "roded", "rodeo", "rodes", "roger", "rogue", "roils", "roles", "rolls", "roman", "romps", "rondo", "roods", "roofs", "rooks", "rooms", "roomy", "roost", "roots", "roped", "ropes", "ropey", "roses", "rosin", "rotas", "roted", "rotes", "rotor", "rouge", "rough", "round", "rouse", "roust", "route", "routs", "roved", "rover", "roves", "rowan", "rowdy", "rowed", "rowel", "rower", "royal", "rubes", "rucks", "ruddy", "ruder", "ruffs", "rugby", "ruing", "ruins", "ruled", "ruler", "rules", "rumba", "rummy", "rumps", "runes", "rungs", "runic", "runny", "runts", "rupee", "rural", "ruses", "rusks", "rusts", "rusty", "sable", "sacks", "sades", "sadhu", "sadly", "safer", "safes", "sagas", "sager", "sages", "saggy", "sahib", "sails", "saint", "saith", "salad", "sales", "sally", "salon", "salsa", "salts", "salty", "salve", "salvo", "samba", "sames", "samey", "sands", "sandy", "saned", "saner", "sanes", "sangs", "sappy", "sarge", "saris", "sarky", "sassy", "satay", "sated", "sates", "satin", "satyr", "sauce", "saucy", "sauna", "saved", "saver", "saves", "savoy", "savvy", "sawed", "saxes", "scabs", "scads", "scald", "scale", "scalp", "scaly", "scamp", "scams", "scans", "scant", "scare", "scarf", "scarp", "scars", "scary", "scats", "scene", "scent", "schwa", "scion", "scoff", "scold", "scone", "scoop", "scoot", "scope", "score", "scorn", "scour", "scout", "scowl", "scows", "scram", "scrap", "scree", "screw", "scrip", "scrod", "scrub", "scrum", "scuba", "scuds", "scuff", "scull", "scums", "scurf", "seals", "seams", "seamy", "sears", "seats", "sebum", "sects", "sedan", "sedge", "seeds", "seedy", "seeks", "seems", "seeps", "seers", "segue", "seize", "sells", "semen", "semis", "sends", "senna", "sense", "sepal", "sepia", "septa", "sered", "serer", "seres", "serfs", "serge", "serif", "serum", "serve", "servo", "setts", "setup", "seven", "sever", "sewed", "sewer", "sexed", "sexes", "shack", "shade", "shads", "shady", "shaft", "shags", "shahs", "shake", "shaky", "shale", "shall", "shalt", "shame", "shams", "shank", "shape", "shard", "share", "shark", "sharp", "shave", "shawl", "sheaf", "shear", "sheds", "sheen", "sheep", "sheer", "sheet", "sheik", "shelf", "shell", "shied", "shies", "shift", "shill", "shims", "shine", "shins", "shiny", "ships", "shire", "shirk", "shirr", "shirt", "shite", "shits", "shoal", "shock", "shoes", "shone", "shook", "shoos", "shoot", "shops", "shore", "short", "shots", "shout", "shove", "shown", "shows", "showy", "shred", "shrew", "shrub", "shrug", "shuck", "shuns", "shunt", "shush", "shuts", "shyer", "shyly", "sibyl", "sicko", "sicks", "sided", "sides", "sidle", "siege", "sieve", "sifts", "sighs", "sight", "sigma", "signs", "silks", "silky", "sills", "silly", "silos", "silts", "since", "sines", "sinew", "singe", "sings", "sinks", "sinus", "sired", "siren", "sires", "sisal", "sises", "sissy", "sitar", "sited", "sites", "sixes", "sixth", "sixty", "sized", "sizer", "sizes", "skate", "skeet", "skein", "skews", "skids", "skied", "skier", "skies", "skiff", "skill", "skimp", "skims", "skins", "skint", "skips", "skirt", "skits", "skive", "skuas", "skulk", "skull", "skunk", "slabs", "slack", "slags", "slain", "slake", "slams", "slang", "slant", "slaps", "slash", "slate", "slats", "slave", "slays", "sleds", "sleek", "sleep", "sleet", "slept", "slews", "slice", "slick", "slide", "slier", "slime", "slims", "slimy", "sling", "slink", "slips", "slits", "slobs", "sloes", "slogs", "sloop", "slope", "slops", "slosh", "sloth", "slots", "slows", "slued", "slues", "slugs", "slump", "slums", "slung", "slunk", "slurp", "slurs", "slush", "sluts", "slyly", "smack", "small", "smart", "smash", "smear", "smell", "smelt", "smile", "smirk", "smite", "smith", "smock", "smogs", "smoke", "smoky", "smote", "smugs", "smuts", "snack", "snafu", "snags", "snail", "snake", "snaky", "snaps", "snare", "snarl", "sneak", "sneer", "snick", "snide", "sniff", "snipe", "snips", "snits", "snobs", "snogs", "snoop", "snoot", "snore", "snort", "snots", "snout", "snows", "snowy", "snubs", "snuff", "snugs", "soaks", "soaps", "soapy", "soars", "sober", "socks", "sodas", "sofas", "softy", "soggy", "soils", "solar", "soled", "soles", "solid", "solos", "solve", "sonar", "songs", "sonic", "sonny", "sooth", "sooty", "soppy", "sored", "sorer", "sores", "sorry", "sorta", "sorts", "sough", "souks", "souls", "sound", "soups", "soupy", "sours", "souse", "south", "sowed", "sower", "space", "spade", "spake", "spams", "spank", "spans", "spare", "spark", "spars", "spasm", "spate", "spats", "spawn", "spays", "speak", "spear", "speck", "specs", "speed", "spell", "spend", "spent", "sperm", "spews", "spice", "spics", "spicy", "spied", "spiel", "spies", "spiff", "spike", "spiky", "spill", "spine", "spins", "spiny", "spire", "spite", "spits", "spivs", "splat", "splay", "split", "spoil", "spoke", "spoof", "spook", "spool", "spoon", "spoor", "spore", "sport", "spots", "spout", "sprat", "spray", "spree", "sprig", "sprog", "spuds", "spume", "spunk", "spurn", "spurs", "spurt", "squab", "squad", "squat", "squaw", "squib", "squid", "stabs", "stack", "staff", "stage", "stags", "stagy", "staid", "stain", "stair", "stake", "stale", "stalk", "stall", "stamp", "stand", "stank", "staph", "stare", "stark", "stars", "start", "stash", "state", "stats", "stave", "stays", "stead", "steak", "steal", "steam", "steed", "steel", "steep", "steer", "stein", "stems", "steno", "steps", "stern", "stews", "stick", "sties", "stiff", "stile", "still", "stilt", "sting", "stink", "stint", "stirs", "stoat", "stock", "stogy", "stoic", "stoke", "stole", "stomp", "stone", "stony", "stood", "stool", "stoop", "stops", "store", "stork", "storm", "stoup", "stout", "stove", "stows", "strap", "straw", "stray", "strep", "strew", "strip", "strop", "strum", "strut", "stubs", "stuck", "studs", "study", "stuff", "stump", "stung", "stunk", "stuns", "stunt", "style", "styli", "suave", "sucks", "sudsy", "suede", "sugar", "suing", "suite", "suits", "sulks", "sulky", "sully", "sumac", "sumps", "sunks", "sunny", "sunup", "super", "surer", "surfs", "surge", "surly", "sushi", "swabs", "swags", "swain", "swami", "swamp", "swank", "swans", "swaps", "sward", "swarm", "swash", "swath", "swats", "sways", "swear", "sweat", "swede", "sweep", "sweet", "swell", "swept", "swift", "swigs", "swill", "swims", "swine", "swing", "swipe", "swirl", "swish", "swizz", "swoon", "swoop", "sword", "swore", "sworn", "swots", "swung", "sylph", "syncs", "synod", "syrup", "tabby", "table", "taboo", "tacit", "tacks", "tacky", "tacos", "taffy", "tails", "taint", "taken", "taker", "takes", "tales", "talks", "tally", "talon", "tamed", "tamer", "tames", "tamps", "tango", "tangs", "tangy", "tanks", "tansy", "tapas", "taped", "taper", "tapes", "tapir", "tardy", "tared", "tares", "tarns", "taros", "tarot", "tarps", "tarry", "tarts", "tarty", "tasks", "taste", "tasty", "tater", "tatty", "taunt", "taupe", "tauts", "tawny", "taxed", "taxes", "taxis", "teach", "teaed", "teaks", "teals", "teams", "tears", "teary", "tease", "teats", "techs", "teddy", "teems", "teens", "teeny", "teeth", "telex", "tells", "telly", "tempo", "temps", "tempt", "tench", "tends", "tenet", "tenon", "tenor", "tense", "tenth", "tents", "tepee", "tepid", "terms", "terns", "terry", "terse", "tests", "testy", "texts", "thank", "thaws", "theed", "thees", "theft", "their", "theme", "there", "therm", "these", "theta", "thick", "thief", "thigh", "thine", "thing", "think", "thins", "third", "thong", "thorn", "those", "thous", "three", "threw", "throb", "throe", "throw", "thrum", "thuds", "thugs", "thumb", "thump", "thyme", "tiara", "tibia", "ticks", "tidal", "tided", "tides", "tiers", "tiffs", "tiger", "tight", "tilde", "tiled", "tiler", "tiles", "tills", "tilts", "timed", "timer", "times", "timid", "tinge", "tings", "tinny", "tints", "tipsy", "titan", "titch", "tithe", "title", "titty", "tizzy", "toads", "toady", "toast", "today", "toddy", "toffs", "togas", "toils", "toked", "token", "tokes", "tolls", "tombs", "tomes", "tonal", "toned", "toner", "tones", "tongs", "tonic", "tonne", "tools", "tooth", "toots", "topaz", "topee", "topic", "toque", "torch", "torso", "torte", "torts", "torus", "total", "toted", "totem", "totes", "touch", "tough", "tours", "touts", "towed", "towel", "tower", "towns", "toxic", "toxin", "toyed", "trace", "track", "tract", "trade", "trail", "train", "trait", "tramp", "trams", "traps", "trash", "trawl", "trays", "tread", "treat", "treed", "trees", "treks", "trend", "tress", "trews", "triad", "trial", "tribe", "trice", "trick", "tried", "trier", "tries", "trike", "trill", "trims", "trios", "tripe", "trips", "trite", "troll", "tromp", "troop", "trope", "troth", "trots", "trout", "troys", "truce", "truck", "trued", "truer", "trues", "trugs", "truly", "trump", "trunk", "truss", "trust", "truth", "tryst", "tubae", "tubas", "tubby", "tubed", "tuber", "tubes", "tucks", "tufts", "tulip", "tulle", "tumid", "tummy", "tunas", "tuned", "tuner", "tunes", "tunic", "tunny", "tuque", "turbo", "turds", "turfs", "turns", "turps", "tusks", "tutor", "tutus", "tuxes", "twain", "twang", "twats", "tweak", "tweed", "tweet", "twerp", "twice", "twigs", "twill", "twine", "twins", "twirl", "twist", "twits", "twixt", "tying", "tykes", "typed", "types", "typos", "tyros", "udder", "ulcer", "ulnae", "ultra", "umbel", "umber", "umiak", "umped", "unbar", "uncle", "uncut", "under", "undid", "undue", "unfit", "unify", "union", "unite", "units", "unity", "unlit", "unman", "unmet", "unpin", "unsay", "unset", "untie", "until", "unwed", "unzip", "upend", "upped", "upper", "upset", "urban", "urged", "urges", "urine", "urned", "usage", "users", "usher", "using", "usual", "usurp", "usury", "uteri", "utter", "uvula", "vague", "vales", "valet", "valid", "value", "valve", "vamps", "vanes", "vapid", "vases", "vasts", "vault", "vaunt", "veals", "veeps", "veers", "vegan", "veges", "veils", "veins", "velar", "velds", "venal", "vends", "venom", "vents", "venue", "verbs", "verge", "verse", "verso", "verve", "vests", "vetch", "vexed", "vexes", "vials", "viand", "vibes", "vicar", "viced", "vices", "video", "views", "vigil", "viler", "villa", "vined", "vines", "vinyl", "viola", "viols", "viper", "viral", "vireo", "virus", "visas", "vised", "vises", "visit", "visor", "vista", "vital", "vivas", "vivid", "vixen", "vocal", "vodka", "vogue", "voice", "voids", "voile", "voled", "voles", "volts", "vomit", "voted", "voter", "votes", "vouch", "vowed", "vowel", "vulva", "vying", "wacko", "wacky", "waded", "wader", "wades", "wadge", "wadis", "wafer", "wafts", "waged", "wager", "wages", "waifs", "wails", "waist", "waits", "waive", "waked", "waken", "wakes", "waled", "wales", "walks", "walla", "walls", "wally", "waltz", "wands", "waned", "wanes", "wanks", "wanly", "wanna", "wants", "wards", "wares", "warms", "warns", "warps", "warts", "warty", "wases", "wasps", "waste", "watch", "water", "watts", "waved", "waver", "waves", "waxed", "waxen", "waxes", "wazoo", "weals", "weans", "wears", "weary", "weave", "wedge", "weeds", "weedy", "weeks", "weeny", "weeps", "weepy", "weest", "wefts", "weigh", "weird", "weirs", "welds", "wells", "welly", "welsh", "welts", "wench", "wends", "wests", "wetly", "whack", "whale", "whams", "wharf", "whats", "wheal", "wheat", "wheel", "whelk", "whelp", "whens", "where", "whets", "whews", "which", "whiff", "while", "whims", "whine", "whiny", "whips", "whirl", "whirs", "whisk", "whist", "white", "whits", "whole", "whoop", "whops", "whore", "whorl", "whose", "whups", "wicks", "widen", "wider", "widow", "width", "wield", "wight", "wilds", "wiled", "wiles", "wills", "willy", "wilts", "wimps", "wimpy", "wince", "winch", "winds", "windy", "wined", "wines", "wings", "winks", "winos", "wiped", "wiper", "wipes", "wired", "wires", "wised", "wiser", "wises", "wisps", "wispy", "witch", "withe", "withs", "witty", "wives", "wodge", "woken", "wolds", "wolfs", "woman", "wombs", "women", "wonks", "wonky", "woods", "woody", "wooed", "wooer", "woofs", "woozy", "words", "wordy", "works", "world", "worms", "wormy", "worry", "worse", "worst", "worth", "would", "wound", "woven", "wowed", "wrack", "wraps", "wrath", "wreak", "wreck", "wrens", "wrest", "wried", "wries", "wring", "wrist", "write", "writs", "wrong", "wrote", "wroth", "wrung", "wryer", "wryly", "xenon", "xerox", "xylem", "yacht", "yahoo", "yanks", "yards", "yarns", "yawed", "yawls", "yawns", "yeahs", "yearn", "years", "yeast", "yells", "yelps", "yeses", "yetis", "yield", "yikes", "yobbo", "yodel", "yogic", "yogis", "yoked", "yokel", "yokes", "yolks", "yonks", "young", "yours", "youth", "yowls", "yucca", "yucks", "yucky", "yukky", "yummy", "zappy", "zebra", "zebus", "zeros", "zests", "zilch", "zincs", "zines", "zings", "zingy", "zippy", "zonal", "zoned", "zones", "zooms" }; const char* w_6[] = { "abacus", "abased", "abases", "abated", "abates", "abbess", "abbeys", "abbots", "abduct", "abhors", "abides", "abject", "abjure", "ablaze", "ablest", "abloom", "aboard", "aboded", "abodes", "aborts", "abound", "abouts", "abrade", "abroad", "abrupt", "abseil", "absent", "absorb", "absurd", "abused", "abuser", "abuses", "acacia", "accede", "accent", "accept", "access", "accord", "accost", "accrue", "accuse", "acetic", "achier", "aching", "acidic", "acidly", "acorns", "acquit", "across", "acting", "action", "active", "actors", "actual", "acuity", "acumen", "acuter", "acutes", "adages", "adagio", "adapts", "addend", "adders", "addict", "adding", "addled", "addles", "adduce", "adepts", "adhere", "adieus", "adjoin", "adjure", "adjust", "admire", "admits", "adobes", "adopts", "adored", "adores", "adorns", "adrift", "adroit", "adults", "advent", "adverb", "advert", "advice", "advise", "aerate", "aerial", "aerier", "aeries", "affair", "affect", "affirm", "afford", "affray", "afghan", "afield", "aflame", "afloat", "afraid", "afresh", "afters", "agates", "ageism", "ageist", "agency", "agenda", "agents", "aghast", "agiler", "agleam", "agreed", "agrees", "ahchoo", "aiding", "ailing", "aiming", "airbag", "airbed", "airgun", "airier", "airily", "airing", "airman", "airmen", "airway", "aisled", "aisles", "akimbo", "alarms", "alases", "albeit", "albino", "albums", "alcove", "alders", "alerts", "alibis", "aliens", "alight", "aligns", "alkali", "allays", "allege", "alleys", "allied", "allies", "allots", "allows", "alloys", "allude", "allure", "almond", "almost", "alohas", "alpaca", "alphas", "alpine", "altars", "alters", "alumna", "alumni", "always", "amazed", "amazes", "amazon", "ambled", "ambles", "ambush", "amends", "amened", "amidst", "amigos", "amoeba", "amoral", "amount", "amours", "ampere", "amping", "ampler", "ampule", "amulet", "amused", "amuses", "anally", "analog", "anchor", "angels", "angers", "angina", "angled", "angler", "angles", "angora", "animal", "animus", "anions", "ankled", "ankles", "anklet", "annals", "anneal", "annexe", "annoys", "annual", "annuls", "anodes", "anoint", "anorak", "answer", "anthem", "anther", "antics", "anting", "antler", "anuses", "anvils", "anyhow", "anyone", "anyway", "aortas", "apathy", "apexes", "aphids", "apiary", "apiece", "aplomb", "apogee", "appeal", "appear", "append", "apples", "applet", "aprons", "aptest", "arable", "arcade", "arcane", "arched", "archer", "arches", "archly", "arcing", "arctic", "ardent", "arenas", "argosy", "argots", "argued", "argues", "argyle", "arider", "aright", "arisen", "arises", "armada", "armful", "armies", "arming", "armlet", "armpit", "aromas", "around", "arouse", "arrant", "arrays", "arrest", "arrive", "arrows", "arroyo", "arsing", "artery", "artful", "artier", "artist", "ascend", "ascent", "ascots", "ashcan", "ashier", "ashing", "ashore", "ashram", "asides", "asking", "aslant", "asleep", "aspect", "aspens", "aspics", "aspire", "assail", "assays", "assent", "assert", "assess", "assets", "assign", "assist", "assize", "assort", "assume", "assure", "astern", "asters", "asthma", "astral", "astray", "astute", "asylum", "atolls", "atomic", "atonal", "atoned", "atones", "atrium", "attach", "attack", "attain", "attend", "attest", "attics", "attire", "attune", "auburn", "audios", "audits", "augers", "aughts", "augurs", "augury", "august", "auntie", "author", "autism", "autoed", "autumn", "avails", "avasts", "avatar", "avenge", "avenue", "averse", "averts", "avians", "aviary", "avider", "avidly", "avoids", "avowal", "avowed", "awaits", "awaken", "awakes", "awards", "awarer", "aweigh", "awhile", "awning", "awoken", "axioms", "axises", "azalea", "azures", "baaing", "babble", "babels", "babied", "babier", "babies", "baboon", "backed", "backer", "backup", "badder", "baddie", "badger", "badges", "baffle", "bagels", "bagful", "bagged", "baggie", "bailed", "bailey", "bairns", "baited", "bakers", "bakery", "baking", "balded", "balder", "baldly", "baleen", "baling", "balked", "ballad", "balled", "ballet", "ballot", "ballsy", "balsam", "balsas", "bamboo", "banana", "banded", "bandit", "banged", "banger", "bangle", "baning", "banish", "banjos", "banked", "banker", "banned", "banner", "bantam", "banter", "banyan", "baobab", "barbed", "barber", "barbie", "barely", "barest", "barfed", "barfly", "barged", "barges", "baring", "barium", "barked", "barker", "barley", "barman", "barmen", "barney", "barons", "barony", "barred", "barrel", "barren", "barrio", "barrow", "barter", "basalt", "basely", "basest", "bashed", "bashes", "basics", "basing", "basins", "basked", "basket", "basque", "basses", "basset", "bassos", "basted", "bastes", "bathed", "bather", "bathes", "bathos", "batiks", "bating", "batman", "batmen", "batons", "batted", "batten", "batter", "battle", "bauble", "baulks", "bawled", "baying", "bayous", "bazaar", "beacon", "beaded", "beagle", "beaked", "beaker", "beamed", "beaned", "beanie", "beards", "bearer", "beasts", "beaten", "beater", "beauts", "beauty", "beaver", "bebops", "becalm", "became", "beckon", "become", "bedaub", "bedbug", "bedded", "bedder", "bedeck", "bedlam", "bedpan", "bedsit", "beefed", "beeped", "beeper", "beetle", "beeves", "befall", "befell", "befits", "befogs", "before", "befoul", "begets", "beggar", "begged", "begins", "begone", "begums", "behalf", "behave", "behead", "beheld", "behest", "behind", "behold", "beings", "belays", "belfry", "belied", "belief", "belies", "belled", "belles", "bellow", "belong", "belows", "belted", "bemoan", "bemuse", "bender", "benign", "benumb", "berate", "bereft", "berets", "berths", "beryls", "besets", "beside", "besoms", "besots", "bested", "bestir", "bestow", "betake", "betcha", "betide", "betook", "betray", "better", "bettor", "bevels", "bevies", "bewail", "beware", "beyond", "biased", "biases", "bibles", "bicarb", "biceps", "bicker", "bidden", "bidder", "bidets", "biding", "biffed", "bigamy", "bigger", "biggie", "bights", "bigots", "bigwig", "bikers", "biking", "bikini", "bilges", "bilked", "billed", "billet", "billow", "bimbos", "binary", "binder", "binged", "binges", "binman", "binmen", "binned", "bionic", "biopic", "biopsy", "bipeds", "birded", "birdie", "births", "bisect", "bishop", "bisque", "bistro", "bitchy", "biting", "bitmap", "bitten", "bitter", "blacks", "bladed", "blades", "blahed", "blamed", "blamer", "blames", "blanch", "blanks", "blared", "blares", "blasts", "blazed", "blazer", "blazes", "blazon", "bleach", "bleary", "bleats", "bleeds", "bleeps", "blench", "blends", "blight", "blimey", "blimps", "blinds", "blinks", "blintz", "blithe", "bloats", "blocks", "blokes", "blonds", "bloods", "bloody", "blooms", "blotch", "blotto", "blouse", "blower", "blowup", "blowzy", "bluest", "bluesy", "bluffs", "bluing", "bluish", "blunts", "blurbs", "blurry", "blurts", "boards", "boasts", "boated", "boater", "bobbed", "bobbin", "bobble", "bobcat", "bodega", "bodged", "bodges", "bodice", "bodies", "bodily", "boding", "bodkin", "boffin", "bogeys", "bogged", "boggle", "boiled", "boiler", "bolder", "boldly", "bolero", "bolled", "bolshy", "bolted", "bombed", "bomber", "bonbon", "bonces", "bonded", "boners", "bonged", "bongos", "bonier", "boning", "bonito", "bonked", "bonnet", "bonnie", "bonsai", "boobed", "boodle", "booger", "boogie", "boohoo", "booing", "booked", "bookie", "boomed", "boomer", "boosts", "booted", "bootee", "booths", "boozed", "boozer", "boozes", "bopped", "border", "borers", "boring", "borrow", "bosoms", "bosomy", "bossed", "bosser", "bosses", "botany", "bother", "bottle", "bottom", "boughs", "bought", "boules", "bounce", "bouncy", "bounds", "bounty", "bovine", "bovver", "bowels", "bowers", "bowing", "bowled", "bowler", "bowman", "bowmen", "boxcar", "boxers", "boxing", "boyish", "braced", "braces", "bracts", "braids", "brains", "brainy", "braise", "braked", "brakes", "branch", "brands", "brandy", "brassy", "bratty", "braved", "braver", "braves", "bravos", "brawls", "brawny", "brayed", "brazen", "breach", "breads", "breaks", "breams", "breast", "breath", "breded", "bredes", "breech", "breeds", "breeze", "breezy", "brewed", "brewer", "bribed", "bribes", "bricks", "bridal", "brides", "bridge", "bridle", "briefs", "briers", "bright", "brings", "brinks", "brisks", "broach", "broads", "brogan", "brogue", "broils", "broken", "broker", "brolly", "bronco", "bronze", "brooch", "broods", "broody", "brooks", "brooms", "broths", "browns", "browse", "bruins", "bruise", "bruits", "brunch", "brunet", "brunts", "brutal", "brutes", "bubble", "bubbly", "bucked", "bucket", "buckle", "budded", "budged", "budges", "budget", "budgie", "buffed", "buffer", "buffet", "bugged", "bugger", "bugled", "bugler", "bugles", "builds", "bulbed", "bulged", "bulges", "bulked", "bulled", "bullet", "bumbag", "bumble", "bummed", "bummer", "bumped", "bumper", "bundle", "bunged", "bungee", "bungle", "bunion", "bunked", "bunker", "bunkum", "bunted", "buoyed", "burble", "burden", "bureau", "burger", "burghs", "burgle", "burial", "buried", "buries", "burlap", "burned", "burner", "burped", "burred", "burros", "burrow", "bursar", "bursts", "busboy", "bushed", "bushel", "bushes", "busied", "busier", "busies", "busily", "busing", "busked", "busker", "bussed", "busted", "buster", "bustle", "butane", "butler", "butted", "butter", "buttes", "button", "buyers", "buying", "buyout", "buzzed", "buzzer", "buzzes", "bygone", "bylaws", "byline", "bypass", "byplay", "byways", "byword", "cabals", "cabana", "cabbed", "cabers", "cabins", "cabled", "cables", "cacaos", "cached", "caches", "cachet", "cackle", "cactus", "cadets", "cadged", "cadger", "cadges", "cadres", "caftan", "cagier", "cagily", "caging", "cahoot", "cairns", "cajole", "caking", "calico", "caliph", "called", "caller", "callow", "callus", "calmed", "calmer", "calmly", "calved", "calves", "camber", "camels", "cameos", "camera", "camped", "camper", "campus", "canals", "canard", "canary", "cancan", "cancel", "cancer", "candid", "candle", "canine", "caning", "canker", "canned", "cannon", "cannot", "canoed", "canoes", "canons", "canopy", "canted", "canter", "canton", "cantor", "cantos", "canvas", "canyon", "capers", "caplet", "capons", "capped", "captor", "carafe", "carats", "carbon", "carboy", "carded", "careen", "career", "carers", "caress", "carets", "carhop", "caries", "caring", "carnal", "carobs", "carols", "caroms", "carpal", "carped", "carpel", "carpet", "carpus", "carrel", "carrot", "carted", "cartel", "carter", "carton", "carved", "carver", "carves", "casein", "cashed", "cashes", "cashew", "casing", "casino", "casket", "cassia", "casted", "caster", "castes", "castle", "casual", "catchy", "caters", "catgut", "cation", "catkin", "catnap", "catnip", "cattle", "caucus", "caudal", "caught", "caulks", "causal", "caused", "causes", "caveat", "cavern", "cavers", "caviar", "cavils", "caving", "cavity", "cavort", "cawing", "cayman", "ceased", "ceases", "cedars", "ceding", "celebs", "celery", "cellar", "celled", "cellos", "cement", "censer", "censor", "census", "cereal", "cerise", "cervix", "chafed", "chafes", "chaffs", "chains", "chairs", "chaise", "chalet", "chalks", "chalky", "champs", "chance", "chancy", "change", "chants", "chapel", "chappy", "charge", "charms", "charts", "chased", "chaser", "chases", "chasms", "chaste", "chatty", "cheapo", "cheats", "cheeks", "cheeky", "cheeps", "cheers", "cheery", "cheese", "cheesy", "cherry", "cherub", "chests", "chesty", "chewed", "chewer", "chicer", "chichi", "chicks", "chicle", "chided", "chides", "chiefs", "chills", "chilly", "chimed", "chimes", "chimps", "chinks", "chinos", "chintz", "chippy", "chirps", "chirpy", "chisel", "chitin", "chived", "chives", "chivvy", "chocks", "choice", "choirs", "choked", "choker", "chokes", "choler", "chomps", "choose", "choosy", "choppy", "choral", "chords", "chored", "chores", "chorus", "chosen", "chowed", "chrome", "chubby", "chucks", "chummy", "chumps", "chunks", "chunky", "church", "churls", "churns", "chutes", "cicada", "ciders", "cigars", "cilium", "cinder", "cinema", "cipher", "circle", "circus", "cirrus", "cities", "citing", "citric", "citron", "citrus", "civets", "civics", "clacks", "claims", "clammy", "clamps", "clangs", "clanks", "claret", "clasps", "classy", "clause", "clawed", "clayey", "cleans", "clears", "cleats", "cleave", "clefts", "clench", "clergy", "cleric", "clerks", "clever", "clewed", "clicks", "client", "cliffs", "climax", "climbs", "climes", "clinch", "clings", "clingy", "clinic", "clinks", "clique", "cloaks", "cloche", "clocks", "clomps", "cloned", "clones", "clonks", "closed", "closer", "closes", "closet", "clothe", "cloths", "clouds", "cloudy", "clouts", "cloven", "clover", "cloves", "clowns", "cloyed", "clucks", "cluing", "clumps", "clumpy", "clumsy", "clunks", "clunky", "clutch", "coaled", "coarse", "coasts", "coated", "coater", "coaxed", "coaxes", "cobalt", "cobbed", "cobber", "cobble", "cobnut", "cobras", "cobweb", "coccis", "coccus", "coccyx", "cocked", "cockle", "cocoas", "cocoon", "codded", "coddle", "codger", "codify", "coding", "coerce", "coeval", "coffee", "coffer", "coffin", "cogent", "cognac", "cohere", "cohort", "coiled", "coined", "coital", "coitus", "coking", "colder", "coldly", "coleys", "collar", "collie", "colons", "colony", "column", "combat", "combed", "combos", "comedy", "comely", "comers", "comets", "comics", "coming", "comity", "commas", "commie", "commit", "common", "compel", "comply", "conchs", "concur", "condom", "condor", "condos", "confab", "confer", "congas", "conger", "conics", "conies", "coning", "conked", "conker", "conned", "consul", "convex", "convey", "convoy", "cooing", "cooked", "cooker", "cookie", "cooled", "cooler", "coolie", "coolly", "cooped", "cooper", "cootie", "copied", "copier", "copies", "coping", "copped", "copper", "copsed", "copses", "copter", "copula", "corals", "corded", "cordon", "corgis", "coring", "corked", "corker", "cornea", "corned", "corner", "cornet", "corona", "corpse", "corpus", "corral", "corrie", "corset", "cortex", "coshed", "coshes", "cosign", "cosily", "cosine", "cosmic", "cosmos", "cosset", "costar", "costly", "coting", "cotted", "cotter", "cotton", "cougar", "coughs", "coulis", "counts", "county", "couped", "coupes", "couple", "coupon", "course", "courts", "cousin", "covens", "covers", "covert", "covets", "coveys", "coward", "cowboy", "cowers", "cowing", "cowpat", "cowpox", "cowrie", "coxing", "coyest", "coyote", "coypus", "cozens", "cozily", "crabby", "cracks", "cradle", "crafts", "crafty", "craggy", "cramps", "craned", "cranes", "cranks", "cranky", "cranny", "crapes", "crappy", "crated", "crater", "crates", "cravat", "craved", "craven", "craves", "crawls", "crayon", "crazed", "crazes", "creaks", "creaky", "creams", "creamy", "crease", "create", "credit", "credos", "creeds", "creeks", "creels", "creeps", "creepy", "creole", "crepes", "crests", "cretin", "crewed", "cricks", "criers", "crikey", "crimed", "crimes", "crimps", "cringe", "cripes", "crises", "crisis", "crisps", "crispy", "critic", "croaks", "crocks", "crocus", "crofts", "crones", "crooks", "croons", "crotch", "crouch", "croups", "croupy", "crowds", "crowed", "crowns", "cruddy", "cruder", "cruels", "cruets", "cruise", "crumbs", "crumby", "crummy", "crunch", "crusts", "crusty", "crutch", "cruxes", "crying", "crypts", "cubing", "cubism", "cubist", "cubits", "cuboid", "cuckoo", "cuddle", "cuddly", "cudgel", "cuffed", "culled", "cumuli", "cupful", "cupids", "cupola", "cuppas", "cupped", "curacy", "curate", "curdle", "curfew", "curies", "curing", "curios", "curled", "curler", "curlew", "curred", "cursed", "curses", "cursor", "curter", "curtly", "curtsy", "curved", "curves", "cuspid", "cussed", "cusses", "custom", "cutely", "cutest", "cutesy", "cuteys", "cuties", "cutlet", "cutoff", "cutout", "cutter", "cutups", "cyborg", "cycled", "cycles", "cyclic", "cygnet", "cymbal", "cynics", "cypher", "cystic", "dabbed", "dabble", "dachas", "dactyl", "dadoes", "daemon", "dafter", "dagger", "dagoes", "dahlia", "dainty", "daises", "damage", "damask", "dammed", "dammit", "damned", "damped", "dampen", "damper", "damply", "damsel", "damson", "danced", "dancer", "dances", "dander", "dandle", "danger", "dangle", "danker", "dankly", "dapper", "dapple", "daring", "darken", "darker", "darkie", "darkly", "darned", "darted", "dashed", "dashes", "dating", "dative", "datums", "daubed", "dauber", "daunts", "davits", "dawdle", "dawned", "daybed", "dazing", "dazzle", "deacon", "deaden", "deader", "deadly", "deafen", "deafer", "dealer", "deaned", "dearer", "dearly", "dearth", "deaths", "deaves", "debark", "debars", "debase", "debate", "debits", "debris", "debtor", "debugs", "debunk", "debuts", "decade", "decaff", "decafs", "decals", "decamp", "decant", "decays", "deceit", "decent", "decide", "decked", "decode", "decors", "decoys", "decree", "deduce", "deduct", "deeded", "deejay", "deemed", "deepen", "deeper", "deeply", "deface", "defame", "defeat", "defect", "defend", "defers", "defied", "defies", "defile", "define", "defogs", "deform", "defray", "defter", "deftly", "defuse", "degree", "deiced", "deicer", "deices", "deigns", "deject", "delays", "delete", "deltas", "delude", "deluge", "deluxe", "delved", "delves", "demand", "demean", "demise", "demist", "demobs", "demoed", "demons", "demote", "demure", "demurs", "denial", "denied", "denier", "denies", "denims", "denote", "denser", "dental", "dented", "dentin", "denude", "depart", "depend", "depict", "deploy", "deport", "depose", "depots", "depths", "depute", "deputy", "derail", "deride", "derive", "dermis", "descry", "desert", "design", "desire", "desist", "despot", "detach", "detail", "detain", "detect", "deters", "detest", "detour", "deuced", "deuces", "device", "devils", "devise", "devoid", "devote", "devour", "devout", "dewier", "dewlap", "dhotis", "diadem", "diaper", "diatom", "dibble", "dicier", "dicing", "dicker", "dickey", "dictum", "diddle", "diddly", "dieing", "diesel", "dieted", "dieter", "differ", "digest", "digger", "digits", "diktat", "dilate", "dildos", "dilled", "dilute", "dimmed", "dimmer", "dimple", "dimwit", "dinars", "diners", "dinged", "dinghy", "dining", "dinned", "dinner", "diodes", "dioxin", "dipole", "dipped", "dipper", "dipsos", "direct", "direst", "dirges", "disarm", "disbar", "discos", "discus", "dished", "dishes", "dismal", "dismay", "disown", "dispel", "dissed", "disses", "disuse", "dither", "dittos", "divans", "divers", "divert", "divest", "divide", "divine", "diving", "divots", "doable", "dobbed", "docent", "docile", "docked", "docker", "docket", "doctor", "dodder", "doddle", "dodged", "dodgem", "dodger", "dodges", "doffed", "dogged", "dogies", "dogleg", "dogmas", "doings", "doling", "dollar", "dolled", "dollop", "dolmen", "domain", "doming", "domino", "donate", "donkey", "donned", "donors", "doodad", "doodah", "doodle", "doomed", "doored", "dopier", "doping", "dories", "dormer", "dorsal", "dosage", "dosing", "dossed", "dosser", "dotage", "doting", "dotted", "double", "doubly", "doubts", "douche", "doughy", "dourer", "dourly", "doused", "douses", "dovish", "dowels", "downed", "downer", "dowsed", "dowser", "dowses", "doyens", "dozens", "dozier", "dozily", "dozing", "drably", "dragon", "drains", "drakes", "dramas", "draped", "draper", "drapes", "drawer", "drawls", "dreads", "dreams", "dreamy", "dreary", "dredge", "drench", "dressy", "driers", "driest", "drifts", "drills", "drinks", "drippy", "drivel", "driven", "driver", "drives", "drolly", "droned", "drones", "drools", "droops", "droopy", "dropsy", "drover", "droves", "drowns", "drowse", "drowsy", "drudge", "druids", "drunks", "dryads", "dryers", "drying", "dubbed", "dubbin", "ducats", "ducked", "duding", "duffed", "duffer", "dugout", "duking", "dulcet", "dulled", "duller", "dumbed", "dumber", "dumbly", "dumbos", "dumped", "dumper", "dunces", "dunged", "dunked", "dunned", "dunner", "duping", "duplex", "duress", "during", "dusted", "duster", "duties", "duvets", "dwarfs", "dweebs", "dwells", "dyadic", "dyeing", "dynamo", "eagles", "eaglet", "earful", "earned", "earner", "earths", "earthy", "earwax", "earwig", "easels", "easier", "easies", "easily", "easing", "eaters", "eatery", "eating", "ebbing", "echoed", "echoes", "eczema", "eddied", "eddies", "edgier", "edgily", "edging", "edible", "edicts", "edited", "editor", "eerier", "eerily", "efface", "effect", "effete", "effigy", "effing", "effort", "eggcup", "egging", "eggnog", "egoism", "egoist", "egress", "egrets", "eiders", "eighth", "eights", "eighty", "either", "ejects", "elapse", "elated", "elates", "elbows", "elders", "eldest", "elects", "eleven", "elfish", "elicit", "elided", "elides", "elites", "elixir", "eloped", "elopes", "eluded", "eludes", "emails", "embalm", "embark", "embeds", "embers", "emblem", "embody", "emboss", "embryo", "emceed", "emcees", "emends", "emerge", "emetic", "emoted", "emotes", "empire", "employ", "enable", "enacts", "enamel", "encamp", "encase", "encode", "encore", "endear", "ending", "endive", "endows", "endued", "endues", "endure", "enemas", "energy", "enfold", "engage", "engine", "engulf", "enigma", "enjoin", "enjoys", "enlist", "enmesh", "enmity", "enough", "enrage", "enrich", "ensign", "ensued", "ensues", "ensure", "entail", "enters", "entice", "entire", "entity", "entomb", "entrap", "envied", "envies", "envoys", "enzyme", "epochs", "equals", "equate", "equine", "equips", "equity", "erased", "eraser", "erases", "erects", "ermine", "eroded", "erodes", "erotic", "errand", "errant", "errata", "erring", "errors", "ersatz", "erupts", "escape", "eschew", "escort", "escrow", "escudo", "espied", "espies", "essays", "estate", "esteem", "esters", "etched", "etcher", "etches", "ethics", "ethnic", "eulogy", "eunuch", "eureka", "evaded", "evades", "evened", "evener", "evenly", "events", "evicts", "evilly", "evince", "evoked", "evokes", "evolve", "exacts", "exalts", "exceed", "excels", "except", "excess", "excise", "excite", "excuse", "exempt", "exerts", "exeunt", "exhale", "exhort", "exhume", "exiled", "exiles", "exists", "exited", "exodus", "exotic", "expand", "expats", "expect", "expels", "expend", "expert", "expire", "expiry", "export", "expose", "extant", "extend", "extent", "extols", "extort", "extras", "exuded", "exudes", "exults", "eyeful", "eyelet", "eyelid", "fabled", "fables", "fabric", "facade", "facets", "facial", "facile", "facing", "factor", "fading", "faffed", "fagged", "failed", "fained", "fainer", "faints", "fairer", "fairly", "faiths", "fakers", "faking", "fakirs", "falcon", "fallen", "fallow", "falser", "falsie", "falter", "family", "famine", "famish", "famous", "fanned", "farces", "farina", "faring", "farmed", "farmer", "farrow", "farted", "fascia", "fasted", "fasten", "faster", "father", "fathom", "fating", "fatsos", "fatten", "fatter", "fatwas", "faucet", "faults", "faulty", "faunas", "fawned", "faxing", "fazing", "fealty", "feared", "feasts", "fecund", "fedora", "feeble", "feebly", "feeder", "feeler", "feigns", "feints", "feisty", "feline", "fellas", "felled", "feller", "fellow", "felons", "felony", "felted", "female", "femurs", "fenced", "fencer", "fences", "fended", "fender", "fennel", "ferret", "ferric", "fervid", "fessed", "fesses", "festal", "fester", "feting", "fetish", "fetter", "fettle", "feudal", "feuded", "fevers", "fewest", "fezzes", "fiasco", "fibbed", "fibber", "fibula", "fiches", "fickle", "fiddle", "fiddly", "fidget", "fields", "fiends", "fierce", "fiesta", "fifths", "figged", "fights", "figure", "filial", "filing", "filled", "filler", "fillet", "fillip", "filmed", "filter", "filthy", "finale", "finals", "finder", "finely", "finery", "finest", "finger", "fining", "finish", "finite", "finked", "finner", "firing", "firmed", "firmer", "firmly", "firsts", "firths", "fiscal", "fished", "fisher", "fishes", "fitful", "fitted", "fitter", "fivers", "fixate", "fixers", "fixing", "fixity", "fizzed", "fizzes", "fizzle", "fjords", "flabby", "flacks", "flagon", "flails", "flairs", "flaked", "flakes", "flamed", "flames", "flange", "flanks", "flared", "flares", "flashy", "flasks", "flatly", "flaunt", "flawed", "flaxen", "flayed", "flecks", "fleece", "fleecy", "fleets", "fleshy", "flexed", "flexes", "flicks", "fliers", "fliest", "flight", "flimsy", "flinch", "flings", "flints", "flinty", "flirts", "flirty", "floats", "flocks", "floods", "floors", "floozy", "floppy", "floral", "floras", "floret", "florid", "florin", "flours", "floury", "flouts", "flowed", "flower", "fluent", "fluffs", "fluffy", "fluids", "fluked", "flukes", "flumes", "flunks", "flunky", "flurry", "fluted", "flutes", "fluxed", "fluxes", "flybys", "flying", "foaled", "foamed", "fobbed", "fodder", "foetid", "fogged", "foible", "foiled", "foists", "folded", "folder", "folios", "folksy", "follow", "foment", "fonded", "fonder", "fondle", "fondly", "fondue", "foodie", "fooled", "footed", "footer", "footie", "fopped", "forage", "forays", "forbid", "forced", "forces", "forded", "forest", "forged", "forger", "forges", "forget", "forgot", "forked", "formal", "format", "formed", "former", "fortes", "forums", "fossil", "foster", "fought", "fouled", "fouler", "foully", "founds", "founts", "fourth", "fowled", "foxier", "foxing", "foyers", "fracas", "framed", "framer", "frames", "francs", "franks", "frauds", "frayed", "freaks", "freaky", "freely", "freest", "freeze", "french", "frenzy", "fresco", "friars", "friary", "fridge", "friend", "frieze", "fright", "frigid", "frills", "frilly", "fringe", "frisks", "frisky", "frizzy", "frocks", "frolic", "fronds", "fronts", "frosts", "frosty", "froths", "frothy", "frowns", "frowzy", "frozen", "frugal", "fruits", "fruity", "frumps", "frumpy", "fryers", "frying", "fucked", "fucker", "fuddle", "fudged", "fudges", "fugues", "fulled", "fuller", "fumble", "fuming", "funded", "fungal", "fungus", "funked", "funnel", "funner", "furies", "furled", "furore", "furors", "furred", "furrow", "fusing", "fusion", "fussed", "fusses", "futile", "futons", "future", "futzed", "futzes", "fuzzed", "fuzzes", "gabbed", "gabble", "gabled", "gables", "gadded", "gadfly", "gadget", "gaffed", "gaffer", "gaffes", "gagged", "gaggle", "gaiety", "gained", "gainer", "gaiter", "galaxy", "galena", "galled", "galley", "gallon", "gallop", "galore", "galosh", "gambit", "gamble", "gambol", "gamely", "gamest", "gamete", "gamier", "gamine", "gaming", "gamins", "gammas", "gammon", "gamuts", "gander", "ganged", "gannet", "gantry", "gaoled", "gaoler", "gaping", "garage", "garbed", "garble", "garden", "gargle", "garish", "garlic", "garner", "garnet", "garret", "garter", "gasbag", "gashed", "gashes", "gasket", "gasman", "gasmen", "gasped", "gassed", "gateau", "gather", "gating", "gators", "gauche", "gaucho", "gaunts", "gavels", "gawked", "gawped", "gayest", "gazebo", "gazers", "gazing", "gazump", "geared", "geckos", "geddit", "geeing", "geezer", "geisha", "gelded", "gelled", "gender", "genera", "genial", "genies", "genius", "genned", "genome", "genres", "gentle", "gently", "gentry", "geodes", "gerbil", "gerund", "gewgaw", "geyser", "ghetto", "ghosts", "ghouls", "giants", "gibber", "gibbet", "gibbon", "gibing", "giblet", "gifted", "gigged", "giggle", "giggly", "gigolo", "gilded", "gillie", "gimlet", "ginger", "ginkgo", "ginned", "girded", "girder", "girdle", "girlie", "girted", "girths", "givens", "givers", "giving", "glades", "gladly", "glance", "glands", "glared", "glares", "glassy", "glazed", "glazes", "gleams", "gleans", "glibly", "glided", "glider", "glides", "glints", "glitch", "glitzy", "gloats", "global", "globed", "globes", "gloomy", "glossy", "gloved", "gloves", "glowed", "glower", "gluier", "gluing", "glumly", "gluten", "gnarls", "gnarly", "gnawed", "gneiss", "gnomes", "gnomic", "goaded", "goaled", "goalie", "goatee", "gobbed", "gobbet", "gobble", "goblet", "goblin", "godson", "gofers", "goggle", "goings", "golden", "golder", "golfed", "golfer", "gonads", "goners", "gonged", "goober", "goodly", "goofed", "googly", "gooier", "goosed", "gooses", "gopher", "gorged", "gorges", "gorgon", "gorier", "goring", "goshes", "gospel", "gossip", "gotcha", "gotten", "gouged", "gouger", "gouges", "gourds", "govern", "gowned", "grabby", "graced", "graces", "graded", "grader", "grades", "grafts", "grains", "grainy", "gramme", "grands", "grange", "granny", "grants", "graped", "grapes", "graphs", "grasps", "grassy", "grated", "grater", "grates", "gratin", "gratis", "graved", "gravel", "graven", "graver", "graves", "grazed", "grazes", "grease", "greasy", "greats", "grebes", "greedy", "greens", "greets", "griefs", "grieve", "grille", "grills", "grimed", "grimes", "grimly", "grinds", "gringo", "griped", "gripes", "grippe", "grisly", "gritty", "groans", "grocer", "groggy", "groins", "grooms", "groove", "groovy", "groped", "gropes", "grotto", "grotty", "grouch", "ground", "groups", "grouse", "grouts", "grovel", "groves", "grower", "growls", "growth", "groyne", "grubby", "grudge", "gruels", "gruffs", "grumps", "grumpy", "grunge", "grungy", "grunts", "guards", "guavas", "guests", "guffaw", "guided", "guides", "guilds", "guiled", "guiles", "guilty", "guinea", "guises", "guitar", "gulags", "gulled", "gullet", "gulped", "gumbos", "gummed", "gunman", "gunmen", "gunned", "gunner", "gurgle", "gurney", "gushed", "gusher", "gushes", "gusset", "gusted", "gutted", "gutter", "guvnor", "guying", "guzzle", "gypped", "gypsum", "gyrate", "habits", "hacked", "hacker", "hackle", "hading", "hagged", "haggis", "haggle", "hailed", "hairdo", "haired", "hajjes", "halest", "haling", "hallos", "hallow", "haloed", "halted", "halter", "halved", "halves", "hamlet", "hammed", "hammer", "hamper", "handed", "handle", "hangar", "hanged", "hanger", "hanker", "hankie", "hansom", "happen", "harass", "harden", "harder", "hardly", "harems", "haring", "harked", "harlot", "harmed", "harped", "harrow", "hashed", "hashes", "hassle", "hasted", "hasten", "hastes", "hatbox", "haters", "hating", "hatpin", "hatred", "hatted", "hatter", "hauled", "hauler", "haunch", "haunts", "havens", "having", "hawing", "hawked", "hawker", "hawser", "haying", "haymow", "hazard", "hazels", "hazier", "hazily", "hazing", "headed", "header", "healed", "healer", "health", "heaped", "hearer", "hearse", "hearth", "hearts", "hearty", "heated", "heater", "heaths", "heaved", "heaven", "heaves", "heckle", "hectic", "hector", "hedged", "hedges", "heeded", "heehaw", "heeled", "hefted", "heifer", "height", "heists", "helium", "hellos", "helmet", "helots", "helped", "helper", "hemmed", "hempen", "hences", "hennas", "hepper", "herald", "herbal", "herded", "hereby", "herein", "hereof", "heresy", "hereto", "hermit", "hernia", "heroes", "heroic", "heroin", "herons", "herpes", "hetero", "hewers", "hewing", "hexing", "heyday", "hiatus", "hickey", "hidden", "hiding", "hieing", "higher", "highly", "hijack", "hikers", "hiking", "hinder", "hinged", "hinges", "hinted", "hipped", "hipper", "hippie", "hippos", "hiring", "hissed", "hisses", "hither", "hitter", "hiving", "hoards", "hoarse", "hoaxed", "hoaxer", "hoaxes", "hobbit", "hobble", "hobnob", "hoboed", "hocked", "hockey", "hoeing", "hogans", "hogged", "hoicks", "hoists", "hokier", "holder", "holdup", "holier", "holing", "holism", "holler", "hollow", "homage", "homely", "homers", "homeys", "homier", "homily", "homing", "hominy", "honcho", "honest", "honeys", "honing", "honked", "hooded", "hoodoo", "hoofed", "hoofer", "hookah", "hooked", "hooker", "hookup", "hooped", "hoopla", "hooray", "hooted", "hooter", "hoover", "hooves", "hoping", "hopped", "hopper", "horded", "hordes", "horned", "hornet", "horrid", "horror", "horsed", "horses", "horsey", "hosing", "hosted", "hostel", "hotbed", "hotels", "hotpot", "hotted", "hotter", "hounds", "hourly", "housed", "houses", "hovels", "hovers", "howdah", "howled", "howler", "hubbub", "hubcap", "hubris", "huddle", "huffed", "hugely", "hugest", "hugged", "hugger", "hulaed", "hulled", "hullos", "humane", "humans", "humble", "humbly", "humbug", "humeri", "hummed", "hummus", "humped", "hunger", "hungry", "hunker", "hunted", "hunter", "hurdle", "hurled", "hurler", "hurtle", "hushed", "hushes", "husked", "husker", "hussar", "hustle", "hybrid", "hydras", "hyenas", "hymens", "hymnal", "hymned", "hyphen", "hyping", "iambic", "ibexes", "ibises", "icebox", "icecap", "icicle", "iciest", "icings", "ickier", "iconic", "ideals", "idiocy", "idioms", "idiots", "idlers", "idlest", "idling", "idylls", "iffier", "igloos", "ignite", "ignore", "iguana", "imaged", "images", "imbibe", "imbued", "imbues", "immune", "immure", "impact", "impair", "impala", "impale", "impart", "impede", "impels", "impend", "impish", "import", "impose", "impugn", "impure", "impute", "inaner", "inborn", "inbred", "incest", "inched", "inches", "incise", "incite", "income", "incurs", "indeed", "indent", "indict", "indies", "indigo", "indoor", "induce", "induct", "inerts", "infamy", "infant", "infect", "infers", "infest", "infill", "infirm", "inflow", "influx", "inform", "infuse", "ingest", "ingots", "inhale", "inhere", "inject", "injure", "injury", "inkier", "inking", "inlaid", "inland", "inlays", "inlets", "inmate", "inmost", "innate", "inners", "inning", "inputs", "inroad", "insane", "inseam", "insect", "insert", "insets", "inside", "insist", "insole", "instep", "insult", "insure", "intact", "intake", "intend", "intent", "intern", "inters", "intone", "intros", "intuit", "inured", "inures", "invade", "invent", "invert", "invest", "invite", "invoke", "inward", "iodine", "ipecac", "irater", "irises", "irking", "ironed", "ironic", "island", "islets", "isobar", "issued", "issues", "italic", "itched", "itches", "itself", "jabbed", "jabber", "jabots", "jackal", "jacked", "jacket", "jading", "jagged", "jaguar", "jailed", "jailer", "jalopy", "jambed", "jammed", "jangle", "japans", "japing", "jargon", "jarred", "jasper", "jaunts", "jaunty", "jawing", "jazzed", "jazzes", "jeered", "jejune", "jelled", "jerked", "jerkin", "jersey", "jested", "jester", "jetsam", "jetted", "jewels", "jibbed", "jigged", "jigger", "jiggle", "jigsaw", "jihads", "jilted", "jingle", "jinked", "jinxed", "jinxes", "jitney", "jiving", "jobbed", "jobber", "jocked", "jockey", "jocose", "jocund", "jogged", "jogger", "joggle", "johnny", "joined", "joiner", "joints", "joists", "jojoba", "jokers", "jokier", "joking", "jolted", "joshed", "joshes", "jostle", "jotted", "jotter", "joules", "jounce", "journo", "jousts", "jovial", "joyful", "joying", "joyous", "judder", "judged", "judges", "jugful", "jugged", "juggle", "juiced", "juicer", "juices", "jujube", "juleps", "jumble", "jumbos", "jumped", "jumper", "juncos", "jungle", "junior", "junked", "junker", "junket", "junkie", "juntas", "juries", "jurist", "jurors", "juster", "justly", "jutted", "kabobs", "kaboom", "kabuki", "kaolin", "karate", "karats", "kayaks", "kazoos", "kebabs", "keeled", "keened", "keener", "keenly", "keeper", "kegged", "kelvin", "kenned", "kennel", "kernel", "kettle", "keying", "keypad", "khakis", "kibitz", "kibosh", "kicked", "kicker", "kidded", "kidder", "kiddie", "kiddos", "kidnap", "kidney", "killed", "killer", "kilned", "kilted", "kilter", "kimono", "kinder", "kindle", "kindly", "kingly", "kinked", "kiosks", "kipped", "kipper", "kirked", "kirsch", "kismet", "kissed", "kisser", "kisses", "kithed", "kiting", "kitsch", "kitted", "kitten", "klaxon", "klutzy", "knacks", "knaves", "kneads", "kneels", "knells", "knifed", "knifes", "knight", "knives", "knobby", "knocks", "knolls", "knotty", "koalas", "kooked", "kopeck", "kosher", "kowtow", "kroner", "kronor", "kudzus", "kvetch", "labels", "labial", "labium", "lacier", "lacing", "lacked", "lackey", "lactic", "lacuna", "ladder", "laddie", "ladies", "lading", "ladled", "ladles", "lagers", "lagged", "lagoon", "lairds", "laking", "lambda", "lambed", "lamely", "lament", "lamest", "laming", "lammed", "lammer", "lanced", "lancer", "lances", "lancet", "landed", "lander", "lanker", "lapdog", "lapels", "lapped", "lapsed", "lapses", "laptop", "larded", "larder", "larger", "larges", "largos", "lariat", "larked", "larvae", "larval", "larynx", "lasers", "lashed", "lashes", "lasses", "lassie", "lassos", "lasted", "lastly", "lately", "latent", "latest", "lathed", "lather", "lathes", "latter", "lattes", "lauded", "laughs", "launch", "laurel", "lavish", "lawful", "lawman", "lawmen", "lawyer", "laxest", "laxity", "layers", "laying", "layman", "laymen", "layoff", "layout", "lazied", "lazier", "lazies", "lazily", "lazing", "leaded", "leaden", "leader", "leafed", "league", "leaked", "leaned", "leaner", "leaped", "learns", "leased", "leases", "leaved", "leaven", "leaver", "leaves", "leched", "lecher", "leches", "ledger", "ledges", "leered", "leeway", "lefter", "legacy", "legals", "legate", "legato", "legend", "legged", "legion", "legman", "legmen", "legume", "lemmas", "lemons", "lemony", "lemurs", "lender", "length", "lenses", "lentil", "lepers", "lesion", "lessee", "lessen", "lesser", "lesson", "lessor", "lethal", "letter", "letups", "levees", "levels", "levers", "levied", "levies", "levity", "lewder", "lewdly", "liable", "liaise", "libbed", "libels", "libido", "lichen", "licked", "lidded", "liefer", "lieges", "lifers", "lifted", "lights", "likely", "likens", "likest", "liking", "lilacs", "lilies", "lilted", "limber", "limbos", "limeys", "limier", "liming", "limits", "limned", "limped", "limper", "limpet", "limpid", "limply", "linage", "linden", "lineal", "linear", "linens", "liners", "lineup", "linger", "lining", "linked", "linker", "linkup", "linnet", "lintel", "lipids", "liquid", "liquor", "lisped", "listed", "listen", "litany", "litchi", "lither", "litmus", "litter", "little", "lively", "livens", "livers", "livery", "livest", "living", "lizard", "llamas", "llanos", "loaded", "loader", "loafed", "loafer", "loaned", "loaner", "loathe", "loaves", "lobbed", "lobing", "locale", "locals", "locate", "locked", "locker", "locket", "lockup", "locums", "locust", "lodged", "lodger", "lodges", "lofted", "logged", "logger", "logjam", "loiter", "lolled", "lollop", "lonely", "loners", "longed", "longer", "loofah", "looked", "looker", "loomed", "looped", "loosed", "loosen", "looser", "looses", "looted", "looter", "loping", "lopped", "lorded", "lordly", "losers", "losing", "losses", "lotion", "louche", "louder", "loudly", "loughs", "lounge", "loured", "loused", "louses", "lovely", "lovers", "loveys", "loving", "lowers", "lowest", "lowing", "lowish", "loxing", "lubber", "lubing", "lucked", "lugged", "lulled", "lumbar", "lumber", "lummox", "lumped", "lumpen", "lunacy", "lunged", "lunges", "luring", "lurked", "lusher", "lushes", "lusted", "luvvie", "luxury", "lyceum", "lynxes", "lyrics", "macaws", "macing", "macron", "macros", "madame", "madams", "madcap", "madden", "madder", "madman", "madmen", "madras", "mafias", "maggot", "magics", "magnet", "magnum", "magpie", "maiden", "mailed", "mailer", "maimed", "mainly", "maizes", "majors", "makers", "makeup", "making", "malady", "malice", "malign", "malled", "mallet", "mallow", "malted", "mambas", "mambos", "mammal", "mammon", "manage", "manful", "manged", "manger", "manges", "mangle", "maniac", "manias", "manics", "manila", "manioc", "manned", "manner", "manors", "manses", "mantel", "mantis", "mantle", "mantra", "manual", "manure", "maples", "mapped", "mapper", "maraca", "maraud", "marble", "margin", "marina", "marine", "marked", "marker", "market", "markup", "marlin", "marmot", "maroon", "marque", "marred", "marrow", "marshy", "marted", "marten", "martin", "martyr", "marvel", "mascot", "mashed", "masher", "mashes", "masked", "masons", "masque", "massed", "masses", "massif", "master", "mastic", "mateys", "mating", "matins", "matrix", "matron", "matted", "matter", "mattes", "mature", "matzoh", "matzos", "matzot", "mauled", "mavens", "mawing", "maxims", "maxing", "maybes", "mayday", "mayfly", "mayhem", "mayors", "meadow", "mealed", "meaner", "meanie", "meanly", "measly", "meccas", "medals", "meddle", "medial", "median", "medias", "medico", "medics", "medium", "medley", "meeker", "meekly", "meeter", "melded", "mellow", "melody", "melons", "melted", "member", "memoir", "memory", "menace", "menage", "mended", "mender", "menial", "menses", "mental", "mentor", "merely", "merest", "merged", "merger", "merges", "mering", "merino", "merits", "merman", "mermen", "mescal", "meshed", "meshes", "messed", "messes", "metals", "meteor", "method", "meting", "metric", "metros", "mettle", "mewing", "mewled", "mezzos", "miasma", "mickey", "micron", "micros", "midair", "midday", "middle", "midges", "midget", "midway", "miffed", "mighty", "miking", "milder", "mildew", "mildly", "milers", "milieu", "milked", "milker", "milled", "miller", "millet", "mimics", "miming", "mimosa", "minced", "mincer", "minces", "minded", "minder", "miners", "mingle", "minims", "mining", "minion", "minnow", "minors", "minted", "minuet", "minute", "minxes", "mirage", "miring", "mirror", "miscue", "misdid", "misers", "misery", "misfit", "mishap", "mishit", "mislay", "misled", "missal", "missed", "misses", "missus", "misted", "mister", "misuse", "mitten", "mixers", "mixing", "mizzen", "moaned", "moaner", "moated", "mobbed", "mobile", "mocked", "mocker", "modals", "models", "modems", "modern", "modest", "modify", "modish", "module", "moggie", "moguls", "mohair", "moiety", "moires", "molars", "molder", "molest", "molted", "molten", "moment", "mommas", "moneys", "monger", "mongol", "monies", "monkey", "months", "mooing", "mooned", "moored", "mooted", "mooter", "mopeds", "moping", "mopped", "moppet", "morale", "morals", "morass", "morays", "morbid", "morgue", "morned", "morons", "morose", "morphs", "morrow", "morsel", "mortal", "mortar", "mosaic", "moseys", "moshed", "moshes", "mosque", "mossed", "mosses", "mostly", "motels", "motets", "mother", "motifs", "motile", "motion", "motive", "motley", "motors", "mottle", "moults", "mounds", "mounts", "mourns", "moused", "mouser", "mouses", "mousse", "mouths", "mouthy", "movers", "movies", "moving", "mowers", "mowing", "mucked", "mucous", "muddle", "muesli", "muffed", "muffin", "muffle", "muftis", "mugged", "mugger", "mukluk", "muling", "mulish", "mullah", "mulled", "mullet", "mumble", "mummer", "murals", "murder", "murmur", "muscat", "muscle", "muscly", "museum", "mushed", "musher", "mushes", "musics", "musing", "musked", "musket", "muslin", "mussed", "mussel", "musses", "muster", "mutant", "mutate", "mutely", "mutest", "muting", "mutiny", "mutter", "mutton", "mutual", "muumuu", "muzzle", "myopia", "myopic", "myriad", "myrtle", "myself", "mystic", "mythic", "nabbed", "nabobs", "nachos", "nadirs", "naffer", "nagged", "naiads", "nailed", "naiver", "naives", "namely", "naming", "napalm", "napkin", "napped", "narced", "narrow", "nasals", "nation", "native", "natter", "nature", "nausea", "navels", "navies", "nearby", "neared", "nearer", "nearly", "neaten", "neater", "neatly", "nebula", "necked", "nectar", "needed", "needle", "negate", "neighs", "nephew", "nerved", "nerves", "nested", "nestle", "nether", "netted", "nettle", "neural", "neuron", "neuter", "newbie", "newels", "newest", "newing", "newsed", "newses", "newton", "niacin", "nibbed", "nibble", "nicely", "nicest", "nicety", "niches", "nicked", "nickel", "nieces", "nigger", "niggle", "nigher", "nights", "nilled", "nimble", "nimbly", "nimbus", "ninety", "ninjas", "ninths", "nipped", "nipper", "nipple", "nitwit", "nixing", "nobble", "nobler", "nobles", "nobody", "nodded", "noddle", "nodule", "noggin", "noised", "noises", "nomads", "noncom", "nonfat", "noodle", "nookie", "nooned", "nooses", "normal", "normed", "noshed", "noshes", "nosing", "notary", "notice", "notify", "noting", "notion", "nougat", "novels", "novice", "noways", "nowise", "nozzle", "nuance", "nubile", "nuclei", "nudest", "nudged", "nudges", "nudism", "nudist", "nudity", "nugget", "nuking", "numbed", "number", "numbly", "nuncio", "nursed", "nurses", "nutmeg", "nutria", "nutted", "nutter", "nuzzle", "nylons", "nympho", "nymphs", "oafish", "oaring", "obeyed", "object", "oblate", "oblige", "oblong", "oboist", "obsess", "obtain", "obtuse", "occult", "occupy", "occurs", "oceans", "ocelot", "ockers", "octane", "octave", "octets", "ocular", "oddest", "oddity", "odious", "oeuvre", "offend", "offers", "office", "offing", "offish", "offset", "oftest", "ogling", "oilcan", "oilier", "oiling", "oilman", "oilmen", "oinked", "oldens", "oldest", "oldies", "oldish", "olives", "omegas", "omelet", "onions", "onrush", "onsets", "onside", "onuses", "onward", "onyxes", "oodles", "oohing", "oopses", "oozing", "opaque", "opened", "opener", "openly", "operas", "opiate", "opined", "opines", "oppose", "optics", "optima", "opting", "option", "opuses", "oracle", "orally", "orange", "orated", "orates", "orator", "orbits", "orchid", "ordain", "ordeal", "orders", "ordure", "organs", "orgasm", "orgies", "orient", "origin", "oriole", "ormolu", "ornate", "ornery", "orphan", "osiers", "osprey", "ossify", "ostler", "others", "otiose", "otters", "ounces", "ousted", "ouster", "outage", "outbid", "outcry", "outdid", "outers", "outfit", "outfox", "outgun", "outing", "outlaw", "outlay", "outlet", "output", "outran", "outrun", "outset", "outwit", "overdo", "overly", "ovoids", "ovules", "owlets", "owlish", "owners", "owning", "oxbows", "oxcart", "oxford", "oxides", "oxtail", "oxygen", "oyster", "pacier", "pacify", "pacing", "packed", "packer", "packet", "padded", "paddle", "padres", "paeans", "paella", "pagans", "pagers", "paging", "pagoda", "pained", "paints", "paired", "palace", "palate", "palest", "paling", "palish", "palled", "pallet", "pallid", "pallor", "palmed", "paltry", "pampas", "pamper", "panama", "pandas", "pander", "panels", "panged", "panics", "panned", "panted", "pantie", "pantos", "pantry", "papacy", "papaws", "papaya", "papers", "papery", "papist", "papped", "papyri", "parade", "parcel", "pardon", "parent", "pariah", "paring", "parish", "parity", "parkas", "parked", "parlay", "parley", "parody", "parole", "parred", "parrot", "parsec", "parsed", "parser", "parses", "parson", "parted", "partly", "pashas", "passed", "passel", "passer", "passes", "passim", "pastas", "pasted", "pastel", "pastes", "pastor", "pastry", "patchy", "patent", "paters", "pathos", "patina", "patios", "patois", "patrol", "patron", "patted", "patter", "paunch", "pauper", "paused", "pauses", "paving", "pawing", "pawned", "payday", "payees", "payers", "paying", "payoff", "payola", "payout", "peaces", "peachy", "peahen", "peaked", "pealed", "peanut", "pearls", "pearly", "pebble", "pebbly", "pecans", "pecked", "pecker", "pectin", "pedalo", "pedals", "pedant", "peddle", "peeing", "peeked", "peeled", "peeler", "peepbo", "peeped", "peeper", "peered", "peeved", "peeves", "peewee", "peewit", "pegged", "pellet", "pelmet", "pelted", "pelvic", "pelvis", "pencil", "pended", "penile", "penned", "pennon", "penury", "people", "pepped", "pepper", "pepsin", "peptic", "perils", "period", "perish", "perked", "permed", "permit", "person", "perter", "pertly", "peruse", "peseta", "pester", "pestle", "petals", "petard", "peters", "petite", "petrel", "petrol", "petted", "pewees", "pewter", "peyote", "phalli", "phased", "phases", "phenom", "phials", "phlegm", "phloem", "phobia", "phobic", "phoebe", "phoned", "phones", "phonic", "phooey", "photon", "photos", "phrase", "phylae", "phylum", "physic", "physio", "pianos", "piazza", "pickax", "picked", "picker", "picket", "pickle", "pickup", "picnic", "piddle", "pidgin", "pieced", "pieces", "pieing", "pierce", "piffle", "pigeon", "pigged", "piglet", "pigpen", "pigsty", "pikers", "piking", "pilafs", "pileup", "pilfer", "piling", "pillar", "pillow", "pilots", "pimped", "pimple", "pimply", "pincer", "pinged", "pining", "pinion", "pinked", "pinker", "pinkie", "pinkos", "pinned", "pintos", "pinups", "pipers", "piping", "pipits", "pipped", "pippin", "piqued", "piques", "piracy", "pirate", "pissed", "pisser", "pisses", "pistes", "pistil", "pistol", "piston", "pitied", "pities", "pitons", "pittas", "pitted", "pivots", "pixels", "pixies", "pizazz", "pizzas", "placed", "placer", "places", "placid", "plague", "plaice", "plaids", "plains", "plaint", "plaits", "planar", "planed", "planer", "planes", "planet", "planks", "plants", "plaque", "plasma", "plated", "platen", "plates", "played", "player", "plazas", "pleads", "please", "pleats", "plebby", "plebes", "pledge", "plenty", "plenum", "plexus", "pliant", "pliers", "plight", "plinth", "plonks", "plover", "plucks", "plucky", "plumbs", "plumed", "plumes", "plummy", "plumps", "plunge", "plunks", "plural", "pluses", "plushy", "plying", "pocked", "pocket", "podded", "podium", "poetic", "poetry", "pogrom", "points", "pointy", "poised", "poises", "poison", "pokers", "pokier", "poking", "polars", "police", "policy", "poling", "polios", "polish", "polite", "polity", "polkas", "polled", "pollen", "polyps", "pomade", "pommel", "pompom", "ponced", "ponces", "poncey", "poncho", "ponder", "ponged", "ponied", "ponies", "poodle", "poohed", "pooing", "pooled", "pooped", "poorer", "poorly", "popgun", "poplar", "poplin", "poppas", "popped", "popper", "poppet", "poring", "porker", "porous", "portal", "ported", "porter", "portly", "posers", "poseur", "poshed", "posher", "poshes", "posies", "posing", "posits", "posses", "possum", "postal", "posted", "poster", "postie", "potash", "potato", "potent", "potful", "potion", "potpie", "potted", "potter", "pouffe", "pounce", "pounds", "poured", "pouted", "powder", "powers", "powwow", "poxing", "praise", "prance", "prangs", "pranks", "prated", "prates", "prawns", "prayed", "prayer", "preach", "preens", "prefab", "prefer", "prefix", "prepay", "preppy", "preses", "preset", "presto", "pretax", "pretty", "prewar", "preyed", "priced", "prices", "pricey", "pricks", "prided", "prides", "priest", "primal", "primed", "primer", "primes", "primly", "primps", "prince", "prints", "prions", "priors", "priory", "prisms", "prison", "prissy", "privet", "probed", "probes", "profit", "proles", "prolix", "promos", "prompt", "prongs", "pronto", "proofs", "propel", "proper", "proses", "proton", "proved", "proves", "prowls", "prudes", "pruned", "prunes", "prying", "psalms", "pseudo", "pseuds", "pseudy", "pshaws", "psyche", "psycho", "psychs", "pubbed", "public", "pucked", "pucker", "puddle", "pueblo", "puffed", "puffer", "puffin", "puking", "pulled", "puller", "pullet", "pulley", "pulped", "pulpit", "pulsar", "pulsed", "pulses", "pumice", "pummel", "pumped", "punchy", "pundit", "punier", "punish", "punker", "punned", "punnet", "punted", "punter", "pupate", "pupils", "pupped", "puppet", "purdah", "pureed", "purees", "purely", "purest", "purged", "purges", "purify", "puring", "purism", "purist", "purity", "purled", "purple", "purred", "pursed", "purser", "purses", "pursue", "purvey", "pushed", "pusher", "pushes", "pusses", "putrid", "putsch", "putted", "putter", "putzes", "puzzle", "pylons", "pyrite", "python", "pyxing", "quacks", "quaffs", "quahog", "quails", "quaint", "quaked", "quakes", "qualms", "quango", "quanta", "quarks", "quarry", "quarto", "quarts", "quartz", "quasar", "quaver", "queasy", "queens", "queers", "quells", "quench", "quests", "queued", "queues", "quiche", "quiets", "quiffs", "quills", "quilts", "quince", "quints", "quires", "quirks", "quirky", "quited", "quites", "quiver", "quoits", "quorum", "quotas", "quoted", "quotes", "qwerty", "rabbis", "rabbit", "rabble", "rabies", "raceme", "racers", "racial", "racier", "racily", "racing", "racism", "racist", "racked", "racket", "radars", "radial", "radios", "radish", "radium", "radius", "raffia", "raffle", "rafted", "rafter", "ragbag", "ragged", "raging", "raglan", "ragout", "ragtag", "raided", "raider", "railed", "rained", "raised", "raises", "raisin", "rajahs", "raking", "rakish", "ramble", "ramify", "rammed", "ramrod", "rancid", "random", "ranees", "ranged", "ranger", "ranges", "ranked", "ranker", "rankle", "ransom", "ranted", "ranter", "rapids", "rapier", "rapine", "raping", "rapist", "rapped", "rappel", "rapper", "raptor", "rarefy", "rarely", "rarest", "raring", "rarity", "rascal", "rasher", "rashes", "rashly", "rasped", "raster", "ratbag", "rather", "ratify", "rating", "ration", "ratios", "rattan", "ratted", "rattle", "ravage", "ravels", "ravens", "ravers", "ravine", "raving", "ravish", "rawest", "razing", "razors", "razzed", "razzes", "reacts", "reader", "realer", "really", "realms", "realty", "reamed", "reamer", "reaped", "reaper", "reared", "rearms", "reason", "rebate", "rebels", "rebind", "reboot", "reborn", "rebuff", "rebuke", "rebuts", "recall", "recant", "recaps", "recast", "recces", "recede", "recent", "recess", "recipe", "recite", "reckon", "recoil", "recons", "recopy", "record", "recoup", "rectal", "rector", "rectos", "rectum", "recurs", "redcap", "redden", "redder", "redeem", "redoes", "redone", "redraw", "redrew", "reduce", "reefed", "reefer", "reeked", "reeled", "reeves", "refers", "reffed", "refile", "refill", "refine", "refits", "reflex", "reform", "refuel", "refuge", "refund", "refuse", "refute", "regain", "regale", "regals", "regard", "regent", "reggae", "regime", "region", "regret", "rehabs", "rehash", "reheat", "rehire", "reigns", "reined", "reject", "rejigs", "rejoin", "relaid", "relate", "relays", "relent", "relics", "relied", "relief", "relies", "relish", "relive", "reload", "remade", "remain", "remake", "remand", "remark", "remedy", "remind", "remiss", "remits", "remold", "remote", "remove", "rename", "render", "renege", "renews", "rennet", "renown", "rental", "rented", "renter", "reopen", "repaid", "repair", "repast", "repays", "repeal", "repeat", "repels", "repent", "replay", "report", "repose", "repute", "reread", "reruns", "resale", "rescue", "resell", "resend", "resent", "resets", "reside", "resign", "resins", "resist", "resits", "resold", "resort", "rested", "result", "resume", "retail", "retain", "retake", "retard", "retell", "retina", "retire", "retold", "retook", "retool", "retort", "retrod", "return", "retype", "reused", "reuses", "revamp", "reveal", "revels", "revere", "revert", "review", "revile", "revise", "revive", "revoke", "revolt", "revues", "revved", "reward", "rewind", "rewire", "reword", "rework", "rheumy", "rhinos", "rhymed", "rhymes", "rhythm", "ribald", "ribbed", "ribbon", "richer", "riches", "richly", "ricing", "ricked", "ridden", "riddle", "riders", "ridged", "ridges", "riding", "rifest", "riffed", "riffle", "rifled", "rifles", "rifted", "rigged", "righto", "rights", "riling", "rilled", "riming", "rimmed", "rinded", "ringed", "ringer", "rinked", "rinsed", "rinses", "rioted", "rioter", "ripely", "ripens", "ripest", "riping", "ripped", "ripper", "ripple", "ripsaw", "risers", "rising", "risked", "ritual", "rivals", "rivers", "rivets", "roadie", "roamed", "roamer", "roared", "roasts", "robbed", "robber", "robing", "robins", "robots", "robust", "rocked", "rocker", "rocket", "rococo", "rodent", "rodeos", "roding", "rogers", "rogues", "roiled", "rolled", "roller", "romped", "romper", "rondos", "roofed", "roofer", "rooked", "rookie", "roomed", "roomer", "roosts", "rooted", "rooter", "roping", "rosary", "rosier", "rosily", "rosins", "roster", "rotary", "rotate", "roting", "rotors", "rotted", "rotten", "rotter", "rotund", "rouged", "rouges", "roughs", "rounds", "roused", "rouses", "rousts", "routed", "router", "routes", "rovers", "roving", "rowans", "rowels", "rowers", "rowing", "royals", "rubbed", "rubber", "rubble", "rubied", "rubier", "rubies", "rubric", "ruched", "rucked", "ruckus", "rudder", "rudely", "rudest", "rueful", "ruffed", "ruffle", "rugged", "rugger", "ruined", "rulers", "ruling", "rumbas", "rumble", "rummer", "rumped", "rumple", "rumpus", "runnel", "runner", "runoff", "runway", "rupees", "rushed", "rushes", "russet", "rusted", "rustic", "rustle", "rutted", "sabled", "sables", "sachem", "sachet", "sacked", "sacred", "sadden", "sadder", "saddle", "sadhus", "sadism", "sadist", "safari", "safely", "safest", "safety", "sagely", "sagest", "sagged", "sagger", "sahibs", "sailed", "sailor", "saints", "saiths", "salaam", "salads", "salami", "salary", "saline", "saliva", "sallow", "salmon", "salons", "saloon", "salsas", "salted", "salter", "salute", "salved", "salver", "salves", "salvos", "sambas", "samosa", "sampan", "sample", "sandal", "sanded", "sander", "sanely", "sanest", "saning", "sanity", "sapped", "sapper", "sarges", "sarnie", "sarong", "sashay", "sashes", "sassed", "sasses", "sateen", "sating", "satins", "satiny", "satire", "satrap", "satyrs", "sauced", "saucer", "sauces", "saunas", "savage", "savant", "savers", "saving", "savoys", "sawing", "sawyer", "saying", "scabby", "scalar", "scalds", "scaled", "scales", "scalps", "scampi", "scamps", "scants", "scanty", "scarab", "scarce", "scared", "scares", "scarfs", "scarps", "scatty", "scened", "scenes", "scenic", "scents", "schema", "scheme", "schism", "schist", "schizo", "schlep", "school", "schuss", "schwas", "scions", "scoffs", "scolds", "sconce", "scones", "scoops", "scoots", "scoped", "scopes", "scorch", "scored", "scorer", "scores", "scorns", "scotch", "scours", "scouts", "scowls", "scrams", "scrape", "scraps", "scrawl", "scream", "screed", "screen", "screes", "screws", "screwy", "scribe", "scrimp", "scrips", "script", "scroll", "scrota", "scrubs", "scruff", "scrump", "scrums", "scubas", "scuffs", "sculls", "sculpt", "scummy", "scurfy", "scurry", "scurvy", "scuzzy", "scythe", "seabed", "sealed", "sealer", "seaman", "seamed", "seamen", "search", "seared", "season", "seated", "seaway", "secede", "second", "secret", "sector", "secure", "sedans", "sedate", "seduce", "seeded", "seeing", "seeker", "seemed", "seemly", "seeped", "seesaw", "seethe", "segued", "segues", "seized", "seizes", "seldom", "select", "seller", "selves", "senate", "sender", "senile", "senior", "sensed", "senses", "sensor", "sentry", "sepals", "sepsis", "septet", "septic", "septum", "sequel", "sequin", "serape", "seraph", "serene", "serest", "serial", "series", "serifs", "sering", "sermon", "serous", "serums", "served", "server", "serves", "servos", "sesame", "settee", "setter", "settle", "setups", "sevens", "severe", "severs", "sewage", "sewers", "sewing", "sexier", "sexily", "sexing", "sexism", "sexist", "sexpot", "sextet", "sexton", "sexual", "shabby", "shacks", "shaded", "shades", "shadow", "shafts", "shaggy", "shaikh", "shaken", "shaker", "shakes", "shalom", "shaman", "shamed", "shames", "shandy", "shanks", "shanty", "shaped", "shapes", "shards", "shared", "shares", "sharia", "sharks", "sharps", "shaved", "shaver", "shaves", "shawls", "shears", "sheath", "sheave", "sheers", "sheets", "sheiks", "sheila", "shekel", "shells", "shelve", "sherry", "shield", "shifts", "shifty", "shills", "shimmy", "shined", "shiner", "shines", "shinny", "shires", "shirks", "shirrs", "shirts", "shirty", "shites", "shitty", "shiver", "shoals", "shocks", "shoddy", "shogun", "shooed", "shoots", "shored", "shores", "shorts", "shorty", "should", "shouts", "shoved", "shovel", "shoves", "showed", "shower", "shrank", "shreds", "shrewd", "shrews", "shriek", "shrift", "shrike", "shrill", "shrimp", "shrine", "shrink", "shrive", "shroud", "shrubs", "shrugs", "shrunk", "shtick", "shucks", "shunts", "shyest", "shying", "sibyls", "sicked", "sicken", "sicker", "sickie", "sickle", "sickly", "sickos", "siding", "sidled", "sidles", "sieges", "sienna", "sierra", "siesta", "sieved", "sieves", "sifted", "sifter", "sighed", "sights", "signal", "signed", "signer", "signet", "silage", "silent", "silica", "silken", "silted", "silver", "simian", "simile", "simmer", "simper", "simple", "simply", "sinews", "sinewy", "sinful", "singed", "singer", "singes", "single", "singly", "sinker", "sinned", "sinner", "sipped", "sirens", "siring", "sirrah", "sirred", "sister", "sitars", "sitcom", "siting", "sitter", "sixths", "sizing", "sizzle", "skated", "skater", "skates", "skeins", "sketch", "skewed", "skewer", "skibob", "skiers", "skiffs", "skiing", "skills", "skimps", "skimpy", "skinny", "skirts", "skited", "skived", "skiver", "skives", "skivvy", "skulks", "skulls", "skunks", "skycap", "skying", "slacks", "slaked", "slakes", "slalom", "slangy", "slants", "slated", "slates", "slaved", "slaver", "slaves", "slayed", "slayer", "sleaze", "sleazy", "sledge", "sleeks", "sleeps", "sleepy", "sleets", "sleety", "sleeve", "sleigh", "sleuth", "slewed", "sliced", "slicer", "slices", "slicks", "slided", "slider", "slides", "sliest", "slight", "slings", "slinks", "slinky", "slippy", "sliver", "slogan", "sloops", "sloped", "slopes", "sloppy", "sloths", "slouch", "slough", "sloven", "slowed", "slower", "slowly", "sludge", "sludgy", "sluice", "sluing", "slummy", "slumps", "slurps", "slurry", "slushy", "slutty", "smacks", "smalls", "smarmy", "smarts", "smears", "smells", "smelly", "smelts", "smiled", "smiles", "smiley", "smirch", "smirks", "smites", "smiths", "smithy", "smocks", "smoggy", "smoked", "smoker", "smokes", "smokey", "smooch", "smooth", "smudge", "smudgy", "smugly", "smutty", "snacks", "snafus", "snails", "snaked", "snakes", "snappy", "snared", "snares", "snarls", "snatch", "snazzy", "sneaks", "sneaky", "sneers", "sneeze", "snicks", "snider", "snides", "sniffs", "sniffy", "sniped", "sniper", "snipes", "snippy", "snitch", "snivel", "snobby", "snoops", "snoopy", "snoots", "snooty", "snooze", "snored", "snorer", "snores", "snorts", "snotty", "snouts", "snowed", "snuffs", "snugly", "soaked", "soaped", "soared", "sobbed", "sobers", "soccer", "social", "socked", "socket", "sodded", "sodden", "sodium", "sodomy", "soften", "softer", "softly", "soiled", "solace", "solder", "solely", "solemn", "solids", "soling", "soloed", "solved", "solver", "solves", "somber", "sombre", "sonars", "sonata", "sonics", "sonnet", "sooner", "soothe", "sooths", "sopped", "sorbet", "sordid", "sorely", "sorest", "soring", "sorrel", "sorrow", "sorted", "sorter", "sortie", "soughs", "sought", "sounds", "souped", "source", "soured", "sourer", "sourly", "soused", "souses", "soviet", "sowers", "sowing", "spaced", "spaces", "spacey", "spaded", "spades", "spanks", "spared", "sparer", "spares", "sparks", "sparky", "sparse", "spasms", "spates", "spawns", "spayed", "speaks", "spears", "specie", "specks", "speech", "speeds", "speedy", "spells", "spends", "sperms", "spewed", "sphere", "sphinx", "spiced", "spices", "spider", "spiels", "spiffs", "spiffy", "spigot", "spiked", "spikes", "spills", "spinal", "spines", "spinet", "spiral", "spirea", "spires", "spirit", "spited", "spites", "splash", "splats", "splays", "spleen", "splice", "spliff", "spline", "splint", "splits", "splosh", "spoils", "spoken", "spokes", "sponge", "spongy", "spoofs", "spooks", "spooky", "spools", "spoons", "spoors", "spored", "spores", "sports", "sporty", "spotty", "spouse", "spouts", "sprain", "sprang", "sprats", "sprawl", "sprays", "spread", "spreed", "sprees", "sprier", "sprigs", "spring", "sprint", "sprite", "spritz", "sprogs", "sprout", "spruce", "sprung", "spryly", "spumed", "spumes", "spunks", "spunky", "spurns", "spurts", "sputum", "spying", "squabs", "squads", "squall", "square", "squash", "squats", "squawk", "squaws", "squeak", "squeal", "squibs", "squids", "squint", "squire", "squirm", "squirt", "squish", "stable", "stably", "stacks", "staffs", "staged", "stages", "stains", "stairs", "staked", "stakes", "staled", "staler", "stales", "stalks", "stalls", "stamen", "stamps", "stance", "stanch", "stands", "stanks", "stanza", "staple", "starch", "stared", "stares", "starks", "starry", "starts", "starve", "stasis", "stated", "stater", "states", "static", "statue", "status", "staved", "stayed", "steads", "steady", "steaks", "steals", "steams", "steamy", "steeds", "steels", "steely", "steeps", "steers", "steins", "stench", "stenos", "steppe", "stereo", "sterns", "stewed", "sticks", "sticky", "stiffs", "stifle", "stigma", "stiled", "stiles", "stills", "stilts", "stings", "stingy", "stinks", "stints", "stitch", "stoats", "stocks", "stocky", "stodge", "stodgy", "stoics", "stoked", "stoker", "stokes", "stolen", "stoles", "stolid", "stomps", "stoned", "stones", "stooge", "stools", "stoops", "stored", "stores", "storks", "storms", "stormy", "stoups", "stouts", "stoves", "stowed", "strafe", "strain", "strait", "strand", "straps", "strata", "straws", "strays", "streak", "stream", "street", "stress", "strewn", "strews", "strict", "stride", "strife", "strike", "string", "stripe", "strips", "stripy", "strive", "strobe", "strode", "stroke", "stroll", "strong", "strops", "strove", "struck", "strums", "strung", "struts", "stubby", "stucco", "studio", "stuffs", "stuffy", "stumps", "stumpy", "stunts", "stupid", "stupor", "sturdy", "stying", "styled", "styles", "stylus", "stymie", "suaver", "subbed", "subdue", "sublet", "submit", "suborn", "subset", "subtle", "subtly", "suburb", "subway", "sucked", "sucker", "suckle", "sudden", "suffer", "suffix", "sugars", "sugary", "suited", "suites", "suitor", "sulked", "sullen", "sultan", "sultry", "summat", "summed", "summer", "summit", "summon", "sunbed", "sundae", "sunder", "sundry", "sunhat", "sunken", "sunlit", "sunned", "sunset", "suntan", "superb", "supers", "supine", "supped", "supper", "supple", "supply", "surely", "surest", "surety", "surfed", "surfer", "surged", "surges", "surrey", "surtax", "survey", "sussed", "susses", "suttee", "suture", "svelte", "swains", "swamis", "swamps", "swampy", "swanks", "swanky", "swards", "swarms", "swatch", "swathe", "swaths", "swayed", "swears", "sweats", "sweaty", "swedes", "sweeps", "sweets", "swells", "swerve", "swifts", "swills", "swines", "swings", "swiped", "swipes", "swirls", "swirly", "switch", "swivel", "swoons", "swoops", "swoosh", "swords", "sylphs", "sylvan", "symbol", "synced", "synods", "syntax", "syrupy", "system", "tabbed", "tabled", "tables", "tablet", "taboos", "tacked", "tackle", "tactic", "tagged", "tailed", "tailor", "taints", "takers", "taking", "talent", "talked", "talker", "talkie", "taller", "tallow", "talons", "tamale", "tamely", "tamers", "tamest", "taming", "tamped", "tamper", "tampon", "tandem", "tangle", "tangos", "tanked", "tanker", "tanned", "tanner", "tannin", "tapers", "taping", "tapirs", "tapped", "tappet", "target", "tariff", "taring", "tarmac", "tarots", "tarpon", "tarred", "tartan", "tartar", "tarted", "tarter", "tartly", "tasked", "tassel", "tasted", "taster", "tastes", "taters", "tatted", "tatter", "tattie", "tattle", "tattoo", "taught", "taunts", "tauted", "tauten", "tauter", "tautly", "tavern", "tawdry", "taxied", "taxing", "taxman", "taxmen", "teabag", "teacup", "teaing", "teamed", "teapot", "teared", "teased", "teasel", "teaser", "teases", "techie", "techno", "tedium", "teeing", "teemed", "teeter", "teethe", "teller", "temped", "temper", "temple", "tempos", "tempts", "tenant", "tended", "tender", "tendon", "tenets", "tenner", "tennis", "tenons", "tenors", "tenpin", "tensed", "tenser", "tenses", "tensor", "tented", "tenths", "tenure", "tepees", "termed", "termly", "terned", "terror", "terser", "tested", "tester", "testes", "testis", "tetchy", "tether", "thanks", "thatch", "thawed", "thefts", "theirs", "theism", "theist", "themed", "themes", "thence", "theory", "therms", "theses", "thesis", "thicko", "thieve", "thighs", "things", "thingy", "thinks", "thinly", "thirds", "thirst", "thirty", "thongs", "thorax", "thorns", "thorny", "though", "thrall", "thrash", "thread", "threat", "threes", "thresh", "thrice", "thrift", "thrill", "thrive", "throat", "throbs", "throed", "throes", "throne", "throng", "thrown", "throws", "thrums", "thrush", "thrust", "thumbs", "thumps", "thwack", "thwart", "thymus", "tiaras", "tibiae", "ticked", "ticker", "ticket", "tickle", "tidbit", "tiddly", "tidied", "tidier", "tidies", "tidily", "tiding", "tiepin", "tiered", "tiffed", "tigers", "tights", "tildes", "tilers", "tiling", "tilled", "tiller", "tilted", "timber", "timbre", "timely", "timers", "timing", "tinder", "tinged", "tinges", "tingle", "tingly", "tinier", "tinker", "tinkle", "tinned", "tinpot", "tinsel", "tinted", "tipped", "tipper", "tippex", "tipple", "tiptoe", "tiptop", "tirade", "tissue", "titans", "titchy", "tithed", "tithes", "titian", "titled", "titles", "titted", "titter", "tittle", "toasts", "toasty", "tocsin", "toddle", "toecap", "toeing", "toerag", "toffee", "togged", "toggle", "toiled", "toiler", "toilet", "tokens", "toking", "tolled", "tomato", "tombed", "tomboy", "tomcat", "toners", "tongue", "tonics", "tonier", "toning", "tonnes", "tonsil", "tooled", "tooted", "toothy", "tootle", "topees", "topics", "topped", "topper", "topple", "toques", "torpid", "torpor", "torque", "torrid", "torsos", "tortes", "tossed", "tosser", "tosses", "tossup", "totals", "totems", "toting", "totted", "totter", "toucan", "touchy", "toughs", "toupee", "toured", "tousle", "touted", "toward", "towels", "towers", "towing", "townee", "townie", "toxins", "toyboy", "toying", "traced", "tracer", "traces", "tracks", "tracts", "traded", "trader", "trades", "tragic", "trails", "trains", "traits", "tramps", "trance", "trashy", "trauma", "travel", "trawls", "treads", "treats", "treaty", "treble", "tremor", "trench", "trends", "trendy", "triads", "triage", "trials", "tribal", "tribes", "tricks", "tricky", "triers", "trifle", "triked", "trikes", "trilby", "trills", "trimly", "triple", "triply", "tripod", "tripos", "triter", "trites", "trivet", "trivia", "trodes", "troika", "trolls", "tromps", "troops", "tropes", "trophy", "tropic", "troths", "trough", "troupe", "trouts", "trowel", "truant", "truces", "trucks", "trudge", "truest", "truing", "truism", "trumps", "trunks", "trusts", "trusty", "truths", "trying", "tryout", "trysts", "tubers", "tubing", "tucked", "tucker", "tufted", "tugged", "tulips", "tumble", "tumult", "tundra", "tuners", "tunics", "tuning", "tunnel", "tuques", "turban", "turbid", "turbos", "turbot", "tureen", "turfed", "turgid", "turkey", "turned", "turner", "turnip", "turret", "turtle", "tushed", "tushes", "tusked", "tussle", "tutors", "tutted", "tuxedo", "twangs", "tweaks", "tweeds", "tweedy", "tweets", "twelve", "twenty", "twerps", "twiggy", "twilit", "twined", "twines", "twinge", "twirls", "twirly", "twists", "twisty", "twitch", "twofer", "tycoon", "typhus", "typify", "typing", "typist", "tyrant", "udders", "uglied", "uglier", "uglies", "ulcers", "ultras", "umbels", "umiaks", "umlaut", "umping", "umpire", "unable", "unbars", "unbend", "unbent", "unbind", "unbolt", "unborn", "uncled", "uncles", "uncoil", "uncool", "uncork", "uncurl", "undies", "undoes", "undone", "unduly", "unease", "uneasy", "uneven", "unfair", "unfits", "unfold", "unfurl", "unhand", "unholy", "unhook", "unhurt", "unions", "unique", "unisex", "unison", "united", "unites", "unjust", "unkind", "unlace", "unless", "unlike", "unload", "unlock", "unmade", "unmake", "unmans", "unmask", "unpack", "unpaid", "unpick", "unpins", "unplug", "unread", "unreal", "unrest", "unripe", "unroll", "unruly", "unsafe", "unsaid", "unsays", "unseal", "unseat", "unseen", "unsent", "unsnap", "unsold", "unstop", "unsung", "unsure", "untidy", "untied", "unties", "untold", "untrue", "unused", "unveil", "unwary", "unwell", "unwind", "unwise", "unwrap", "unzips", "upbeat", "update", "upends", "upheld", "uphill", "uphold", "upkeep", "upland", "uplift", "upload", "uppers", "upping", "uppity", "uproar", "uproot", "upsets", "upshot", "upside", "uptake", "uptown", "upturn", "upward", "upwind", "urbane", "urchin", "urgent", "urging", "urinal", "urning", "usable", "usages", "useful", "ushers", "usurer", "usurps", "uterus", "utmost", "utopia", "utters", "uvular", "uvulas", "vacant", "vacate", "vacuum", "vagary", "vagina", "vagued", "vaguer", "vagues", "vainer", "vainly", "valets", "valise", "valley", "valued", "valuer", "values", "valved", "valves", "vamped", "vandal", "vanish", "vanity", "vanned", "varied", "varies", "varlet", "vassal", "vaster", "vastly", "vatted", "vaults", "vaunts", "vealed", "vector", "veered", "vegans", "vegged", "vegges", "veggie", "veiled", "veined", "velars", "vellum", "velvet", "vended", "vendor", "veneer", "venial", "venous", "vented", "venues", "verbal", "verged", "verger", "verges", "verier", "verify", "verily", "verity", "vermin", "vernal", "versed", "verses", "versos", "versus", "vertex", "vesper", "vessel", "vested", "vestry", "vetoed", "vetoes", "vetted", "vexing", "viable", "viably", "viands", "vicars", "vicing", "victim", "victor", "videos", "viewed", "viewer", "vigils", "vilely", "vilest", "vilify", "villas", "vining", "vinyls", "violas", "violet", "violin", "vipers", "virago", "vireos", "virgin", "virile", "virtue", "visaed", "visage", "viscid", "viscus", "vising", "vision", "visits", "visors", "vistas", "visual", "vitals", "vivace", "vivaed", "vivify", "vixens", "vizier", "vocals", "vodkas", "vogued", "vogues", "voiced", "voices", "voided", "voling", "volley", "volume", "vomits", "voodoo", "vortex", "votary", "voters", "voting", "votive", "vowels", "vowing", "voyage", "voyeur", "vulgar", "vulvae", "wackos", "wadded", "waddle", "waders", "wadges", "wading", "wafers", "waffle", "wafted", "wagers", "wagged", "waggle", "waging", "waifed", "wailed", "waists", "waited", "waiter", "waived", "waiver", "waives", "wakens", "waking", "waling", "walked", "walker", "wallah", "wallas", "walled", "wallet", "wallop", "wallow", "walnut", "walrus", "wampum", "wander", "wangle", "waning", "wanked", "wanker", "wanner", "wanted", "wanton", "wapiti", "warble", "warded", "warden", "warder", "warier", "warily", "warmed", "warmer", "warmly", "warmth", "warned", "warped", "warred", "warren", "washed", "washer", "washes", "wasted", "waster", "wastes", "waters", "watery", "watter", "wattle", "wavers", "wavier", "waving", "waxier", "waxing", "waylay", "wazoos", "weaken", "weaker", "weakly", "wealth", "weaned", "weapon", "wearer", "weasel", "weaved", "weaver", "weaves", "webbed", "wedded", "wedder", "wedged", "wedges", "weeded", "weeder", "weeing", "weekly", "weenie", "weeper", "weevil", "wefted", "weighs", "weight", "weirdo", "weirds", "weired", "welded", "welder", "welkin", "welled", "wellie", "welted", "welter", "wended", "wested", "wetter", "whacks", "whaled", "whaler", "whales", "whammy", "wharfs", "wheals", "wheels", "wheeze", "wheezy", "whelks", "whelps", "whence", "wheres", "whewed", "whiffs", "whiled", "whiles", "whilst", "whimsy", "whined", "whiner", "whines", "whinge", "whinny", "whirls", "whisks", "whited", "whiten", "whiter", "whites", "whitey", "wholes", "wholly", "whoops", "whoosh", "whores", "whorls", "wicked", "wicker", "wicket", "widely", "widens", "widest", "widget", "widows", "widths", "wields", "wiener", "wienie", "wifely", "wigeon", "wigged", "wiggle", "wiggly", "wights", "wigwag", "wigwam", "wilded", "wilder", "wildly", "wilier", "wiling", "willed", "willie", "willow", "wilted", "wimped", "wimple", "winced", "winces", "winded", "window", "windup", "winery", "winged", "winger", "wining", "winked", "winkle", "winner", "winnow", "winter", "wintry", "wipers", "wiping", "wirier", "wiring", "wisdom", "wisely", "wisest", "wished", "wisher", "wishes", "wising", "withal", "withed", "wither", "withes", "within", "witter", "wizard", "wobble", "wobbly", "wodges", "woeful", "wolfed", "wolves", "wombat", "wonder", "wonted", "wooded", "wooden", "woodsy", "wooers", "woofed", "woofer", "wooing", "woolly", "worded", "worked", "worker", "worlds", "wormed", "worsen", "worsts", "worthy", "wotcha", "woulds", "wounds", "wovens", "wowing", "wracks", "wraith", "wraths", "wreaks", "wreath", "wrecks", "wrench", "wrests", "wretch", "wright", "wrings", "wrists", "writer", "writes", "writhe", "wrongs", "wryest", "wrying", "wusses", "yachts", "yahoos", "yakked", "yammer", "yanked", "yapped", "yawing", "yawned", "yearly", "yearns", "yeasts", "yeasty", "yelled", "yellow", "yelped", "yeoman", "yeomen", "yessed", "yields", "yipped", "yippee", "yobbos", "yodels", "yogurt", "yokels", "yoking", "yonder", "youths", "yowled", "yuccas", "yucked", "yukked", "yuppie", "zanied", "zanier", "zanies", "zapped", "zapper", "zealot", "zebras", "zenith", "zephyr", "zeroed", "zigzag", "zinged", "zinger", "zinnia", "zipped", "zipper", "zircon", "zither", "zodiac", "zombie", "zoning", "zonked", "zoomed", "zydeco", "zygote" }; const char* w_7[] = { "abalone", "abandon", "abashed", "abashes", "abasing", "abating", "abdomen", "abducts", "abetted", "abettor", "abiding", "ability", "abjects", "abjured", "abjures", "aboding", "abolish", "aborted", "abounds", "abraded", "abrades", "abreast", "abridge", "abscess", "abscond", "abseils", "absence", "absents", "absolve", "absorbs", "abstain", "abusers", "abusing", "abusive", "abutted", "abysmal", "abysses", "acacias", "academe", "academy", "acceded", "accedes", "accents", "accepts", "acclaim", "accords", "accosts", "account", "accrual", "accrued", "accrues", "accused", "accuser", "accuses", "acerbic", "acetate", "acetone", "achiest", "achieve", "acidify", "acidity", "acolyte", "aconite", "acquire", "acquits", "acreage", "acrider", "acrobat", "acronym", "acrylic", "actions", "actives", "actress", "actuary", "actuate", "acutely", "acutest", "adagios", "adamant", "adapted", "addenda", "addends", "addicts", "addling", "address", "adduced", "adduces", "adenoid", "adepter", "adeptly", "adhered", "adheres", "adipose", "adjoins", "adjourn", "adjudge", "adjunct", "adjured", "adjures", "adjusts", "admiral", "admired", "admirer", "admires", "adopted", "adoring", "adorned", "adrenal", "adulate", "advance", "advents", "adverbs", "adverse", "adverts", "advised", "adviser", "advises", "aerated", "aerates", "aerator", "aerials", "aeriest", "aerobic", "aerosol", "affable", "affably", "affairs", "affects", "affirms", "affixed", "affixes", "afflict", "affords", "affrays", "affront", "afghans", "against", "ageists", "ageless", "agendas", "agilely", "agilest", "agility", "agitate", "agonies", "aground", "aileron", "ailment", "aimless", "airbags", "airbase", "airbeds", "aircrew", "airdrop", "airfare", "airflow", "airguns", "airhead", "airiest", "airings", "airless", "airlift", "airline", "airlock", "airmail", "airplay", "airport", "airship", "airshow", "airsick", "airtime", "airways", "aisling", "aitches", "alarmed", "albinos", "albumen", "albumin", "alchemy", "alcohol", "alcoves", "alerted", "alerter", "alertly", "alfalfa", "algebra", "aliased", "aliases", "alibied", "aliened", "alights", "aligned", "alimony", "allayed", "alleged", "alleges", "allegro", "allergy", "allover", "allowed", "alloyed", "alluded", "alludes", "allured", "allures", "allying", "almanac", "almonds", "almoner", "alpacas", "alpines", "already", "alright", "altered", "alumnae", "alumnus", "amalgam", "amassed", "amasses", "amateur", "amatory", "amazing", "amazons", "ambient", "ambling", "amended", "amening", "amenity", "amiable", "amiably", "ammeter", "ammonia", "amnesia", "amnesty", "amoebas", "amoebic", "amongst", "amorous", "amounts", "amperes", "amphora", "amplest", "amplify", "ampules", "amputee", "amulets", "amusing", "anagram", "analogs", "analogy", "analyst", "anapest", "anarchy", "anatomy", "anchors", "anchovy", "ancient", "andante", "andiron", "android", "anemone", "angelic", "angered", "anglers", "angling", "angoras", "angrier", "angrily", "anguish", "angular", "animals", "animate", "animism", "animist", "aniseed", "anklets", "ankling", "anneals", "annexed", "annexes", "annoyed", "annuals", "annuity", "annular", "anodyne", "anoints", "anomaly", "anoraks", "another", "answers", "antacid", "anteing", "antenna", "anthems", "anthers", "anthill", "anthrax", "antigen", "antique", "antiwar", "antlers", "antonym", "anxiety", "anxious", "anybody", "anymore", "anytime", "anyways", "aphasia", "aphasic", "aphelia", "aplenty", "apogees", "apology", "apostle", "apparel", "appeals", "appears", "appease", "appends", "applaud", "applets", "applied", "applies", "appoint", "apprise", "approve", "apricot", "apropos", "aptness", "aquatic", "aquavit", "aqueous", "aquifer", "arbiter", "arbutus", "arcades", "archaic", "archers", "archery", "archest", "arching", "archive", "archway", "arctics", "arduous", "arguing", "argyles", "aridest", "aridity", "arising", "armadas", "armband", "armfuls", "armhole", "armlets", "armload", "armpits", "armrest", "arousal", "aroused", "arouses", "arraign", "arrange", "arrayed", "arrears", "arrests", "arrival", "arrived", "arrives", "arroyos", "arsenal", "arsenic", "article", "artiest", "artisan", "artiste", "artists", "artless", "artsier", "artwork", "arugula", "ascends", "ascents", "ascetic", "ascribe", "aseptic", "asexual", "ashamed", "ashcans", "ashiest", "ashrams", "ashtray", "asinine", "askance", "asocial", "aspects", "asphalt", "aspired", "aspires", "aspirin", "assails", "assault", "assayed", "assents", "asserts", "assigns", "assists", "assizes", "assorts", "assuage", "assumed", "assumes", "assured", "assures", "astound", "astrals", "astride", "astuter", "asunder", "asylums", "atavism", "atelier", "atheism", "atheist", "athlete", "atishoo", "atlases", "atomics", "atoning", "atrophy", "attacks", "attains", "attempt", "attends", "attests", "attired", "attires", "attract", "attuned", "attunes", "auction", "audible", "audibly", "audited", "auditor", "augment", "augured", "augusts", "aunties", "aurally", "aureole", "auricle", "auspice", "austere", "authors", "autoing", "autopsy", "autumns", "availed", "avarice", "avatars", "avenged", "avenger", "avenges", "avenues", "average", "averred", "averted", "aviator", "avidest", "avidity", "avionic", "avocado", "avoided", "avowals", "avowing", "awaited", "awakens", "awaking", "awarded", "awarest", "awesome", "awfully", "awkward", "awnings", "azaleas", "azimuth", "babbled", "babbler", "babbles", "babiest", "baboons", "babying", "babyish", "babysat", "babysit", "bacilli", "backbit", "backers", "backhoe", "backing", "backlog", "backups", "baddest", "baddies", "badgers", "badness", "baffled", "baffles", "bagfuls", "baggage", "baggier", "baggies", "bagging", "bagpipe", "baileys", "bailiff", "bailing", "bailout", "baiting", "balance", "balcony", "baldest", "baldies", "balding", "baleful", "balkier", "balking", "ballads", "ballast", "ballets", "balling", "balloon", "ballots", "ballsed", "ballses", "balmier", "baloney", "balsams", "bamboos", "banaler", "bananas", "bandage", "bandied", "bandier", "bandies", "banding", "bandits", "baneful", "bangers", "banging", "bangles", "bankers", "banking", "banners", "banning", "bannock", "banquet", "banshee", "bantams", "banters", "banyans", "baobabs", "baptism", "baptist", "barbell", "barbers", "barbies", "barbing", "barfing", "bargain", "barging", "barkers", "barking", "barmaid", "barmier", "barneys", "baronet", "baroque", "barrack", "barrage", "barrels", "barrens", "barrier", "barring", "barrios", "barroom", "barrows", "barters", "baseman", "basemen", "bashful", "bashing", "baskets", "basking", "basques", "bassets", "bassist", "bassoon", "bastard", "basting", "bastion", "batched", "batches", "bathers", "bathing", "bathmat", "bathtub", "batsman", "batsmen", "battens", "batters", "battery", "battier", "batting", "battled", "battler", "battles", "baubles", "baulked", "bauxite", "bawdier", "bawdily", "bawling", "bayonet", "bazaars", "bazooka", "beached", "beaches", "beacons", "beadier", "beading", "beagled", "beagles", "beakers", "beaming", "beanbag", "beanies", "beaning", "bearded", "bearers", "bearing", "bearish", "beastly", "beaters", "beatify", "beating", "beatnik", "beavers", "becalms", "because", "beckons", "becomes", "bedaubs", "bedbugs", "bedding", "bedecks", "bedevil", "bedhead", "bedlams", "bedpans", "bedpost", "bedrock", "bedroll", "bedroom", "bedside", "bedsits", "bedsore", "bedtime", "beeches", "beefier", "beefing", "beehive", "beeline", "beepers", "beeping", "beeswax", "beetled", "beetles", "befalls", "befouls", "beggars", "begging", "begonia", "beguile", "behaved", "behaves", "beheads", "behests", "behinds", "beholds", "bejewel", "belated", "belayed", "belched", "belches", "beliefs", "believe", "bellboy", "bellhop", "bellied", "bellies", "belling", "bellows", "belongs", "beloved", "belting", "beltway", "belying", "bemoans", "bemused", "bemuses", "benched", "benches", "benders", "bendier", "bending", "beneath", "benefit", "benumbs", "benzene", "bequest", "berated", "berates", "bereave", "berried", "berries", "berserk", "berthed", "beseech", "besides", "besiege", "besomed", "bespeak", "bespoke", "bestial", "besting", "bestirs", "bestows", "betaken", "betakes", "bethink", "betided", "betides", "betoken", "betrays", "betroth", "betters", "betting", "bettors", "between", "betwixt", "bevvies", "bewails", "bewared", "bewares", "bewitch", "beyonds", "biasing", "bickers", "bicycle", "bidders", "biddies", "bidding", "biffing", "bifocal", "biggest", "biggies", "bighorn", "bigness", "bigoted", "bigotry", "bigwigs", "bikinis", "bilious", "bilking", "billets", "billies", "billing", "billion", "billows", "billowy", "binders", "bindery", "binding", "binging", "binning", "biology", "biomass", "bionics", "biopics", "bipedal", "biplane", "bipolar", "birched", "birches", "birdied", "birdies", "birding", "biretta", "birthed", "biscuit", "bisects", "bishops", "bismuth", "bistros", "bitched", "bitches", "bitings", "bitmaps", "bittern", "bitters", "bitumen", "bivalve", "bivouac", "bizarre", "blabbed", "blabber", "blacked", "blacken", "blacker", "bladder", "blading", "blagged", "blahing", "blaming", "blander", "blandly", "blanked", "blanker", "blanket", "blankly", "blaring", "blarney", "blasted", "blaster", "blatant", "blather", "blazers", "blazing", "blazons", "bleaker", "bleakly", "bleated", "bleeder", "bleeped", "bleeper", "blemish", "blended", "blender", "blessed", "blesses", "blether", "blights", "blinded", "blinder", "blindly", "blinked", "blinker", "blintze", "blissed", "blisses", "blister", "blither", "blitzed", "blitzes", "bloated", "bloater", "blobbed", "blocked", "blokish", "blonder", "blooded", "bloomed", "bloomer", "blooper", "blossom", "blotchy", "blotted", "blotter", "bloused", "blouses", "blowers", "blowgun", "blowing", "blowout", "blowups", "blubber", "blueish", "bluffed", "bluffer", "blunder", "blunted", "blunter", "bluntly", "blurred", "blurted", "blushed", "blusher", "blushes", "bluster", "boarded", "boarder", "boasted", "boaster", "boaters", "boating", "boatman", "boatmen", "bobbies", "bobbing", "bobbins", "bobbled", "bobbles", "bobcats", "bobsled", "bobtail", "bodegas", "bodging", "bodices", "bodkins", "boffins", "bogeyed", "boggier", "bogging", "boggled", "boggles", "boilers", "boiling", "boldest", "boleros", "bollard", "bolling", "bologna", "bolshie", "bolster", "bolting", "bombard", "bombast", "bombers", "bombing", "bonanza", "bonbons", "bondage", "bonding", "bonfire", "bonging", "boniest", "bonitos", "bonkers", "bonking", "bonnets", "bonnier", "bonsais", "bonuses", "boobies", "boobing", "boodles", "boogers", "boogied", "boogies", "bookend", "bookies", "booking", "bookish", "booklet", "boomers", "booming", "boonies", "boorish", "boosted", "booster", "bootees", "booties", "booting", "bootleg", "boozers", "boozier", "boozing", "bopping", "borders", "boredom", "borough", "borrows", "borscht", "borstal", "bossier", "bossily", "bossing", "botched", "botches", "bothers", "bottled", "bottler", "bottles", "bottoms", "boudoir", "boulder", "bounced", "bouncer", "bounces", "bounded", "bounden", "bounder", "bouquet", "bourbon", "bovines", "bowlers", "bowling", "boxcars", "boxroom", "boxwood", "boycott", "boyhood", "bracing", "bracken", "bracket", "bradawl", "bragged", "bragger", "braided", "braille", "brained", "braised", "braises", "braking", "bramble", "branded", "brasher", "brashly", "brassed", "brasses", "bravado", "bravely", "bravery", "bravest", "braving", "bravura", "brawled", "brawler", "braying", "brazens", "brazier", "breaded", "breadth", "breaker", "breakup", "breasts", "breathe", "breaths", "breathy", "breding", "breeder", "breezed", "breezes", "brevity", "brewers", "brewery", "brewing", "bribery", "bribing", "bricked", "brickie", "bridals", "bridged", "bridges", "bridled", "bridles", "briefed", "briefer", "briefly", "brigade", "brigand", "brights", "brimful", "brimmed", "brinier", "brioche", "brisked", "brisker", "brisket", "briskly", "bristle", "bristly", "brittle", "broaden", "broader", "broadly", "brocade", "brogans", "brogues", "broiled", "broiler", "brokers", "bromide", "bromine", "bronchi", "broncos", "bronzed", "bronzes", "brooded", "brooder", "brooked", "brothel", "brother", "brought", "browned", "browner", "brownie", "browsed", "browser", "browses", "bruised", "bruiser", "bruises", "bruited", "brunets", "brunted", "brushed", "brushes", "brusque", "brutish", "bubbled", "bubbles", "buckets", "buckeye", "bucking", "buckled", "buckler", "buckles", "buckram", "bucksaw", "bucolic", "buddies", "budding", "budgets", "budgies", "budging", "buffalo", "buffers", "buffets", "buffing", "buffoon", "bugaboo", "bugbear", "buggers", "buggery", "buggier", "buggies", "bugging", "buglers", "bugling", "builder", "buildup", "bulbing", "bulbous", "bulgier", "bulging", "bulimia", "bulimic", "bulkier", "bulking", "bulldog", "bullets", "bullied", "bullier", "bullies", "bulling", "bullion", "bullish", "bullock", "bullpen", "bulrush", "bulwark", "bumbags", "bumbled", "bumbler", "bumbles", "bummers", "bummest", "bumming", "bumpers", "bumpier", "bumping", "bumpkin", "bunched", "bunches", "bundled", "bundles", "bungees", "bunging", "bungled", "bungler", "bungles", "bunions", "bunkers", "bunking", "bunnies", "bunting", "buoyant", "buoying", "burbled", "burbles", "burdens", "burdock", "bureaus", "burgeon", "burgers", "burgher", "burglar", "burgled", "burgles", "burials", "burlier", "burners", "burning", "burnish", "burnout", "burping", "burring", "burrito", "burrows", "bursars", "bursary", "burying", "busbies", "busboys", "bushels", "bushier", "bushing", "bushman", "bushmen", "busiest", "buskers", "busking", "busload", "busters", "bustier", "busting", "bustled", "bustles", "busying", "butcher", "butches", "butlers", "butters", "buttery", "butties", "butting", "buttock", "buttons", "buxomer", "buyouts", "buzzard", "buzzers", "buzzing", "bygones", "bylines", "bywords", "cabanas", "cabaret", "cabbage", "cabbing", "cabinet", "cabling", "caboose", "cachets", "caching", "cackled", "cackles", "cadaver", "caddied", "caddies", "caddish", "cadence", "cadenza", "cadgers", "cadging", "cadmium", "caducei", "caesura", "caftans", "cagiest", "cagoule", "cahoots", "caisson", "cajoled", "cajoles", "calcify", "calcine", "calcite", "calcium", "calculi", "caliphs", "callers", "calling", "callous", "calmest", "calming", "caloric", "calorie", "calumny", "calving", "calypso", "calyxes", "cambers", "cambium", "cambric", "cameoed", "camerae", "cameras", "campers", "campest", "camphor", "campier", "camping", "canards", "canasta", "cancans", "cancels", "cancers", "candida", "candied", "candies", "candled", "candles", "canines", "cankers", "cannery", "cannier", "cannily", "canning", "cannons", "cantata", "canteen", "canters", "canting", "cantons", "cantors", "canvass", "canyons", "capable", "capably", "capered", "capital", "capitol", "caplets", "capping", "caprice", "capsize", "capstan", "capsule", "captain", "caption", "captive", "captors", "capture", "carafes", "caramel", "caravan", "caraway", "carbide", "carbine", "carbons", "carboys", "carcase", "carcass", "cardiac", "cardies", "carding", "careens", "careers", "careful", "carfare", "cargoes", "carhops", "caribou", "carjack", "carload", "carmine", "carnage", "caromed", "carotid", "carouse", "carpals", "carpels", "carpets", "carping", "carpool", "carport", "carrels", "carried", "carrier", "carries", "carrion", "carrots", "carroty", "carsick", "cartels", "carters", "carting", "cartons", "cartoon", "carvers", "carvery", "carving", "cascade", "cashews", "cashier", "cashing", "casings", "casinos", "caskets", "cassava", "cassias", "cassock", "casters", "casting", "castled", "castles", "castoff", "casuals", "casuist", "catalpa", "catarrh", "catbird", "catboat", "catcall", "catcher", "catches", "catered", "caterer", "catfish", "cathode", "cations", "catkins", "catnaps", "catsuit", "cattail", "cattery", "cattier", "cattily", "catwalk", "caulked", "causals", "causing", "caustic", "caution", "cavalry", "caveats", "caveman", "cavemen", "caverns", "cavorts", "cayenne", "caymans", "ceasing", "cedilla", "ceilidh", "ceiling", "celesta", "cellars", "celling", "cellist", "cements", "censers", "censors", "censure", "centaur", "centime", "central", "century", "ceramic", "cereals", "cerebra", "certain", "certify", "cession", "cesspit", "chaffed", "chafing", "chagrin", "chained", "chaired", "chaises", "chalets", "chalice", "chalked", "chamber", "chamois", "champed", "chanced", "chancel", "chances", "changed", "changes", "channel", "chanted", "chanter", "chantey", "chaotic", "chapati", "chapels", "chaplet", "chapped", "chapter", "charade", "charged", "charger", "charges", "charier", "charily", "chariot", "charity", "charlie", "charmed", "charmer", "charred", "charted", "charter", "chasers", "chasing", "chassis", "chasten", "chaster", "chatted", "chattel", "chatter", "cheapen", "cheaper", "cheaply", "cheated", "cheater", "checked", "checkup", "cheddar", "cheeked", "cheeped", "cheered", "cheerio", "cheesed", "cheeses", "cheetah", "cheffed", "chemise", "chemist", "cherish", "cheroot", "cherubs", "chervil", "chevron", "chewers", "chewier", "chewing", "chicane", "chicest", "chichis", "chicken", "chicory", "chiding", "chiefer", "chiefly", "chiffon", "chigger", "chignon", "childed", "childes", "chilies", "chilled", "chiller", "chimera", "chiming", "chimney", "chinked", "chinned", "chintzy", "chinwag", "chipped", "chipper", "chippie", "chirped", "chirrup", "chisels", "chivied", "chivies", "chiving", "chocked", "choicer", "choices", "chokers", "choking", "cholera", "chomped", "chooses", "chopped", "chopper", "chorale", "chorals", "choring", "chortle", "chowder", "chowing", "chromed", "chromes", "chronic", "chucked", "chuckle", "chuffed", "chugged", "chummed", "chunder", "chunter", "churned", "chutney", "cicadas", "ciggies", "cinched", "cinches", "cinders", "cinemas", "ciphers", "circled", "circles", "circlet", "circuit", "cissies", "cistern", "citadel", "citizen", "citrons", "civilly", "civvies", "clacked", "claimed", "clamber", "clammed", "clamped", "clanged", "clanger", "clanked", "clapped", "clapper", "clarets", "clarify", "clarion", "clarity", "clashed", "clashes", "clasped", "classed", "classes", "classic", "clatter", "clauses", "clawing", "clayier", "cleaned", "cleaner", "cleanly", "cleanse", "cleanup", "cleared", "clearer", "clearly", "cleaved", "cleaver", "cleaves", "clefted", "clement", "clerics", "clerked", "clewing", "clicked", "clients", "climate", "climbed", "climber", "clinics", "clinked", "clinker", "clipped", "clipper", "cliques", "cliquey", "cloaked", "clobber", "cloches", "clocked", "clodded", "clogged", "clomped", "cloning", "clonked", "clopped", "closely", "closest", "closets", "closing", "closure", "clothed", "clothes", "clotted", "cloture", "clouded", "clouted", "clovers", "clowned", "cloying", "clubbed", "clubber", "clucked", "clumped", "clunked", "clunker", "cluster", "clutter", "coached", "coaches", "coaling", "coarsen", "coarser", "coastal", "coasted", "coaster", "coating", "coaxing", "cobbers", "cobbing", "cobbled", "cobbler", "cobbles", "cobnuts", "cobwebs", "cocaine", "cochlea", "cockade", "cockier", "cockily", "cocking", "cockles", "cockney", "cockpit", "coconut", "cocoons", "codding", "coddled", "coddles", "codeine", "codfish", "codgers", "codices", "codicil", "coequal", "coerced", "coerces", "coevals", "coexist", "coffees", "coffers", "coffins", "cogency", "cognacs", "cognate", "cohabit", "cohered", "coheres", "cohorts", "coiffed", "coiling", "coinage", "coining", "coldest", "colicky", "colitis", "collage", "collars", "collate", "collect", "colleen", "college", "collide", "collied", "collier", "collies", "colling", "colloid", "collude", "cologne", "colonel", "colossi", "coltish", "columns", "combats", "combine", "combing", "comedic", "comfier", "comfort", "comical", "comings", "command", "commend", "comment", "commies", "commits", "commode", "commons", "commune", "commute", "compact", "company", "compare", "compass", "compels", "compete", "compile", "complex", "comport", "compose", "compost", "compote", "compute", "comrade", "concave", "conceal", "concede", "conceit", "concept", "concern", "concert", "conched", "conchie", "concise", "concoct", "concord", "concurs", "concuss", "condemn", "condole", "condoms", "condone", "condors", "conduce", "conduct", "conduit", "confabs", "confers", "confess", "confide", "confine", "confirm", "conform", "confuse", "confute", "congaed", "congeal", "congers", "congest", "conical", "conifer", "conjoin", "conjure", "conkers", "conking", "connect", "conning", "connive", "connote", "conquer", "consent", "consign", "consist", "console", "consort", "consuls", "consult", "consume", "contact", "contain", "contend", "content", "contest", "context", "contort", "contour", "control", "contuse", "convene", "convent", "convert", "conveys", "convict", "convoke", "convoys", "cookers", "cookery", "cookies", "cooking", "cookout", "coolant", "coolers", "coolest", "coolies", "cooling", "coopers", "cooping", "cooties", "copiers", "copilot", "copings", "copious", "coppers", "coppery", "copping", "copsing", "copters", "copulas", "copycat", "copying", "copyist", "coracle", "cordial", "cording", "cordite", "cordons", "corkage", "corkers", "corking", "corncob", "corneal", "corneas", "corners", "cornets", "cornice", "cornier", "corning", "cornrow", "corolla", "coronas", "coroner", "coronet", "corpora", "corpses", "corrals", "correct", "corries", "corrode", "corrupt", "corsage", "corsair", "corsets", "coshing", "cosigns", "cosines", "cossets", "costars", "costing", "costume", "coterie", "cottage", "cotters", "cottons", "couched", "couches", "cougars", "coughed", "council", "counsel", "counted", "counter", "country", "couping", "coupled", "couples", "couplet", "coupons", "courage", "courier", "coursed", "courser", "courses", "courted", "courtly", "cousins", "couture", "covered", "coverts", "coveted", "cowards", "cowbell", "cowbird", "cowboys", "cowered", "cowgirl", "cowhand", "cowhide", "cowlick", "cowling", "cowpats", "cowpoke", "cowries", "cowshed", "cowslip", "coxcomb", "coyness", "coyotes", "cozened", "crabbed", "cracked", "cracker", "crackle", "crackly", "crackup", "cradled", "cradles", "crafted", "crammed", "crammer", "cramped", "crampon", "cranial", "craning", "cranium", "cranked", "cranker", "crapped", "crapper", "crappie", "crashed", "crashes", "crasser", "crassly", "craters", "crating", "cravats", "cravens", "craving", "crawled", "crawler", "crayons", "crazier", "crazies", "crazily", "crazing", "creaked", "creamed", "creamer", "creased", "creases", "created", "creates", "creator", "credits", "creeled", "creeper", "cremate", "creoles", "crested", "cretins", "crevice", "crewing", "crewman", "crewmen", "cribbed", "cricked", "cricket", "criming", "crimped", "crimson", "cringed", "cringes", "crinkle", "crinkly", "cripple", "crisped", "crisper", "crisply", "critics", "critter", "croaked", "crochet", "crocked", "crofter", "cronies", "crooked", "crooned", "crooner", "cropped", "cropper", "croquet", "crosier", "crossed", "crosser", "crosses", "crossly", "crouped", "crowbar", "crowded", "crowing", "crowned", "crucial", "crucify", "crudely", "crudest", "crudity", "crueler", "cruelly", "cruelty", "cruised", "cruiser", "cruises", "cruller", "crumbed", "crumble", "crumbly", "crumpet", "crumple", "crunchy", "crusade", "crushed", "crusher", "crushes", "crusted", "crybaby", "cryings", "cryptic", "crystal", "cubical", "cubicle", "cubists", "cuboids", "cuckold", "cuckoos", "cuddled", "cuddles", "cudgels", "cuffing", "cuisine", "culling", "culotte", "culprit", "culture", "culvert", "cumming", "cumulus", "cunning", "cupcake", "cupfuls", "cupolas", "cupping", "curable", "curated", "curates", "curator", "curdled", "curdles", "curfews", "curious", "curlers", "curlews", "curlier", "curling", "currant", "current", "curried", "curries", "curring", "cursing", "cursive", "cursors", "cursory", "curtail", "curtain", "curtest", "curvier", "curving", "cushier", "cushion", "cuspids", "cussing", "custard", "custody", "customs", "cutaway", "cutback", "cuticle", "cutlass", "cutlery", "cutlets", "cutoffs", "cutouts", "cutters", "cutting", "cyanide", "cyborgs", "cycling", "cyclist", "cyclone", "cygnets", "cymbals", "cynical", "cyphers", "cypress", "czarina", "czarism", "czarist", "dabbing", "dabbled", "dabbler", "dabbles", "dactyls", "daddies", "daemons", "daffier", "daftest", "daggers", "dahlias", "dailies", "dairies", "daisies", "dallied", "dallies", "damaged", "damages", "damasks", "damming", "damning", "dampens", "dampers", "dampest", "damping", "damsels", "damsons", "dancers", "dancing", "danders", "dandier", "dandies", "dandify", "dandled", "dandles", "dangers", "dangled", "dangles", "dankest", "dappers", "dappled", "dapples", "daresay", "darkens", "darkest", "darkies", "darling", "darning", "darting", "dashiki", "dashing", "datives", "daubers", "daubing", "daunted", "dauphin", "dawdled", "dawdler", "dawdles", "dawning", "daybeds", "daycare", "daylong", "daytime", "dazzled", "dazzles", "deacons", "deadens", "deadest", "deadpan", "deafens", "deafest", "dealers", "dealing", "deanery", "deaning", "dearest", "dearies", "dearths", "deathly", "debacle", "debarks", "debased", "debases", "debated", "debater", "debates", "debauch", "debited", "debrief", "debtors", "debunks", "debuted", "decades", "decaffs", "decamps", "decants", "decayed", "decease", "deceits", "deceive", "decency", "decibel", "decided", "decider", "decides", "decimal", "decking", "declaim", "declare", "decline", "decoded", "decoder", "decodes", "decorum", "decoyed", "decreed", "decrees", "decried", "decries", "deduced", "deduces", "deducts", "deeding", "deejays", "deeming", "deepens", "deepest", "defaced", "defaces", "defamed", "defames", "default", "defeats", "defects", "defends", "defiant", "deficit", "defiled", "defiles", "defined", "definer", "defines", "deflate", "deflect", "deforms", "defraud", "defrays", "defrock", "defrost", "deftest", "defunct", "defused", "defuses", "defying", "degrade", "degrees", "deicers", "deicing", "deified", "deifies", "deigned", "deities", "dejects", "delayed", "deleted", "deletes", "delight", "delimit", "deliver", "delouse", "deluded", "deludes", "deluged", "deluges", "delving", "demands", "demeans", "demerit", "demesne", "demigod", "demised", "demises", "demists", "demoing", "demonic", "demoted", "demotes", "demotic", "demount", "demurer", "denials", "deniers", "denizen", "denoted", "denotes", "densely", "densest", "density", "denting", "dentist", "denture", "denuded", "denudes", "denying", "departs", "depends", "depicts", "deplane", "deplete", "deplore", "deploys", "deports", "deposed", "deposes", "deposit", "deprave", "depress", "deprive", "deputed", "deputes", "derails", "derange", "derbies", "derided", "derides", "derived", "derives", "derrick", "dervish", "descale", "descant", "descend", "descent", "deserts", "deserve", "designs", "desired", "desires", "desists", "deskill", "desktop", "despair", "despise", "despite", "despoil", "despots", "dessert", "destine", "destiny", "destroy", "details", "detains", "detects", "detests", "detours", "detoxed", "detoxes", "detract", "deucing", "devalue", "develop", "deviant", "deviate", "devices", "devilry", "devious", "devised", "devises", "devolve", "devoted", "devotee", "devotes", "devours", "dewdrop", "dewiest", "dewlaps", "diadems", "diagram", "dialect", "diamond", "diapers", "diaries", "diarist", "diatoms", "dibbled", "dibbles", "diciest", "dickens", "dickers", "dickeys", "dickier", "dictate", "diction", "diddled", "diddles", "diddums", "diesels", "dietary", "dieters", "dieting", "differs", "diffuse", "digests", "diggers", "digging", "digital", "dignify", "dignity", "digraph", "digress", "diktats", "dilated", "dilates", "dilemma", "dillies", "dilling", "diluted", "dilutes", "dimmers", "dimmest", "dimming", "dimness", "dimpled", "dimples", "dimwits", "dinette", "dingbat", "dingier", "dingies", "dingily", "dinging", "dingoes", "dinkier", "dinkies", "dinners", "dinning", "diocese", "diorama", "dioxide", "dioxins", "diploma", "dippers", "dippier", "dipping", "directs", "dirtied", "dirtier", "dirties", "disable", "disarms", "disavow", "disband", "disbars", "discard", "discern", "discoed", "discord", "discuss", "disdain", "disease", "disgust", "dishing", "dishpan", "dishrag", "dislike", "dismays", "dismiss", "disobey", "disowns", "dispels", "display", "disport", "dispose", "dispute", "disrobe", "disrupt", "dissect", "dissent", "dissing", "distaff", "distant", "distend", "distill", "distort", "disturb", "disused", "disuses", "ditched", "ditches", "dithers", "ditties", "dittoed", "diurnal", "diverge", "diverse", "diverts", "divests", "divided", "divider", "divides", "divined", "diviner", "divines", "divisor", "divorce", "divulge", "divvied", "divvies", "dizzied", "dizzier", "dizzies", "dizzily", "dobbing", "docents", "dockers", "dockets", "docking", "doctors", "dodders", "doddery", "dodgems", "dodgers", "dodgier", "dodging", "doffing", "dogcart", "dogfish", "doggier", "doggies", "dogging", "doggone", "doglegs", "dogsled", "dogtrot", "dogwood", "doilies", "doleful", "dollars", "dollies", "dolling", "dollops", "dolmens", "dolphin", "doltish", "domains", "donated", "donates", "donkeys", "donning", "donnish", "doodads", "doodahs", "doodled", "doodler", "doodles", "dooming", "dooring", "doorman", "doormat", "doormen", "doorway", "dopiest", "dorkier", "dormant", "dormers", "dormice", "dorsals", "dosages", "dossers", "dossier", "dossing", "dotings", "dottier", "dotting", "doubled", "doubles", "doublet", "doubted", "doubter", "douched", "douches", "doughty", "dourest", "dousing", "dovecot", "dowager", "dowdier", "dowdies", "dowdily", "downers", "downier", "downing", "dowries", "dowsers", "dowsing", "doyenne", "doziest", "drabber", "drachma", "draftee", "dragged", "dragnet", "dragons", "dragoon", "drained", "drainer", "drapers", "drapery", "draping", "drastic", "dratted", "drawers", "drawing", "drawled", "dreaded", "dreamer", "dredged", "dredger", "dredges", "dressed", "dresser", "dresses", "dribble", "driblet", "drifted", "drifter", "drilled", "drinker", "dripped", "drivels", "drivers", "driving", "drizzle", "drizzly", "droller", "droning", "drooled", "drooped", "droplet", "dropout", "dropped", "dropper", "drought", "drovers", "drowned", "drowsed", "drowses", "drubbed", "drudged", "drudges", "drugged", "druggie", "drummed", "drummer", "drunken", "drunker", "dryness", "drywall", "dualism", "duality", "dubbing", "dubiety", "dubious", "duchess", "duchies", "duckies", "ducking", "ductile", "ducting", "dudgeon", "duffers", "duffing", "dugouts", "dukedom", "dullard", "dullest", "dulling", "dumbest", "dumbing", "dummies", "dumpers", "dumpier", "dumpies", "dumping", "dungeon", "dunging", "dunking", "dunnest", "dunning", "duodena", "duopoly", "durable", "durably", "duskier", "dustbin", "dusters", "dustier", "dusting", "dustman", "dustmen", "dustpan", "duteous", "dutiful", "dwarfed", "dwarfer", "dweller", "dwindle", "dynamic", "dynamos", "dynasty", "eagerer", "eagerly", "eaglets", "earache", "eardrum", "earfuls", "earldom", "earlier", "earlobe", "earmark", "earmuff", "earners", "earnest", "earning", "earplug", "earring", "earshot", "earthed", "earthen", "earthly", "earwigs", "easiest", "eastern", "eatable", "ebonies", "echelon", "echoing", "eclipse", "ecology", "economy", "ecstasy", "eddying", "edgiest", "edgings", "edibles", "edifice", "edified", "edifies", "editing", "edition", "editors", "educate", "eeriest", "effaced", "effaces", "effects", "efforts", "eggcups", "egghead", "egoists", "egotism", "egotist", "eighths", "ejected", "elapsed", "elapses", "elastic", "elating", "elation", "elbowed", "elderly", "elected", "elector", "elegant", "elegiac", "elegies", "element", "elevate", "elevens", "elicits", "eliding", "elision", "elitism", "elitist", "elixirs", "ellipse", "eloping", "eluding", "elusive", "emailed", "emanate", "embalms", "embargo", "embarks", "embassy", "emblems", "embrace", "embroil", "embryos", "emended", "emerald", "emerged", "emerges", "emeried", "emeries", "emetics", "eminent", "emirate", "emitted", "emoting", "emotion", "emotive", "empathy", "emperor", "empires", "employs", "empower", "empress", "emptied", "emptier", "empties", "emptily", "emulate", "enabled", "enabler", "enables", "enacted", "enamels", "encamps", "encased", "encases", "enchant", "enclave", "enclose", "encoded", "encoder", "encodes", "encored", "encores", "encrust", "encrypt", "endears", "endemic", "endgame", "endings", "endives", "endless", "endorse", "endowed", "enduing", "endured", "endures", "endways", "enemies", "enfolds", "enforce", "engaged", "engages", "engined", "engines", "engorge", "engrave", "engross", "engulfs", "enhance", "enigmas", "enjoins", "enjoyed", "enlarge", "enlists", "enliven", "ennoble", "enraged", "enrages", "ensigns", "enslave", "ensnare", "ensuing", "ensured", "ensures", "entails", "entente", "entered", "enthuse", "enticed", "entices", "entitle", "entombs", "entrant", "entraps", "entreat", "entries", "entropy", "entrust", "entwine", "envelop", "envious", "envying", "enzymes", "epaulet", "epicure", "epigram", "episode", "epistle", "epitaph", "epithet", "epitome", "epochal", "epoxied", "epoxies", "epsilon", "equable", "equably", "equally", "equated", "equates", "equator", "equerry", "equines", "equinox", "erasers", "erasing", "erasure", "erected", "erectly", "ermines", "eroding", "erosion", "erosive", "erotica", "errands", "errants", "erratas", "erratic", "erratum", "erudite", "erupted", "escaped", "escapee", "escapes", "eschews", "escorts", "escrows", "escudos", "espouse", "espying", "esquire", "essayed", "essence", "estates", "esteems", "estuary", "etchers", "etching", "eternal", "ethanol", "ethical", "ethnics", "eugenic", "eunuchs", "euphony", "eurekas", "evacuee", "evading", "evasion", "evasive", "evenest", "evening", "evicted", "evident", "evinced", "evinces", "evoking", "evolved", "evolves", "exacted", "exacter", "exactly", "exalted", "examine", "example", "exceeds", "excepts", "excerpt", "excised", "excises", "excited", "excites", "exclaim", "exclude", "excreta", "excrete", "excused", "excuses", "execute", "exempts", "exerted", "exhaled", "exhales", "exhaust", "exhibit", "exhorts", "exhumed", "exhumes", "exigent", "exiling", "existed", "exiting", "exotica", "exotics", "expands", "expanse", "expects", "expends", "expense", "experts", "expiate", "expired", "expires", "explain", "explode", "exploit", "explore", "exports", "exposed", "exposes", "expound", "express", "expunge", "extends", "extents", "extinct", "extorts", "extract", "extreme", "extrude", "exuding", "exulted", "eyeball", "eyebrow", "eyefuls", "eyelash", "eyelets", "eyelids", "eyesore", "fabrics", "facades", "faceted", "facials", "facings", "faction", "factors", "factory", "factual", "faculty", "faddish", "faffing", "fagging", "failing", "failure", "fainest", "faining", "fainted", "fainter", "faintly", "fairest", "fairies", "fairway", "faithed", "falcons", "fallacy", "falling", "falloff", "fallout", "fallows", "falsely", "falsest", "falsies", "falsify", "falsity", "falters", "famines", "fanatic", "fancied", "fancier", "fancies", "fancily", "fanfare", "fannies", "fanning", "fantasy", "fanzine", "faraway", "farmers", "farming", "farrago", "farrier", "farrows", "farther", "farting", "fascias", "fascism", "fascist", "fashion", "fastens", "fastest", "fasting", "fatally", "fateful", "fathead", "fathers", "fathoms", "fatigue", "fatness", "fattens", "fattest", "fattier", "fatties", "fatuous", "faucets", "faulted", "fawning", "fearful", "fearing", "feasted", "feather", "feature", "febrile", "federal", "fedoras", "feebler", "feedbag", "feeders", "feeding", "feelers", "feeling", "feigned", "feinted", "felines", "fellers", "fellest", "felling", "fellows", "felting", "females", "femoral", "fencers", "fencing", "fenders", "fending", "ferment", "ferrets", "ferried", "ferries", "ferrous", "ferrule", "fertile", "fervent", "fessing", "festals", "festers", "festive", "festoon", "fetched", "fetches", "fetlock", "fetters", "feuding", "fevered", "fibbers", "fibbing", "fibroid", "fibrous", "fibulae", "fickler", "fiction", "fiddled", "fiddler", "fiddles", "fidgets", "fidgety", "fielded", "fielder", "fiercer", "fierier", "fiestas", "fifteen", "fifties", "figging", "fighter", "figment", "figured", "figures", "filbert", "filched", "filches", "filings", "fillers", "fillets", "fillies", "filling", "fillips", "filmier", "filming", "filters", "finagle", "finales", "finally", "finance", "finches", "finders", "finding", "finesse", "fingers", "finicky", "finises", "finking", "finnier", "firearm", "firebug", "firefly", "fireman", "firemen", "firings", "firmest", "firming", "firring", "firstly", "fiscals", "fishers", "fishery", "fishier", "fishing", "fishnet", "fissile", "fission", "fissure", "fistful", "fitment", "fitness", "fitters", "fittest", "fitting", "fixable", "fixated", "fixates", "fixedly", "fixings", "fixture", "fizzier", "fizzing", "fizzled", "fizzles", "flaccid", "flagged", "flagons", "flailed", "flakier", "flaking", "flambes", "flaming", "flanges", "flanked", "flannel", "flapped", "flapper", "flaring", "flashed", "flasher", "flashes", "flatbed", "flatcar", "flatlet", "flatted", "flatten", "flatter", "flattop", "flaunts", "flawing", "flaying", "fleabag", "fleapit", "flecked", "fledged", "fleeced", "fleeces", "fleeing", "fleeted", "fleeter", "fleshed", "fleshes", "fleshly", "flexing", "flicked", "flicker", "flights", "flighty", "flipped", "flipper", "flirted", "flitted", "floated", "floater", "flocked", "flogged", "flooded", "flooder", "floored", "flopped", "florets", "florins", "florist", "flossed", "flosses", "flotsam", "flounce", "floured", "flouted", "flowers", "flowery", "flowing", "flubbed", "fluency", "fluents", "fluffed", "fluidly", "flukier", "fluking", "flummox", "flunked", "flushed", "flusher", "flushes", "fluster", "fluting", "flutist", "flutter", "fluvial", "fluxing", "flyaway", "flyleaf", "flyover", "flypast", "foaling", "foamier", "foaming", "fobbing", "focused", "focuses", "fodders", "foggier", "fogging", "foghorn", "foibles", "foiling", "foisted", "folders", "folding", "foliage", "follies", "follows", "foments", "fondant", "fondest", "fonding", "fondled", "fondles", "fondues", "foodies", "foolery", "fooling", "foolish", "footage", "footers", "footing", "footman", "footmen", "footsie", "fopping", "foppish", "foraged", "forager", "forages", "forayed", "forbade", "forbear", "forbids", "forbore", "forceps", "forcing", "fording", "forearm", "foreign", "foreleg", "foreman", "foremen", "foresaw", "foresee", "forests", "forever", "forfeit", "forgave", "forgers", "forgery", "forgets", "forging", "forgive", "forgoes", "forgone", "forkful", "forking", "forlorn", "formals", "formats", "forming", "formula", "forsake", "forsook", "forties", "fortify", "fortune", "forward", "forwent", "fossils", "fosters", "foulest", "fouling", "founded", "founder", "foundry", "fourths", "fowling", "foxhole", "foxhunt", "foxiest", "foxtrot", "fractal", "fragile", "frailer", "frailty", "framers", "framing", "franked", "franker", "frankly", "frantic", "frappes", "fraught", "fraying", "frazzle", "freaked", "freckle", "freebie", "freedom", "freeing", "freeman", "freemen", "freesia", "freeway", "freezer", "freezes", "freight", "freshen", "fresher", "freshet", "freshly", "fretful", "fretted", "friable", "fridges", "friends", "friezed", "friezes", "frigate", "frigged", "frights", "frilled", "fringed", "fringes", "frisked", "frisson", "fritter", "frizzed", "frizzes", "frizzle", "frogman", "frogmen", "frolics", "frontal", "fronted", "frosted", "frothed", "frowned", "fruited", "fuchsia", "fuckers", "fucking", "fuddled", "fuddles", "fudging", "fulcrum", "fullest", "fulling", "fulsome", "fumbled", "fumbler", "fumbles", "funding", "funeral", "funfair", "fungals", "fungoid", "fungous", "funkier", "funking", "funnels", "funnest", "funnier", "funnies", "funnily", "furbish", "furious", "furling", "furlong", "furnace", "furnish", "furrier", "furring", "furrows", "further", "furtive", "fusible", "fusions", "fussier", "fussily", "fussing", "fusspot", "fustian", "fustier", "futures", "futzing", "fuzzier", "fuzzily", "fuzzing", "gabbier", "gabbing", "gabbled", "gabbles", "gabling", "gadding", "gadgets", "gaffers", "gaffing", "gagging", "gaggles", "gainers", "gainful", "gaining", "gainsay", "gaiters", "gallant", "galleon", "gallery", "galleys", "galling", "gallium", "gallons", "gallops", "gallows", "galores", "galumph", "gambits", "gambled", "gambler", "gambles", "gambols", "gametes", "gamiest", "gamines", "ganders", "ganging", "ganglia", "gangsta", "gangway", "gannets", "gantlet", "gaolers", "gaoling", "gapings", "garaged", "garages", "garbage", "garbing", "garbled", "garbles", "gardens", "gargled", "gargles", "garland", "garlics", "garment", "garners", "garnets", "garnish", "garrets", "garrote", "garters", "gasbags", "gaseous", "gashing", "gaskets", "gasohol", "gasping", "gassier", "gassing", "gastric", "gateaux", "gateway", "gathers", "gaucher", "gauchos", "gaudier", "gaudily", "gaunted", "gaunter", "gauzier", "gavotte", "gawkier", "gawkies", "gawkily", "gawking", "gawping", "gayness", "gazebos", "gazelle", "gazette", "gazumps", "gearbox", "gearing", "geekier", "geezers", "gelatin", "gelding", "gelling", "genders", "general", "generic", "geneses", "genesis", "genetic", "genital", "genning", "genomes", "genteel", "gentian", "gentile", "gentled", "gentler", "gentles", "genuine", "geology", "gerbils", "germane", "gerunds", "gestalt", "gestate", "gesture", "getaway", "getting", "gewgaws", "geysers", "ghastly", "gherkin", "ghettos", "ghosted", "ghostly", "gibbers", "gibbets", "gibbons", "giblets", "giddier", "giddily", "gifting", "gigging", "giggled", "giggler", "giggles", "gigolos", "gilding", "gillies", "gimlets", "gimmick", "gimpier", "gingers", "gingery", "gingham", "ginning", "ginseng", "giraffe", "girders", "girding", "girdled", "girdles", "girlish", "girting", "gizzard", "glacial", "glacier", "gladden", "gladder", "glanced", "glances", "glaring", "glassed", "glasses", "glazier", "glazing", "gleamed", "gleaned", "gleeful", "glibber", "gliders", "gliding", "glimmer", "glimpse", "glinted", "glisten", "glitter", "gloated", "globing", "globule", "glopped", "gloried", "glories", "glorify", "glossed", "glosses", "glottis", "gloving", "glowers", "glowing", "glucose", "gluiest", "glummer", "glutted", "glutton", "gnarled", "gnashed", "gnashes", "gnawing", "gnocchi", "gnomish", "goading", "goalies", "goaling", "goatees", "gobbets", "gobbing", "gobbled", "gobbler", "gobbles", "goblets", "goblins", "goddamn", "goddess", "godhood", "godless", "godlier", "godlike", "godsend", "godsons", "goggled", "goggles", "goldest", "golfers", "golfing", "gollies", "gondola", "gonging", "goobers", "goodbye", "goodies", "goodish", "goofier", "goofing", "gooiest", "goosing", "gophers", "gorging", "gorgons", "goriest", "gorilla", "gosling", "gospels", "gossips", "gossipy", "gouache", "gougers", "gouging", "goulash", "gourmet", "goutier", "governs", "gowning", "grabbed", "grabber", "gracing", "grackle", "graders", "grading", "gradual", "grafted", "grafter", "grammar", "grammes", "granary", "grandad", "grandee", "grander", "grandly", "grandma", "grandpa", "granges", "granite", "granola", "granted", "granule", "graphed", "graphic", "graping", "grapnel", "grapple", "grasped", "grassed", "grasses", "graters", "gratify", "grating", "gratins", "gravels", "gravely", "gravest", "gravies", "graving", "gravity", "grayish", "grazing", "greased", "greaser", "greases", "greater", "greatly", "greened", "greener", "greeted", "gremlin", "grenade", "gridded", "griddle", "griding", "grieved", "grieves", "griffin", "grilled", "grilles", "grimace", "grimier", "griming", "grimmer", "grinder", "gringos", "grinned", "griping", "gripped", "grippes", "gristle", "gristly", "gritted", "gritter", "grizzle", "grizzly", "groaned", "grocers", "grocery", "grommet", "groomed", "grooved", "grooves", "groping", "grossed", "grosser", "grosses", "grossly", "grouchy", "grounds", "grouped", "grouper", "groupie", "groused", "grouses", "grouted", "grovels", "growers", "growing", "growled", "grownup", "growths", "groynes", "grubbed", "grudged", "grudges", "gruffed", "gruffer", "gruffly", "grumble", "grunted", "guarded", "guessed", "guesser", "guesses", "guested", "guffaws", "guiding", "guilder", "guiling", "guineas", "guitars", "gulches", "gullets", "gullies", "gulling", "gulping", "gumball", "gumboot", "gumdrop", "gummier", "gumming", "gumshoe", "gunboat", "gunfire", "gunners", "gunnery", "gunning", "gunshot", "gunwale", "guppies", "gurgled", "gurgles", "gurneys", "gushers", "gushier", "gushing", "gussets", "gustier", "gusting", "gutless", "gutsier", "gutters", "gutting", "guvnors", "guzzled", "guzzler", "guzzles", "gymnast", "gymslip", "gypping", "gypsies", "gyrated", "gyrates", "habitat", "hackers", "hacking", "hackles", "hackney", "hacksaw", "haddock", "hafnium", "haggard", "hagging", "haggled", "haggler", "haggles", "hailing", "haircut", "hairdos", "hairier", "hairnet", "hairpin", "halberd", "halcyon", "halfway", "halfwit", "halibut", "hallows", "hallway", "halogen", "haloing", "halters", "halting", "halving", "halyard", "hamlets", "hammers", "hamming", "hammock", "hampers", "hamster", "handbag", "handcar", "handful", "handgun", "handier", "handily", "handing", "handled", "handler", "handles", "handout", "handsaw", "handset", "hangars", "hangdog", "hangers", "hanging", "hangman", "hangmen", "hangout", "hankers", "hankies", "hansoms", "hapless", "happens", "happier", "happily", "hardens", "hardest", "hardier", "hardily", "hardtop", "harelip", "haricot", "harking", "harlots", "harmful", "harming", "harmony", "harness", "harpies", "harping", "harpist", "harpoon", "harried", "harries", "harrows", "harsher", "harshly", "harvest", "hashing", "hashish", "hassled", "hassles", "hassock", "hastens", "hastier", "hastily", "hasting", "hatband", "hatched", "hatches", "hatchet", "hateful", "hatpins", "hatreds", "hatters", "hatting", "haughty", "haulage", "haulers", "haulier", "hauling", "haunted", "hauteur", "hawkers", "hawking", "hawkish", "hawsers", "haycock", "hayloft", "haymows", "hayrick", "hayride", "hayseed", "haywire", "hazards", "haziest", "hazings", "headers", "headier", "heading", "headman", "headmen", "headset", "headway", "healers", "healing", "healthy", "heaping", "hearers", "hearing", "hearken", "hearsay", "hearsed", "hearses", "hearted", "hearten", "hearths", "heaters", "heathen", "heather", "heating", "heavens", "heavier", "heavies", "heavily", "heaving", "heckled", "heckler", "heckles", "hectare", "hectics", "hectors", "hedging", "heedful", "heeding", "heehaws", "heeling", "heftier", "heftily", "hefting", "heifers", "heights", "heinous", "heiress", "heisted", "helical", "helices", "helipad", "helling", "hellion", "hellish", "helluva", "helmets", "helpers", "helpful", "helping", "hemline", "hemlock", "hemming", "hennaed", "henpeck", "hepatic", "heppest", "heralds", "herbage", "herbals", "herding", "heretic", "hermits", "hernias", "heroics", "heroine", "heroins", "heroism", "herring", "herself", "hessian", "heteros", "hexagon", "heydays", "hibachi", "hickeys", "hickory", "hideous", "hideout", "hidings", "highboy", "highers", "highest", "highway", "hijacks", "hillier", "hillock", "hilltop", "himself", "hinders", "hinging", "hinting", "hipbath", "hippest", "hippier", "hippies", "hipping", "hipster", "hirsute", "hissing", "history", "hitched", "hitches", "hitters", "hitting", "hoarded", "hoarder", "hoarier", "hoarser", "hoaxers", "hoaxing", "hobbies", "hobbled", "hobbles", "hobnail", "hobnobs", "hoboing", "hocking", "hoedown", "hogging", "hoggish", "hogwash", "hoicked", "hoisted", "hokiest", "holdall", "holders", "holding", "holdout", "holdups", "holiday", "holiest", "hollers", "hollies", "hollows", "holster", "homaged", "homages", "homburg", "homeboy", "homered", "homiest", "homonym", "honchos", "honesty", "honeyed", "honkies", "honking", "hooding", "hoodlum", "hoodoos", "hoofers", "hoofing", "hookahs", "hookers", "hookier", "hooking", "hookups", "hooping", "hoorays", "hooters", "hooting", "hoovers", "hopeful", "hoppers", "hopping", "hording", "horizon", "hormone", "hornets", "hornier", "horrify", "horrors", "horsier", "horsing", "hosanna", "hosiery", "hospice", "hostage", "hostels", "hostess", "hostile", "hosting", "hostler", "hotbeds", "hotcake", "hotfoot", "hothead", "hotness", "hotpots", "hotshot", "hottest", "hotting", "hounded", "housing", "hovered", "howdahs", "howdied", "howdies", "however", "howlers", "howling", "hubbies", "hubbubs", "hubcaps", "huddled", "huddles", "huffier", "huffily", "huffing", "hugging", "hulaing", "hulking", "hulling", "humaner", "humanly", "humbled", "humbler", "humbles", "humbugs", "humdrum", "humerus", "humidor", "humming", "hummock", "humping", "hunched", "hunches", "hundred", "hungers", "hunkers", "hunkier", "hunters", "hunting", "hurdled", "hurdler", "hurdles", "hurlers", "hurling", "hurried", "hurries", "hurtful", "hurting", "hurtled", "hurtles", "husband", "hushing", "huskers", "huskier", "huskies", "huskily", "husking", "hussars", "hussies", "hustled", "hustler", "hustles", "hutched", "hutches", "hybrids", "hydrant", "hydrate", "hygiene", "hymnals", "hymning", "hyphens", "iambics", "iceberg", "icecaps", "icicles", "iciness", "ickiest", "ideally", "idiotic", "idyllic", "iffiest", "igneous", "ignited", "ignites", "ignoble", "ignobly", "ignored", "ignores", "iguanas", "illegal", "illicit", "illness", "imagery", "imagine", "imaging", "imbibed", "imbibes", "imbuing", "imitate", "immense", "immerse", "immoral", "immured", "immures", "impacts", "impairs", "impalas", "impaled", "impales", "impanel", "imparts", "impasse", "impeach", "impeded", "impedes", "impends", "imperil", "impetus", "impiety", "impinge", "impious", "implant", "implied", "implies", "implode", "implore", "imports", "imposed", "imposes", "impound", "impress", "imprint", "improve", "impugns", "impulse", "impurer", "imputed", "imputes", "inanely", "inanest", "inanity", "inboard", "inbound", "inbreds", "inbreed", "inbuilt", "incense", "inching", "incised", "incises", "incisor", "incited", "incites", "incline", "include", "incomer", "incomes", "incubus", "indeeds", "indents", "indexed", "indexes", "indicts", "indoors", "induced", "induces", "inducts", "indulge", "ineptly", "inertia", "inertly", "inexact", "infancy", "infants", "infects", "inferno", "infests", "infidel", "infield", "infills", "inflame", "inflate", "inflect", "inflict", "inflows", "informs", "infused", "infuses", "ingests", "ingrain", "ingrate", "ingress", "ingrown", "inhabit", "inhaled", "inhaler", "inhales", "inhered", "inheres", "inherit", "inhibit", "inhuman", "initial", "injects", "injured", "injures", "inkblot", "inkiest", "inkling", "inkwell", "inmates", "innards", "innings", "inquest", "inroads", "insaner", "inseams", "insects", "inserts", "inshore", "insider", "insides", "insight", "insipid", "insists", "insofar", "insoles", "inspect", "inspire", "install", "instant", "instead", "insteps", "instill", "insular", "insulin", "insults", "insured", "insurer", "insures", "intakes", "integer", "intends", "intense", "intents", "interim", "interns", "intoned", "intones", "intrude", "intuits", "inuring", "invaded", "invader", "invades", "invalid", "inveigh", "invents", "inverse", "inverts", "invests", "invited", "invites", "invoice", "invoked", "invokes", "involve", "inwards", "ipecacs", "irately", "iratest", "iridium", "irksome", "ironies", "ironing", "islands", "isobars", "isolate", "isotope", "issuing", "isthmus", "italics", "itchier", "itching", "iterate", "ivories", "jabbers", "jabbing", "jackals", "jackass", "jackdaw", "jackets", "jacking", "jackpot", "jaguars", "jailers", "jailing", "jambing", "jammier", "jamming", "jangled", "jangles", "janitor", "jarring", "jasmine", "jaunted", "javelin", "jawbone", "jawline", "jaywalk", "jazzier", "jazzing", "jealous", "jeering", "jellied", "jellies", "jelling", "jemmied", "jemmies", "jerkier", "jerkily", "jerking", "jerkins", "jerseys", "jesters", "jesting", "jetties", "jetting", "jewelry", "jibbing", "jiffies", "jiggers", "jigging", "jiggled", "jiggles", "jigsaws", "jilting", "jimmied", "jimmies", "jingled", "jingles", "jinking", "jinxing", "jitneys", "jitters", "jittery", "jobbers", "jobbing", "jobless", "jockeys", "jocking", "jocular", "joggers", "jogging", "joggled", "joggles", "joiners", "joinery", "joining", "jointed", "jointly", "jokiest", "jollied", "jollier", "jollies", "jollity", "jolting", "jonquil", "joshing", "jostled", "jostles", "jotters", "jotting", "jounced", "jounces", "journal", "journey", "journos", "jousted", "joyless", "joyride", "joyrode", "jubilee", "judders", "judging", "jugfuls", "jugging", "juggled", "juggler", "juggles", "jugular", "juicers", "juicier", "juicing", "jujitsu", "jujubes", "jukebox", "jumbled", "jumbles", "jumpers", "jumpier", "jumping", "jungles", "juniors", "juniper", "junkers", "junkets", "junkier", "junkies", "junking", "jurists", "juryman", "jurymen", "justest", "justice", "justify", "jutting", "karakul", "karaoke", "katydid", "kayaked", "keeling", "keenest", "keening", "keepers", "keeping", "kegging", "kelvins", "kennels", "kenning", "keratin", "kernels", "kestrel", "ketches", "ketchup", "kettles", "keyhole", "keynote", "keypads", "keyword", "kibbutz", "kickers", "kickier", "kicking", "kickoff", "kidders", "kiddied", "kiddies", "kidding", "kidnaps", "kidneys", "killers", "killing", "killjoy", "kilning", "kiloton", "kimonos", "kindest", "kindled", "kindles", "kindred", "kinetic", "kinfolk", "kingdom", "kingpin", "kinkier", "kinking", "kinship", "kinsman", "kinsmen", "kippers", "kipping", "kirking", "kissers", "kissing", "kitchen", "kithing", "kitschy", "kittens", "kitties", "kitting", "klaxons", "klutzes", "knacked", "knacker", "knavery", "knavish", "kneaded", "kneader", "kneecap", "kneeing", "knelled", "knicker", "knifing", "knights", "knitted", "knitter", "knobbly", "knocked", "knocker", "knotted", "knowing", "knuckle", "kookier", "kooking", "kopecks", "koshers", "kowtows", "krypton", "kumquat", "labials", "laciest", "lackeys", "lacking", "laconic", "lacquer", "lactate", "lactose", "lacunae", "ladders", "laddies", "laddish", "ladings", "ladling", "ladybug", "laggard", "lagging", "lagoons", "lambada", "lambent", "lambing", "lambkin", "laments", "lamming", "lampoon", "lamprey", "lancers", "lancets", "lancing", "landing", "languid", "languor", "lankest", "lankier", "lanolin", "lantern", "lanyard", "lapdogs", "lapping", "lapsing", "laptops", "lapwing", "larceny", "larches", "larders", "larding", "largely", "largess", "largest", "largish", "lariats", "larking", "lasagna", "lashing", "lassies", "lassoed", "lasting", "latched", "latches", "latency", "latents", "lateral", "lathers", "lathery", "lathing", "latrine", "lattice", "lauding", "laughed", "launder", "laundry", "laurels", "lawless", "lawsuit", "lawyers", "laxness", "layaway", "layered", "layette", "layoffs", "layouts", "layover", "laziest", "lazying", "leached", "leaches", "leaders", "leading", "leafier", "leafing", "leaflet", "leagued", "leagues", "leakage", "leakier", "leaking", "leanest", "leaning", "leaping", "learner", "leashed", "leashes", "leasing", "leather", "leavens", "leavers", "leaving", "lechers", "lechery", "leching", "lectern", "lecture", "ledgers", "leeched", "leeches", "leerier", "leering", "leeward", "leftest", "lefties", "leftism", "leftist", "legally", "legated", "legatee", "legates", "legatos", "legends", "leggier", "legging", "legible", "legibly", "legions", "legless", "legroom", "legumes", "legwork", "leisure", "lemming", "lemoned", "lenders", "lending", "lengths", "lengthy", "lenient", "lentils", "leonine", "leopard", "leotard", "leprosy", "leprous", "lesbian", "lesions", "lessees", "lessens", "lessons", "lessors", "letches", "letdown", "lethals", "letters", "letting", "lettuce", "levered", "levying", "lewdest", "lexical", "lexicon", "liaised", "liaises", "liaison", "libbing", "liberal", "liberty", "libidos", "library", "lichens", "licking", "liefest", "lifting", "liftoff", "lighted", "lighten", "lighter", "lightly", "lignite", "likable", "likened", "lilting", "limbers", "limboed", "limeade", "limiest", "limited", "limning", "limpest", "limpets", "limping", "linctus", "lindens", "lineage", "lineman", "linemen", "lineups", "lingers", "lingoes", "lingual", "linings", "linkage", "linking", "linkman", "linkmen", "linkups", "linnets", "linseed", "lintels", "lioness", "lipread", "liquefy", "liqueur", "liquids", "liquors", "lisping", "lissome", "listens", "listing", "litchis", "literal", "lithely", "lithest", "lithium", "litters", "littler", "liturgy", "livable", "livened", "lividly", "livings", "lizards", "loaders", "loading", "loafers", "loafing", "loamier", "loaners", "loaning", "loathed", "loather", "loathes", "lobbied", "lobbies", "lobbing", "lobster", "localed", "locales", "locally", "located", "locates", "lockers", "lockets", "locking", "lockjaw", "lockout", "lockups", "locusts", "lodgers", "lodging", "loftier", "loftily", "lofting", "logbook", "loggers", "logging", "logical", "logjams", "loiters", "lollies", "lolling", "lollops", "longbow", "longest", "longing", "longish", "loofahs", "lookers", "looking", "lookout", "looming", "loonier", "loonies", "loopier", "looping", "loosely", "loosens", "loosest", "loosing", "looters", "looting", "lopping", "lording", "lorries", "lotions", "lottery", "lotuses", "loudest", "lounged", "lounger", "lounges", "louring", "lousier", "lousing", "loutish", "lovable", "lovings", "lowbrow", "lowdown", "lowered", "lowland", "lowlier", "lowness", "loyaler", "loyally", "loyalty", "lozenge", "lubbers", "lucidly", "luckier", "luckily", "lucking", "luggage", "lugging", "lughole", "lullaby", "lulling", "lumbago", "lumbers", "lumpier", "lumping", "lumpish", "lunatic", "lunched", "lunches", "lungful", "lunging", "lurched", "lurches", "luridly", "lurking", "lushest", "lustful", "lustier", "lustily", "lusting", "luvvies", "lyceums", "lynched", "lynches", "lyrical", "macabre", "macadam", "machete", "machine", "macrons", "madcaps", "maddens", "madders", "maddest", "madness", "maestro", "mafiosi", "mafioso", "magenta", "maggots", "magical", "magnate", "magneto", "magnets", "magnify", "magnums", "magpies", "mahatma", "maidens", "mailbag", "mailbox", "mailers", "mailing", "mailman", "mailmen", "maiming", "majesty", "majored", "majorly", "makeups", "makings", "malaise", "malaria", "maliced", "malices", "maligns", "mallard", "mallets", "malling", "mallows", "malteds", "malting", "mamboed", "mammals", "mammary", "mammies", "mammoth", "manacle", "managed", "manager", "manages", "manatee", "mandala", "mandate", "mangers", "mangier", "manging", "mangled", "mangles", "mangoes", "manhole", "manhood", "manhunt", "maniacs", "manikin", "mankind", "manlier", "manners", "manning", "mannish", "mansard", "mansion", "mantels", "mantled", "mantles", "mantras", "manuals", "manumit", "manured", "manures", "mapping", "marabou", "maracas", "marauds", "marbled", "marbles", "marched", "marcher", "marches", "margins", "marimba", "marinas", "mariner", "marines", "marital", "markers", "markets", "marking", "markups", "marlins", "marmots", "maroons", "marquee", "marques", "marquis", "married", "marries", "marring", "marrows", "marshal", "marshes", "martens", "martial", "marting", "martini", "martins", "martyrs", "marvels", "mascara", "mascots", "mashers", "mashing", "masking", "masonic", "masonry", "masques", "massage", "masseur", "massifs", "massing", "massive", "masters", "mastery", "mastiff", "mastoid", "matador", "matched", "matches", "matrons", "matters", "matting", "mattock", "matured", "maturer", "matures", "matzohs", "matzoth", "maudlin", "mauling", "maunder", "mawkish", "maxilla", "maximal", "maximum", "maydays", "mayoral", "maypole", "meadows", "mealier", "mealies", "mealing", "meander", "meanest", "meanies", "meaning", "measles", "measure", "meatier", "meddled", "meddler", "meddles", "medians", "mediate", "medical", "medicos", "mediums", "medleys", "medulla", "meekest", "meeting", "megaton", "melange", "melanin", "melding", "mellows", "melodic", "melting", "members", "memento", "memoirs", "menaced", "menaces", "menages", "menders", "mending", "menfolk", "menials", "menorah", "menthol", "mention", "mentors", "mercies", "mercury", "mergers", "merging", "merinos", "merited", "mermaid", "merrier", "merrily", "mescals", "meshing", "message", "messiah", "messier", "messily", "messing", "mestizo", "meteors", "methane", "methods", "metrics", "mewling", "miasmas", "mickeys", "microbe", "microns", "middies", "middles", "midgets", "midland", "midmost", "midriff", "midterm", "midtown", "midways", "midweek", "midwife", "midyear", "miffing", "migrant", "migrate", "mildest", "mildews", "mileage", "milieus", "militia", "milkier", "milking", "milkman", "milkmen", "milksop", "millage", "millers", "milling", "million", "mimetic", "mimicry", "mimosas", "minaret", "mincers", "mincing", "minders", "mindful", "minding", "mindset", "mineral", "mingled", "mingles", "minibar", "minibus", "minicab", "minicam", "minimal", "minimum", "minions", "minivan", "minnows", "minored", "minster", "mintier", "minting", "minuend", "minuets", "minuses", "minuted", "minuter", "minutes", "minutia", "miracle", "mirages", "mirrors", "miscall", "miscast", "miscued", "miscues", "misdeal", "misdeed", "misdoes", "misdone", "miserly", "misfire", "misfits", "mishaps", "mishear", "mishits", "mislaid", "mislays", "mislead", "misname", "misplay", "misread", "misrule", "missals", "missile", "missing", "mission", "missive", "misstep", "mistake", "misters", "mistier", "mistily", "mistime", "misting", "mistook", "mistype", "misused", "misuses", "mitosis", "mittens", "mixture", "mizzens", "moaners", "moaning", "moating", "mobbing", "mobiles", "mobster", "mockers", "mockery", "mocking", "moderns", "modesty", "modicum", "modular", "modules", "modulus", "moggies", "moisten", "moister", "moistly", "molders", "molests", "mollify", "mollusk", "molting", "moments", "mommies", "monarch", "moneyed", "mongers", "mongols", "mongrel", "moniker", "monitor", "monkeys", "monocle", "monsoon", "monster", "montage", "monthly", "mooched", "moocher", "mooches", "moodier", "moodily", "mooning", "moonlit", "moorhen", "mooring", "mooting", "moppets", "mopping", "moraine", "morally", "mordant", "moreish", "morgues", "morning", "morocco", "moronic", "morphed", "morphia", "morrows", "morsels", "mortals", "mortars", "mortify", "mortise", "mosaics", "moseyed", "moshing", "mosques", "mossier", "mossies", "mossing", "mothers", "motiles", "motions", "motives", "motleys", "motlier", "motored", "mottled", "mottles", "mottoes", "moulder", "moulted", "mounded", "mounted", "mourned", "mourner", "mousers", "mousier", "mousing", "moussed", "mousses", "mouthed", "movable", "muckier", "mucking", "muddied", "muddier", "muddies", "muddled", "muddles", "mudflap", "mudflat", "mudpack", "muezzin", "muffing", "muffins", "muffled", "muffler", "muffles", "muggers", "muggier", "mugging", "muggins", "mukluks", "mulatto", "mulched", "mulches", "mullahs", "mullets", "mulling", "mullion", "mumbled", "mumbler", "mumbles", "mummers", "mummery", "mummies", "mummify", "munched", "munches", "mundane", "murders", "murkier", "murkily", "murmurs", "muscled", "muscles", "museums", "mushers", "mushier", "mushing", "musical", "musings", "muskets", "muskier", "musking", "muskrat", "mussels", "mussier", "mussing", "mustang", "mustard", "musters", "mustier", "mutable", "mutants", "mutated", "mutates", "mutters", "muumuus", "muzzily", "muzzled", "muzzles", "myopics", "myriads", "myrtles", "mystery", "mystics", "mystify", "nabbing", "naffest", "nagging", "nailing", "naively", "naivest", "naivety", "nakeder", "nakedly", "nannied", "nannies", "napalms", "naphtha", "napkins", "nappier", "nappies", "napping", "narcing", "narrate", "narrows", "narwhal", "nasally", "nascent", "nastier", "nastily", "nations", "natives", "natters", "nattier", "nattily", "natural", "natured", "natures", "naughty", "navvies", "nearest", "nearing", "neatens", "neatest", "nebulae", "nebular", "necking", "necktie", "needful", "needier", "needing", "needled", "needles", "negated", "negates", "neglect", "negroid", "neighed", "neither", "nemeses", "nemesis", "neonate", "nephews", "nerdier", "nervier", "nerving", "nervous", "nesting", "nestled", "nestles", "netball", "netting", "nettled", "nettles", "network", "neurone", "neurons", "neuters", "neutral", "neutron", "newbies", "newborn", "newness", "newsboy", "newsier", "newsing", "newsman", "newsmen", "newtons", "nexuses", "nibbing", "nibbled", "nibbler", "nibbles", "nickels", "nicking", "niftier", "niggard", "niggers", "niggled", "niggles", "nighest", "nightie", "nightly", "nilling", "nimbler", "ninepin", "ninnies", "nippers", "nippier", "nipping", "nippled", "nipples", "nirvana", "nitpick", "nitrate", "nitwits", "nobbled", "nobbles", "noblest", "nodding", "noddles", "nodular", "nodules", "noggins", "noisier", "noisily", "noising", "noisome", "nomadic", "nominal", "nominee", "noncoms", "nonplus", "nonskid", "nonstop", "nonuser", "nonzero", "noodled", "noodles", "noonday", "nooning", "norming", "nosebag", "nosegay", "noshing", "nostril", "nostrum", "notable", "notably", "notched", "notches", "notelet", "notepad", "nothing", "noticed", "notices", "notions", "nougats", "nourish", "novella", "novelty", "novices", "nowhere", "noxious", "nozzles", "nuanced", "nuances", "nuclear", "nucleic", "nucleus", "nudging", "nudists", "nuggets", "nullify", "nullity", "numbers", "numbest", "numbing", "numeral", "numeric", "nuncios", "nunnery", "nuptial", "nursery", "nursing", "nurture", "nutcase", "nutmeat", "nutmegs", "nutrias", "nutters", "nuttier", "nutting", "nuzzled", "nuzzles", "nymphet", "nymphos", "oarlock", "oarsman", "oarsmen", "oatcake", "oatmeal", "obelisk", "obesity", "obeying", "objects", "obliged", "obliges", "oblique", "oblongs", "obloquy", "oboists", "obscene", "obscure", "obsequy", "observe", "obtains", "obtrude", "obtuser", "obverse", "obviate", "obvious", "ocarina", "occlude", "oceanic", "ocelots", "octagon", "octanes", "octaves", "octopus", "oculars", "oculist", "oddball", "oddment", "oddness", "odorous", "odyssey", "oeuvres", "offbeat", "offends", "offered", "offhand", "officer", "offices", "offings", "offload", "offsets", "offside", "oftener", "oilcans", "oiliest", "oilskin", "oinking", "oldened", "oldster", "omelets", "ominous", "omitted", "omnibus", "oneness", "onerous", "oneself", "onetime", "ongoing", "onioned", "onliest", "onshore", "onstage", "onwards", "opacity", "opaqued", "opaquer", "opaques", "openers", "openest", "opening", "operand", "operate", "opiates", "opining", "opinion", "opossum", "opposed", "opposes", "oppress", "optical", "optimal", "optimum", "options", "opulent", "oracled", "oracles", "oranges", "orating", "oration", "orators", "oratory", "orbital", "orbited", "orchard", "orchids", "ordains", "ordeals", "ordered", "orderly", "ordinal", "oregano", "organdy", "organic", "orgasms", "orients", "orifice", "origami", "origins", "orioles", "orotund", "orphans", "osmosis", "osmotic", "ospreys", "ostlers", "ostrich", "ottered", "ottoman", "ousters", "ousting", "outages", "outback", "outbids", "outcast", "outcome", "outcrop", "outdoes", "outdone", "outdoor", "outface", "outfall", "outfits", "outflow", "outgoes", "outgrew", "outgrow", "outguns", "outings", "outlaid", "outlast", "outlaws", "outlays", "outlets", "outline", "outlive", "outlook", "outpace", "outplay", "outpost", "outputs", "outrage", "outrank", "outruns", "outsell", "outsets", "outside", "outsize", "outsold", "outstay", "outtake", "outvote", "outward", "outwear", "outwith", "outwits", "outwore", "outwork", "outworn", "ovarian", "ovaries", "ovation", "overact", "overage", "overall", "overarm", "overate", "overawe", "overbid", "overdid", "overdue", "overeat", "overfly", "overjoy", "overlap", "overlay", "overlie", "overpay", "overran", "overrun", "oversaw", "oversee", "overtax", "overtly", "overuse", "oviduct", "ovulate", "oxcarts", "oxfords", "oxtails", "oxymora", "oysters", "paciest", "pacific", "package", "packers", "packets", "packing", "paddies", "padding", "paddled", "paddles", "paddock", "padlock", "paellas", "pageant", "pageboy", "pagodas", "pailful", "painful", "paining", "painted", "painter", "pairing", "paisley", "palaces", "palatal", "palates", "palaver", "palette", "palings", "pallets", "palling", "palmier", "palming", "palmist", "palmtop", "palpate", "palsied", "palsies", "pampers", "panacea", "panache", "panamas", "pancake", "panders", "panging", "panicky", "pannier", "panning", "panoply", "pansies", "panther", "panties", "panting", "papayas", "papered", "papilla", "papists", "papoose", "papping", "paprika", "papyrus", "parable", "paraded", "parades", "paradox", "paragon", "parapet", "parasol", "parboil", "parcels", "parched", "parches", "pardner", "pardons", "parents", "parfait", "pariahs", "parings", "parking", "parkway", "parlays", "parleys", "parlous", "paroled", "parolee", "paroles", "parquet", "parried", "parries", "parring", "parrots", "parsecs", "parsing", "parsley", "parsnip", "parsons", "partake", "partial", "partied", "parties", "parting", "partner", "partook", "partway", "parvenu", "paschal", "passage", "passels", "passing", "passion", "passive", "passkey", "pastels", "pastern", "pastier", "pasties", "pastime", "pasting", "pastors", "pasture", "patched", "patches", "patella", "patents", "pathway", "patient", "patinas", "patriot", "patrols", "patrons", "patsies", "pattern", "patters", "patties", "patting", "paucity", "paunchy", "paupers", "pausing", "pavings", "pavlova", "pawning", "payable", "payback", "paydays", "payload", "payment", "payoffs", "payouts", "payroll", "payslip", "peaches", "peacock", "peafowl", "peahens", "peaking", "pealing", "peanuts", "pearled", "peasant", "pebbled", "pebbles", "peccary", "peckers", "pecking", "peckish", "pedalos", "pedants", "peddled", "peddler", "peddles", "peeking", "peelers", "peeling", "peepers", "peeping", "peerage", "peeress", "peering", "peeving", "peevish", "peewees", "peewits", "pegging", "pelagic", "pelican", "pellets", "pelmets", "pelting", "pelvics", "penalty", "penance", "pencils", "pendant", "pendent", "pending", "penguin", "penises", "pennant", "pennies", "penning", "pennons", "pension", "pensive", "peonage", "peonies", "peopled", "peoples", "peppers", "peppery", "peppier", "pepping", "peptics", "percale", "percent", "perched", "perches", "perfect", "perfidy", "perform", "perfume", "pergola", "perhaps", "perigee", "periods", "periwig", "perjure", "perjury", "perkier", "perkily", "perking", "perming", "permits", "permute", "perplex", "persist", "persona", "persons", "perspex", "pertain", "pertest", "perturb", "perusal", "perused", "peruses", "pervade", "pervert", "pesetas", "peskier", "pessary", "pesters", "pestled", "pestles", "petards", "petered", "petiole", "petites", "petrels", "petrify", "pettier", "petties", "pettily", "petting", "petunia", "pewters", "pfennig", "phalanx", "phallic", "phallus", "phantom", "pharaoh", "pharynx", "phasing", "phenoms", "philter", "philtre", "phobias", "phobics", "phoebes", "phoenix", "phoneme", "phonics", "phonied", "phonier", "phonies", "phoning", "phooeys", "photoed", "photons", "phrasal", "phrased", "phrases", "physics", "physios", "pianist", "pianola", "piazzas", "picador", "piccolo", "pickers", "pickets", "pickier", "picking", "pickled", "pickles", "pickups", "picnics", "picture", "piddled", "piddles", "pidgins", "piebald", "piecing", "pierced", "pierces", "pigeons", "piggery", "piggier", "piggies", "pigging", "piggish", "piglets", "pigment", "pigpens", "pigskin", "pigtail", "pileups", "pilfers", "pilgrim", "pilings", "pillage", "pillars", "pillbox", "pillion", "pillock", "pillory", "pillows", "piloted", "pimento", "pimping", "pimpled", "pimples", "pinball", "pincers", "pinched", "pinches", "pinging", "pinhead", "pinhole", "pinions", "pinkest", "pinkeye", "pinkies", "pinking", "pinkish", "pinnate", "pinnies", "pinning", "pioneer", "piously", "pipette", "pipping", "pippins", "piquant", "piquing", "piranha", "pirated", "pirates", "pissers", "pissing", "pissoir", "pistils", "pistols", "pistons", "pitched", "pitcher", "pitches", "piteous", "pitfall", "pithead", "pithier", "pithily", "pitiful", "pitting", "pitying", "pivotal", "pivoted", "placard", "placate", "placebo", "placers", "placing", "placket", "plagued", "plagues", "plaided", "plainer", "plainly", "plaints", "plaited", "planers", "planets", "planing", "planked", "planned", "planner", "planted", "planter", "plaques", "plaster", "plastic", "plateau", "platens", "plating", "platoon", "platter", "plaudit", "playact", "playboy", "players", "playful", "playing", "playoff", "playpen", "pleaded", "pleader", "pleased", "pleases", "pleated", "plectra", "pledged", "pledges", "plenary", "plenums", "pliable", "pliancy", "plights", "plinths", "plodded", "plodder", "plonked", "plonker", "plopped", "plosive", "plotted", "plotter", "plovers", "plucked", "plugged", "plumage", "plumbed", "plumber", "pluming", "plummet", "plumped", "plumper", "plunder", "plunged", "plunger", "plunges", "plunked", "plurals", "plusher", "plussed", "plywood", "poached", "poacher", "poaches", "pockets", "pocking", "podding", "podiums", "poesied", "poesies", "poetess", "pogroms", "pointed", "pointer", "poising", "poisons", "pokiest", "poleaxe", "polecat", "polemic", "policed", "polices", "politer", "politic", "polkaed", "pollard", "polling", "pollute", "polygon", "polymer", "pomaded", "pomades", "pommels", "pommies", "pompoms", "pompous", "ponchos", "poncing", "ponders", "ponging", "poniard", "pontiff", "pontoon", "ponying", "pooched", "pooches", "poodles", "poofter", "poohing", "pooling", "pooping", "poorest", "popcorn", "popguns", "poplars", "popover", "poppers", "poppets", "poppies", "popping", "popular", "porches", "porcine", "porkers", "porkies", "portage", "portals", "portend", "portent", "porters", "portico", "porting", "portion", "portray", "poseurs", "poshest", "poshing", "posited", "possess", "possums", "postage", "postbag", "postbox", "postdoc", "posters", "posties", "posting", "postman", "postmen", "posture", "postwar", "potable", "potency", "potfuls", "pothead", "pothole", "pothook", "potions", "potluck", "potpies", "potshot", "pottage", "potters", "pottery", "pottier", "potties", "potting", "pouched", "pouches", "pouffes", "poultry", "pounced", "pounces", "pounded", "pouring", "pouting", "poverty", "powders", "powdery", "powered", "powwows", "prairie", "praised", "praises", "praline", "pranced", "prancer", "prances", "pranged", "prating", "prattle", "prawned", "prayers", "praying", "preachy", "precast", "precede", "precept", "precise", "precook", "predate", "predict", "preemie", "preempt", "preened", "prefabs", "preface", "prefect", "prefers", "preheat", "prelate", "prelims", "prelude", "premier", "premise", "premium", "prepaid", "prepare", "prepays", "prepped", "prequel", "presage", "present", "presets", "preside", "pressed", "presses", "pressie", "prestos", "presume", "preteen", "pretend", "pretext", "pretzel", "prevail", "prevent", "preview", "preying", "prezzie", "pricier", "pricing", "pricked", "prickle", "prickly", "priding", "priests", "primacy", "primary", "primate", "primers", "priming", "primmer", "primped", "primula", "princes", "printed", "printer", "prisons", "prithee", "privacy", "private", "privets", "privier", "privies", "probate", "probing", "probity", "problem", "proceed", "process", "proctor", "procure", "prodded", "prodigy", "produce", "product", "profane", "profess", "proffer", "profile", "profits", "profuse", "progeny", "project", "prolong", "promise", "promote", "prompts", "pronged", "pronoun", "proofed", "propane", "propels", "prophet", "propose", "propped", "prorate", "prosaic", "prosier", "prosody", "prosper", "protean", "protect", "protein", "protest", "protons", "prouder", "proudly", "proverb", "provide", "proving", "proviso", "provoke", "provost", "prowess", "prowled", "prowler", "proxies", "prudent", "prudery", "prudish", "pruning", "psyched", "psyches", "psychic", "psychos", "pubbing", "puberty", "publish", "puckers", "pucking", "puckish", "pudding", "puddled", "puddles", "pudenda", "pudgier", "pueblos", "puerile", "puffers", "puffier", "puffing", "puffins", "pullers", "pullets", "pulleys", "pulling", "pullout", "pulpier", "pulping", "pulpits", "pulsars", "pulsate", "pulsing", "pumices", "pummels", "pumping", "pumpkin", "punched", "punches", "pundits", "pungent", "puniest", "punkest", "punnets", "punning", "punster", "punters", "punting", "pupated", "pupates", "puppets", "puppied", "puppies", "pupping", "purging", "purists", "puritan", "purling", "purloin", "purpler", "purples", "purport", "purpose", "purring", "pursers", "pursing", "pursued", "pursuer", "pursues", "pursuit", "purveys", "purview", "pushers", "pushier", "pushily", "pushing", "pushpin", "pussier", "pussies", "pustule", "putrefy", "putters", "puttied", "putties", "putting", "puzzled", "puzzler", "puzzles", "pygmies", "pyramid", "pyrites", "pythons", "quacked", "quaffed", "quahogs", "quailed", "quaking", "qualify", "quality", "quangos", "quantum", "quarrel", "quarter", "quartet", "quartos", "quasars", "quashed", "quashes", "quavers", "quavery", "queened", "queenly", "queered", "queerer", "queerly", "quelled", "queried", "queries", "quested", "quibble", "quiches", "quicken", "quicker", "quickie", "quickly", "quieted", "quieten", "quieter", "quietly", "quietus", "quilted", "quilter", "quinces", "quinine", "quintet", "quipped", "quirked", "quiting", "quitter", "quivers", "quizzed", "quizzes", "quoited", "quondam", "quorate", "quorums", "quoting", "rabbits", "rabbles", "rabidly", "raccoon", "racemes", "raceway", "raciest", "racists", "rackets", "racking", "raddled", "radials", "radiant", "radiate", "radical", "radioed", "raffish", "raffled", "raffles", "rafters", "rafting", "raggedy", "ragging", "raglans", "ragouts", "ragtags", "ragtime", "ragweed", "ragwort", "raiders", "raiding", "railing", "railway", "raiment", "rainbow", "rainier", "raining", "raising", "raisins", "rallied", "rallies", "rambled", "rambler", "rambles", "ramekin", "ramming", "rampage", "rampant", "rampart", "ramrods", "ranched", "rancher", "ranches", "randier", "rangers", "rangier", "ranging", "rankest", "ranking", "rankled", "rankles", "ransack", "ransoms", "ranting", "rapider", "rapidly", "rapiers", "rapists", "rappels", "rappers", "rapping", "rapport", "raptors", "rapture", "rascals", "rashers", "rashest", "raspier", "rasping", "ratbags", "ratchet", "ratings", "rations", "rattans", "rattier", "ratting", "rattled", "rattler", "rattles", "rattrap", "raucous", "raunchy", "ravaged", "ravages", "ravened", "ravined", "ravines", "ravings", "ravioli", "rawhide", "rawness", "razzing", "reached", "reaches", "reacted", "reactor", "readers", "readied", "readier", "readies", "readily", "reading", "readmit", "readout", "reagent", "realest", "realign", "realism", "realist", "reality", "reamers", "reaming", "reapers", "reaping", "reapply", "rearing", "rearmed", "reasons", "rebated", "rebates", "rebinds", "rebirth", "reboots", "rebound", "rebuffs", "rebuild", "rebuilt", "rebuked", "rebukes", "rebuses", "recalls", "recants", "recasts", "receded", "recedes", "receipt", "receive", "recheck", "recipes", "recital", "recited", "recites", "reckons", "reclaim", "recline", "recluse", "recoils", "records", "recount", "recoups", "recover", "recruit", "rectify", "rectors", "rectory", "rectums", "recycle", "redcaps", "redcoat", "reddens", "reddest", "reddish", "redeems", "redhead", "redneck", "redness", "redoing", "redoubt", "redound", "redraft", "redrawn", "redraws", "redress", "redskin", "reduced", "reduces", "redwood", "reedier", "reefers", "reefing", "reeking", "reelect", "reeling", "reenact", "reenter", "reentry", "reeving", "referee", "reffing", "refiled", "refiles", "refills", "refined", "refiner", "refines", "reflate", "reflect", "refocus", "reforms", "refract", "refrain", "refresh", "refuels", "refugee", "refuges", "refunds", "refusal", "refused", "refuses", "refuted", "refutes", "regains", "regaled", "regales", "regalia", "regally", "regards", "regatta", "regency", "regents", "regimen", "regimes", "regions", "regress", "regrets", "regroup", "regular", "reheats", "rehired", "rehires", "rehouse", "reigned", "reining", "reissue", "rejects", "rejoice", "rejoins", "relabel", "relapse", "related", "relates", "relaxed", "relaxes", "relayed", "relearn", "release", "relents", "reliant", "reliefs", "relieve", "relived", "relives", "reloads", "relying", "remades", "remains", "remakes", "remands", "remarks", "remarry", "rematch", "reminds", "remixed", "remixes", "remnant", "remodel", "remolds", "remorse", "remoter", "remotes", "remould", "remount", "removal", "removed", "remover", "removes", "renamed", "renames", "renders", "rending", "reneged", "reneges", "renewal", "renewed", "renowns", "rentals", "renters", "renting", "reoccur", "reopens", "reorder", "repaint", "repairs", "repasts", "repeals", "repeats", "repents", "replace", "replays", "replete", "replica", "replied", "replies", "reports", "reposed", "reposes", "repress", "reprint", "reprise", "reproof", "reprove", "reptile", "repulse", "reputed", "reputes", "request", "requiem", "require", "requite", "rereads", "reroute", "resales", "rescind", "rescued", "rescuer", "rescues", "resells", "resents", "reserve", "reshape", "resided", "resides", "residue", "resigns", "resists", "resolve", "resorts", "resound", "respect", "respell", "respire", "respite", "respond", "restart", "restate", "restful", "resting", "restive", "restock", "restore", "restudy", "results", "resumed", "resumes", "retails", "retains", "retaken", "retakes", "retards", "retched", "retches", "retells", "rethink", "retinal", "retinas", "retinue", "retired", "retiree", "retires", "retools", "retorts", "retouch", "retrace", "retract", "retrain", "retread", "retreat", "retrial", "retried", "retries", "retsina", "returns", "retyped", "retypes", "reunify", "reunion", "reunite", "reusing", "revalue", "revamps", "reveals", "revelry", "revenge", "revenue", "revered", "reveres", "reverie", "reverse", "reverts", "reviews", "reviled", "reviler", "reviles", "revised", "revises", "revisit", "revival", "revived", "revives", "revoked", "revokes", "revolts", "revolve", "revving", "rewards", "rewinds", "rewired", "rewires", "rewords", "reworks", "rewound", "rewrite", "rewrote", "rhizome", "rhodium", "rhombus", "rhubarb", "rhyming", "rhythms", "ribbing", "ribbons", "richest", "rickets", "rickety", "ricking", "ricotta", "ridding", "riddled", "riddles", "ridging", "riffing", "riffled", "riffles", "rifling", "rifting", "rigging", "righted", "righter", "rightly", "rigidly", "rilling", "rimless", "rimming", "rinding", "ringers", "ringing", "ringlet", "rinking", "rinsing", "rioters", "rioting", "riotous", "ripcord", "ripened", "riposte", "rippers", "ripping", "rippled", "ripples", "ripsaws", "risible", "risings", "riskier", "riskily", "risking", "risotto", "rissole", "rituals", "ritzier", "rivalry", "riveted", "riviera", "rivulet", "roaches", "roadbed", "roadies", "roadway", "roamers", "roaming", "roaring", "roasted", "roaster", "robbers", "robbery", "robbing", "robotic", "rockers", "rockery", "rockets", "rockier", "rocking", "rodents", "roebuck", "rogered", "roguery", "roguish", "roiling", "roister", "rollers", "rollick", "rolling", "rollmop", "romaine", "romance", "rompers", "romping", "roofers", "roofing", "rooftop", "rookery", "rookier", "rookies", "rooking", "roomers", "roomful", "roomier", "rooming", "roosted", "rooster", "rooting", "roseate", "rosebud", "rosette", "rosiest", "rosined", "rosters", "rostrum", "rotated", "rotates", "rottens", "rotters", "rotting", "rotunda", "rotunds", "roughed", "roughen", "rougher", "roughly", "rouging", "rounded", "roundel", "rounder", "roundly", "roundup", "rousing", "rousted", "routine", "routing", "rowboat", "rowdier", "rowdies", "rowdily", "rowlock", "royally", "royalty", "rubbers", "rubbery", "rubbing", "rubbish", "rubbled", "rubbles", "rubdown", "rubella", "rubiest", "rubrics", "rubying", "rucking", "rudders", "ruddied", "ruddier", "ruddies", "ruffian", "ruffing", "ruffled", "ruffles", "rugging", "ruining", "ruinous", "rulered", "rulings", "rumbaed", "rumbled", "rumbles", "rummage", "rummest", "rumping", "rumpled", "rumples", "runaway", "rundown", "runnels", "runners", "runnier", "running", "runoffs", "runways", "rupture", "rushing", "russets", "rustics", "rustier", "rusting", "rustled", "rustler", "rustles", "rutting", "sabling", "sachems", "sachets", "sackful", "sacking", "saddens", "saddest", "saddled", "saddler", "saddles", "sadists", "sadness", "safaris", "saffron", "sagging", "saguaro", "sailing", "sailors", "sainted", "saintly", "salaams", "salamis", "salient", "salines", "sallied", "sallies", "salmons", "saloons", "saltbox", "saltest", "saltier", "salties", "saltine", "salting", "saluted", "salutes", "salvage", "salvers", "salving", "sambaed", "samosas", "samovar", "sampans", "sampled", "sampler", "samples", "samurai", "sanctum", "sandals", "sandbag", "sandbar", "sandbox", "sanders", "sandhog", "sandier", "sanding", "sandlot", "sandman", "sandmen", "sandpit", "sangria", "sapient", "sapling", "sappers", "sappier", "sapping", "sarcasm", "sarcoma", "sardine", "sarnies", "sarongs", "sashays", "sassier", "sassing", "satanic", "satchel", "satiate", "satiety", "satined", "satires", "satiric", "satisfy", "satraps", "satsuma", "saucers", "saucier", "saucily", "saucing", "saunaed", "saunter", "sausage", "savaged", "savager", "savages", "savanna", "savants", "savings", "savvied", "savvier", "savvies", "sawdust", "sawmill", "sawyers", "sayings", "scabbed", "scabies", "scalars", "scalded", "scalene", "scalier", "scaling", "scallop", "scalped", "scalpel", "scalper", "scammed", "scamper", "scandal", "scanned", "scanner", "scanted", "scanter", "scapula", "scarabs", "scarcer", "scarfed", "scarier", "scarify", "scaring", "scarlet", "scarper", "scarred", "scarves", "scatted", "scatter", "scenery", "scening", "scented", "schemed", "schemer", "schemes", "scherzo", "schisms", "schizos", "schleps", "schlock", "schmuck", "schnook", "scholar", "schools", "sciatic", "science", "scissor", "scoffed", "scolded", "sconces", "scooped", "scooted", "scooter", "scoping", "scorers", "scoring", "scorned", "scotchs", "scoured", "scourer", "scourge", "scouted", "scouter", "scowled", "scraggy", "scraped", "scraper", "scrapes", "scrapie", "scrappy", "scratch", "scrawls", "scrawny", "screams", "screech", "screeds", "screens", "screwed", "scribes", "scrimps", "scripts", "scrolls", "scrooge", "scrotum", "scrubby", "scruffs", "scruffy", "scrumps", "scrumpy", "scrunch", "scruple", "scubaed", "scudded", "scuffed", "scuffle", "sculled", "sculpts", "scumbag", "scummed", "scupper", "scuttle", "scythed", "scythes", "seabeds", "seabird", "seafood", "seagull", "sealant", "sealers", "sealing", "seamier", "seaming", "seaport", "searing", "seasick", "seaside", "seasons", "seating", "seaward", "seaways", "seaweed", "seceded", "secedes", "seclude", "seconds", "secrecy", "secrete", "secrets", "section", "sectors", "secular", "secured", "securer", "secures", "sedated", "sedater", "sedates", "seduced", "seducer", "seduces", "seedbed", "seedier", "seeding", "seeings", "seekers", "seeking", "seeming", "seepage", "seeping", "seesaws", "seethed", "seethes", "segment", "seismic", "seizing", "seizure", "selects", "selfish", "sellers", "selling", "sellout", "seltzer", "selvage", "seminal", "seminar", "senates", "senator", "senders", "sending", "seniors", "sensing", "sensors", "sensory", "sensual", "septets", "septics", "sequels", "sequins", "sequoia", "serapes", "seraphs", "serened", "serener", "serenes", "serfdom", "serials", "serious", "sermons", "serpent", "serried", "servant", "servers", "servery", "service", "servile", "serving", "sesames", "session", "setback", "settees", "setters", "setting", "settled", "settler", "settles", "seventh", "seventy", "several", "severed", "severer", "sexiest", "sexists", "sexless", "sexpots", "sextant", "sextets", "sextons", "shacked", "shackle", "shadier", "shading", "shadows", "shadowy", "shafted", "shagged", "shaikhs", "shakers", "shakeup", "shakier", "shakily", "shaking", "shallot", "shallow", "shamans", "shamble", "shaming", "shammed", "shampoo", "shapely", "shaping", "shariah", "sharing", "sharked", "sharped", "sharpen", "sharper", "sharply", "shatter", "shavers", "shaving", "shawled", "sheared", "shearer", "sheathe", "sheaths", "sheaves", "shebang", "shebeen", "sheered", "sheerer", "sheilas", "shekels", "shellac", "shelled", "sheller", "shelter", "shelved", "shelves", "sherbet", "sheriff", "shiatsu", "shields", "shifted", "shilled", "shimmed", "shimmer", "shindig", "shiners", "shingle", "shinier", "shining", "shinned", "shipped", "shipper", "shirked", "shirker", "shirred", "shirted", "shitted", "shivers", "shivery", "shoaled", "shocked", "shocker", "shoeing", "shoguns", "shooing", "shooter", "shopped", "shopper", "shoring", "shorted", "shorten", "shorter", "shortly", "shotgun", "shouted", "shovels", "shoving", "showbiz", "showers", "showery", "showier", "showily", "showing", "showman", "showmen", "showoff", "shrewed", "shrieks", "shrikes", "shrills", "shrilly", "shrimps", "shrines", "shrinks", "shrived", "shrivel", "shriven", "shrives", "shrouds", "shrubby", "shticks", "shucked", "shudder", "shuffle", "shunned", "shunted", "shushed", "shushes", "shuteye", "shutout", "shutter", "shuttle", "shyness", "shyster", "sibling", "sickbay", "sickbed", "sickens", "sickest", "sickies", "sicking", "sickled", "sickles", "sickout", "sidearm", "sidebar", "sidecar", "sidings", "sidling", "sierras", "siestas", "sieving", "sifters", "sifting", "sighing", "sighted", "signals", "signers", "signets", "signify", "signing", "silaged", "silages", "silence", "silents", "silicon", "silkens", "silkier", "silkies", "sillier", "sillies", "silting", "silvers", "silvery", "simians", "similar", "similes", "simmers", "simpers", "simpled", "simpler", "simples", "simplex", "sincere", "singers", "singing", "singled", "singles", "singlet", "sinkers", "sinking", "sinners", "sinning", "sinuous", "sinuses", "sipping", "sirloin", "sirocco", "sirring", "sissier", "sissies", "sisters", "sitcoms", "sitters", "sitting", "situate", "sixfold", "sixteen", "sixties", "sizable", "sizzled", "sizzler", "sizzles", "skaters", "skating", "skeeter", "skeined", "sketchy", "skewers", "skewing", "skibobs", "skidded", "skidpan", "skiffed", "skiffle", "skilled", "skillet", "skimmed", "skimped", "skinful", "skinned", "skipped", "skipper", "skirted", "skiting", "skitter", "skittle", "skivers", "skiving", "skulked", "skunked", "skycaps", "skydive", "skyjack", "skylark", "skyline", "skyward", "slabbed", "slacked", "slacken", "slacker", "slackly", "slagged", "slaking", "slaloms", "slammed", "slammer", "slander", "slanted", "slapped", "slapper", "slashed", "slashes", "slather", "slating", "slatted", "slavers", "slavery", "slaving", "slavish", "slayers", "slaying", "sleazes", "sledded", "sledged", "sledges", "sleeked", "sleeker", "sleekly", "sleeper", "sleeted", "sleeves", "sleighs", "slender", "sleuths", "slewing", "slicers", "slicing", "slicked", "slicker", "slickly", "sliders", "sliding", "slights", "slimier", "slimmed", "slimmer", "slipped", "slipper", "slipway", "slither", "slitted", "slitter", "slivers", "slobbed", "slobber", "slogans", "slogged", "sloping", "slopped", "sloshed", "sloshes", "slothed", "slotted", "slouchy", "sloughs", "slovens", "slowest", "slowing", "sludged", "sludges", "slugged", "slugger", "sluiced", "sluices", "slumber", "slummed", "slummer", "slumped", "slurped", "slurred", "slyness", "smacked", "smacker", "smalled", "smaller", "smarted", "smarten", "smarter", "smartly", "smashed", "smasher", "smashes", "smeared", "smelled", "smelted", "smelter", "smidgen", "smiling", "smirked", "smiting", "smitten", "smocked", "smokers", "smokier", "smokies", "smoking", "smoochy", "smooths", "smother", "smudged", "smudges", "smugged", "smugger", "smuggle", "snacked", "snaffle", "snagged", "snailed", "snakier", "snaking", "snapped", "snapper", "snaring", "snarled", "sneaked", "sneaker", "sneered", "sneezed", "sneezes", "snicked", "snicker", "snidely", "snidest", "sniffed", "sniffer", "sniffle", "snifter", "snipers", "sniping", "snipped", "snippet", "snivels", "snogged", "snooker", "snooped", "snooper", "snoozed", "snoozes", "snorers", "snoring", "snorkel", "snorted", "snotted", "snouted", "snowier", "snowing", "snowman", "snowmen", "snubbed", "snuffed", "snuffer", "snuffle", "snugged", "snugger", "snuggle", "soaking", "soapbox", "soapier", "soaping", "soaring", "sobbing", "sobered", "soberer", "soberly", "socials", "society", "sockets", "socking", "sodding", "softens", "softest", "softies", "soggier", "soggily", "soiling", "sojourn", "solaced", "solaces", "solaria", "solders", "soldier", "solicit", "solider", "solidly", "soloing", "soloist", "soluble", "solvent", "solvers", "solving", "someday", "somehow", "someone", "someway", "sonatas", "sonnets", "sonnies", "soonest", "soothed", "soother", "soothes", "sootier", "sophism", "sophist", "soppier", "sopping", "soprano", "sorbets", "sorcery", "sorghum", "sorrels", "sorrier", "sorrows", "sorters", "sortied", "sorties", "sorting", "sottish", "soughed", "soulful", "sounded", "sounder", "soundly", "soupier", "souping", "sourced", "sources", "sourest", "souring", "sousing", "soviets", "soybean", "sozzled", "spacial", "spacier", "spacing", "spading", "spammed", "spandex", "spangle", "spangly", "spaniel", "spanked", "spanned", "spanner", "sparely", "sparest", "sparing", "sparked", "sparkle", "sparkly", "sparred", "sparrer", "sparrow", "sparser", "spartan", "spasmed", "spastic", "spatial", "spatted", "spatter", "spatula", "spawned", "spaying", "speaker", "speared", "special", "species", "specify", "specked", "speckle", "spectra", "speeder", "speedup", "speller", "spender", "spewing", "spheres", "spicier", "spicing", "spiders", "spidery", "spieled", "spiffed", "spigots", "spikier", "spiking", "spinach", "spinals", "spindle", "spindly", "spinets", "spinier", "spinner", "spinney", "spirals", "spireas", "spirits", "spiting", "spitted", "spittle", "splashy", "splayed", "spleens", "spliced", "splicer", "splices", "spliffs", "splines", "splints", "splodge", "splotch", "splurge", "spoiler", "sponged", "sponger", "sponges", "sponsor", "spoofed", "spooked", "spooled", "spooned", "spoored", "sporing", "sporran", "sported", "spotlit", "spotted", "spotter", "spousal", "spouses", "spouted", "sprains", "sprangs", "sprawls", "sprayed", "sprayer", "spreads", "spriest", "springs", "springy", "sprints", "sprites", "sprouts", "spruced", "sprucer", "spruces", "spuming", "spumoni", "spunked", "spurned", "spurred", "spurted", "sputter", "squalid", "squalls", "squally", "squalor", "squared", "squarer", "squares", "squashy", "squawks", "squeaks", "squeaky", "squeals", "squeeze", "squelch", "squidgy", "squiffy", "squints", "squired", "squires", "squirms", "squirmy", "squirts", "squishy", "stabbed", "stabled", "stabler", "stables", "stacked", "stadium", "staffed", "staffer", "stagger", "staging", "staider", "staidly", "stained", "staking", "stalest", "staling", "stalked", "stalker", "stalled", "stamens", "stamina", "stammer", "stamped", "stances", "standby", "stanzas", "stapled", "stapler", "staples", "starchy", "stardom", "staring", "starked", "starker", "starkly", "starlet", "starlit", "starred", "started", "starter", "startle", "starved", "starves", "stashed", "stashes", "stately", "statics", "stating", "station", "statues", "stature", "statute", "staunch", "staving", "staying", "stealth", "steamed", "steamer", "steeled", "steeped", "steepen", "steeper", "steeple", "steeply", "steered", "steined", "stellar", "stemmed", "stencil", "stepped", "steppes", "stepson", "stereos", "sterile", "sterned", "sterner", "sternly", "sternum", "steroid", "stetson", "steward", "stewing", "sticker", "stickup", "stiffed", "stiffen", "stiffer", "stiffly", "stifled", "stifles", "stigmas", "stiling", "stilled", "stiller", "stilted", "stimuli", "stinger", "stinker", "stinted", "stipend", "stipple", "stirred", "stirrer", "stirrup", "stocked", "stogies", "stoical", "stokers", "stoking", "stomach", "stomped", "stonier", "stonily", "stoning", "stooges", "stooped", "stopgap", "stopped", "stopper", "storage", "storied", "storing", "stormed", "stouter", "stoutly", "stowage", "stowing", "strafed", "strafes", "strains", "straits", "strands", "strange", "stratum", "strawed", "strayed", "streaks", "streaky", "streams", "streets", "stretch", "strewed", "strewth", "strides", "striker", "strikes", "strings", "stringy", "striped", "stripes", "stripey", "striven", "strives", "strobes", "stroked", "strokes", "strolls", "strophe", "stroppy", "strudel", "stubbed", "stubble", "stubbly", "studded", "student", "studied", "studies", "studios", "stuffed", "stumble", "stumped", "stunned", "stunner", "stunted", "stupefy", "stupids", "stupors", "stutter", "styling", "stylish", "stylist", "stymied", "stymies", "styptic", "suavely", "suavest", "suavity", "subaqua", "subbing", "subdued", "subdues", "subhead", "subject", "subjoin", "sublets", "sublime", "submits", "suborns", "subplot", "subsets", "subside", "subsidy", "subsist", "subsoil", "subsume", "subteen", "subtend", "subtext", "subtler", "suburbs", "subvert", "subways", "subzero", "succeed", "success", "succubi", "succumb", "suckers", "sucking", "suckled", "suckles", "sucrose", "suction", "sudsier", "suffers", "suffice", "suffuse", "sugared", "suggest", "suicide", "suiting", "suitors", "sulfate", "sulfide", "sulkier", "sulkies", "sulkily", "sulking", "sullied", "sullies", "sultana", "sultans", "summary", "summers", "summery", "summing", "summits", "summons", "sunbeam", "sunbeds", "sunbelt", "sunburn", "sundaes", "sundeck", "sunders", "sundial", "sundown", "sunfish", "sunhats", "sunlamp", "sunless", "sunnier", "sunnies", "sunning", "sunrise", "sunroof", "sunsets", "sunspot", "suntans", "suntrap", "supered", "suppers", "supping", "suppler", "support", "suppose", "supreme", "supremo", "surface", "surfeit", "surfers", "surfing", "surgeon", "surgery", "surging", "surlier", "surmise", "surname", "surpass", "surplus", "surreal", "surreys", "surveys", "survive", "suspect", "suspend", "sussing", "sustain", "sutured", "sutures", "svelter", "swabbed", "swaddle", "swagged", "swagger", "swallow", "swamped", "swanked", "swanker", "swanned", "swapped", "swarmed", "swarthy", "swashed", "swashes", "swathed", "swathes", "swatted", "swatter", "swaying", "swearer", "sweater", "sweeper", "sweeten", "sweeter", "sweetie", "sweetly", "swelled", "sweller", "swelter", "swerved", "swerves", "swifted", "swifter", "swiftly", "swigged", "swilled", "swimmer", "swindle", "swinger", "swinish", "swiping", "swirled", "swished", "swisher", "swishes", "swivels", "swollen", "swooned", "swooped", "sworded", "swotted", "symbols", "symptom", "synapse", "syncing", "synergy", "synonym", "syringe", "systems", "tabbies", "tabbing", "tableau", "tablets", "tabling", "tabloid", "tabooed", "tabular", "tacitly", "tackier", "tackies", "tacking", "tackled", "tackler", "tackles", "tactful", "tactics", "tactile", "tadpole", "taffeta", "taffies", "tagging", "tailing", "tailors", "tainted", "takeoff", "takeout", "takings", "talents", "talkers", "talkies", "talking", "tallboy", "tallest", "tallied", "tallies", "tallyho", "tamable", "tamales", "tampers", "tamping", "tampons", "tanager", "tandems", "tangelo", "tangent", "tangier", "tangies", "tangled", "tangles", "tangoed", "tankard", "tankers", "tankful", "tanking", "tanners", "tannery", "tannest", "tanning", "tantrum", "tapered", "tapioca", "tappets", "tapping", "taproom", "taproot", "tardier", "tardies", "tardily", "targets", "tariffs", "tarmacs", "tarnish", "tarpons", "tarried", "tarrier", "tarries", "tarring", "tartans", "tartars", "tartest", "tarting", "tasking", "tasters", "tastier", "tasting", "tatters", "tattier", "tatties", "tatting", "tattled", "tattler", "tattles", "tattoos", "taunted", "tautens", "tautest", "tauting", "taverns", "tawnier", "taxable", "taxicab", "taxiing", "taxings", "taxiway", "teabags", "teacake", "teacher", "teaches", "teacups", "teaming", "teapots", "tearful", "teargas", "tearier", "tearing", "tearoom", "teasels", "teasers", "teasing", "teatime", "techies", "teddies", "tedious", "teeming", "teenage", "teenier", "teeters", "teethed", "teethes", "telexed", "telexes", "tellers", "tellies", "telling", "temblor", "tempera", "tempers", "tempest", "temping", "temples", "tempted", "tempter", "tempura", "tenable", "tenancy", "tenants", "tenders", "tending", "tendons", "tendril", "tenfold", "tenners", "tenpins", "tensely", "tensest", "tensile", "tensing", "tension", "tensors", "tenting", "tenuous", "tenured", "tenures", "tequila", "terming", "termini", "termite", "terning", "terrace", "terrain", "terrier", "terrify", "terrine", "terrors", "tersely", "tersest", "testate", "testers", "testier", "testify", "testily", "testing", "tetanus", "tethers", "textile", "textual", "texture", "thalami", "thanked", "thawing", "theeing", "theists", "theorem", "therapy", "thereby", "therein", "thereof", "thereon", "thereto", "thermal", "thermos", "thicken", "thicker", "thicket", "thickly", "thickos", "thieved", "thieves", "thimble", "thinker", "thinned", "thinner", "thirded", "thirdly", "thirsts", "thirsty", "thistle", "thither", "thorium", "thought", "thralls", "threads", "threats", "thrifts", "thrifty", "thrills", "thrived", "thrives", "throats", "throaty", "thrones", "throngs", "through", "thrower", "thrusts", "thruway", "thudded", "thumbed", "thumped", "thunder", "thwacks", "thwarts", "thyroid", "thyself", "tickers", "tickets", "ticking", "tickled", "tickles", "tidbits", "tiddler", "tidiest", "tidings", "tidying", "tiepins", "tiffing", "tighten", "tighter", "tightly", "tigress", "tillage", "tillers", "tilling", "tilting", "timbers", "timbres", "timider", "timidly", "timings", "timpani", "tinfoil", "tinging", "tingled", "tingles", "tiniest", "tinkers", "tinkled", "tinkles", "tinnier", "tinnies", "tinning", "tinsels", "tinting", "tippers", "tipping", "tippled", "tippler", "tipples", "tipsier", "tipsily", "tipster", "tiptoed", "tiptoes", "tiptops", "tirades", "tireder", "tiredly", "tirings", "tissues", "titanic", "titches", "tithing", "titling", "titmice", "titters", "titties", "titting", "tittled", "tittles", "titular", "tizzies", "toadied", "toadies", "toasted", "toaster", "tobacco", "toccata", "tocsins", "toddies", "toddled", "toddler", "toddles", "toecaps", "toehold", "toenail", "toerags", "toffees", "togging", "toggled", "toggles", "toilers", "toilets", "toiling", "tolling", "tombing", "tombola", "tomboys", "tomcats", "tongued", "tongues", "toniest", "tonight", "tonnage", "tonsils", "tonsure", "toolbar", "toolbox", "tooling", "toolkit", "toothed", "tooting", "tootled", "tootles", "tootsie", "topazes", "topcoat", "topiary", "topical", "topknot", "topless", "topmast", "topmost", "toppers", "topping", "toppled", "topples", "topsail", "topside", "topsoil", "topspin", "torched", "torches", "torment", "tornado", "torpedo", "torqued", "torques", "torrent", "torsion", "torture", "tossers", "tossing", "tossups", "totally", "totemic", "totters", "totting", "toucans", "touched", "touches", "toughed", "toughen", "tougher", "toughie", "toughly", "toupees", "touring", "tourism", "tourist", "tourney", "tousled", "tousles", "touting", "towards", "towered", "towhead", "townees", "townies", "towpath", "towrope", "toyboys", "tracers", "tracery", "trachea", "tracing", "tracked", "tracker", "tractor", "traders", "trading", "traduce", "traffic", "tragedy", "tragics", "trailed", "trailer", "trained", "trainee", "trainer", "traipse", "traitor", "tramcar", "trammed", "trammel", "tramped", "trample", "tramway", "trances", "tranche", "transit", "transom", "trapeze", "trapped", "trapper", "trashed", "trashes", "traumas", "travail", "travels", "trawled", "trawler", "treacle", "treacly", "treadle", "treason", "treated", "trebled", "trebles", "treeing", "treetop", "trefoil", "trekked", "trellis", "tremble", "tremolo", "tremors", "trended", "tresses", "trestle", "trialed", "tribune", "tribute", "triceps", "tricked", "trickle", "trident", "trifled", "trifler", "trifles", "trigger", "triking", "trilled", "trilogy", "trimmed", "trimmer", "trinity", "trinket", "tripled", "triples", "triplet", "tripods", "tripped", "tripper", "trisect", "tritely", "tritest", "triumph", "trivets", "trivial", "trochee", "trodden", "troikas", "trolled", "trolley", "trollop", "tromped", "trooped", "trooper", "tropics", "tropism", "trothed", "trotted", "trotter", "trouble", "troughs", "trounce", "trouped", "trouper", "troupes", "trouser", "trowels", "truancy", "truants", "trucked", "trucker", "truckle", "trudged", "trudges", "truffle", "truisms", "trumped", "trumpet", "trundle", "trunked", "trussed", "trusses", "trusted", "trustee", "tryings", "tryouts", "trysted", "tsarism", "tsarist", "tsunami", "tubbier", "tubular", "tuckers", "tucking", "tufting", "tugboat", "tugging", "tuition", "tumbled", "tumbler", "tumbles", "tumbrel", "tummies", "tumults", "tundras", "tuneful", "tunnels", "tunnies", "turbans", "turbine", "turbots", "tureens", "turfing", "turkeys", "turmoil", "turners", "turning", "turnips", "turnkey", "turnoff", "turnout", "turrets", "turtles", "tushing", "tussled", "tussles", "tussock", "tutored", "tutting", "tuxedos", "twaddle", "twanged", "tweaked", "tweeted", "tweeter", "twelfth", "twelves", "twiddle", "twiddly", "twigged", "twilled", "twinged", "twinges", "twining", "twinkle", "twinned", "twinset", "twirled", "twirler", "twisted", "twister", "twitchy", "twitted", "twitter", "twofers", "twofold", "twosome", "tycoons", "typeset", "typhoid", "typhoon", "typical", "typists", "tyranny", "tyrants", "ugliest", "uglying", "ukulele", "ulcered", "ululate", "umbrage", "umlauts", "umpired", "umpires", "umpteen", "unaided", "unarmed", "unasked", "unaware", "unbends", "unbinds", "unblock", "unbolts", "unbosom", "unbound", "unbowed", "uncanny", "uncased", "uncivil", "unclasp", "unclean", "unclear", "uncling", "uncoils", "uncorks", "uncouth", "uncover", "unction", "uncurls", "undated", "undergo", "undoing", "undress", "undying", "unearth", "uneaten", "unequal", "unfazed", "unfolds", "unfrock", "unfunny", "unfurls", "ungodly", "unguent", "unhands", "unhappy", "unheard", "unhinge", "unhitch", "unhooks", "unhorse", "unicorn", "unified", "unifies", "uniform", "uniquer", "unitary", "unities", "uniting", "unkempt", "unknown", "unlaced", "unlaces", "unlatch", "unlearn", "unleash", "unlikes", "unloads", "unlocks", "unloose", "unloved", "unlucky", "unmakes", "unmanly", "unmasks", "unmoral", "unmoved", "unnamed", "unnerve", "unpacks", "unpaved", "unpicks", "unplugs", "unquiet", "unquote", "unravel", "unready", "unrests", "unriper", "unrolls", "unsafer", "unscrew", "unseals", "unseats", "unseens", "unsnaps", "unsnarl", "unsound", "unstops", "unstuck", "untamed", "untiled", "untiles", "untried", "untruer", "untruth", "untwist", "untying", "unusual", "unveils", "unwaged", "unwinds", "unwiser", "unwound", "unwraps", "upbeats", "upbraid", "upchuck", "updated", "updater", "updates", "upended", "upfront", "upgrade", "uphills", "upholds", "uplands", "uplifts", "uploads", "upraise", "upright", "upriver", "uproars", "uproots", "upscale", "upshots", "upsides", "upstage", "upstart", "upstate", "upsurge", "upswing", "uptakes", "uptempo", "uptight", "uptrend", "upturns", "upwards", "uranium", "urbaner", "urchins", "urethra", "urgency", "urinals", "urinary", "urinate", "urology", "useless", "ushered", "usually", "usurers", "usurped", "usurper", "utensil", "uterine", "utility", "utopias", "uttered", "utterer", "utterly", "uvulars", "vacancy", "vacated", "vacates", "vaccine", "vacuity", "vacuous", "vacuums", "vaginae", "vaginal", "vagrant", "vaguely", "vaguest", "vainest", "valance", "valence", "valency", "valeted", "valiant", "validly", "valises", "valleys", "valuers", "valuing", "valving", "vamoose", "vamping", "vampire", "vandals", "vanilla", "vanning", "vantage", "variant", "variate", "variety", "various", "varlets", "varmint", "varnish", "varsity", "varying", "vassals", "vastest", "vatting", "vaulted", "vaulter", "vaunted", "vealing", "vectors", "veering", "veggies", "vegging", "vehicle", "veiling", "veining", "velvets", "velvety", "venally", "vending", "vendors", "veneers", "venison", "venting", "ventral", "venture", "veranda", "verbals", "verbena", "verbose", "verdant", "verdict", "verdure", "vergers", "verging", "veriest", "verruca", "versify", "versing", "version", "vertigo", "vesicle", "vespers", "vessels", "vestige", "vesting", "vetches", "veteran", "vetoing", "vetting", "viaduct", "vibrant", "vibrate", "vibrato", "viceroy", "vicious", "victims", "victors", "victory", "victual", "videoed", "viewers", "viewing", "village", "villain", "villein", "vinegar", "vintage", "vintner", "violate", "violent", "violets", "violins", "violist", "virgins", "virgule", "virtual", "virtues", "viruses", "visages", "visaing", "viscera", "viscose", "viscous", "visible", "visibly", "visions", "visited", "visitor", "vistaed", "visuals", "vitally", "vitamin", "vitiate", "vitriol", "vivaces", "vivaing", "vivider", "vividly", "viziers", "vocalic", "vocally", "voguing", "voguish", "voicing", "voiding", "volcano", "volleys", "voltage", "voltaic", "voluble", "volubly", "volumed", "volumes", "vomited", "voodoos", "vouched", "voucher", "vouches", "voyaged", "voyager", "voyages", "voyeurs", "vulture", "wackier", "wadding", "waddled", "waddles", "waffled", "waffles", "wafting", "wagered", "wagging", "waggish", "waggled", "waggles", "wagtail", "waifing", "wailing", "waisted", "waiters", "waiting", "waivers", "waiving", "wakeful", "wakened", "walkers", "walkies", "walking", "walkout", "walkway", "wallaby", "wallahs", "wallets", "walleye", "wallies", "walling", "wallops", "wallows", "walnuts", "waltzed", "waltzes", "wanders", "wangled", "wangles", "wankers", "wanking", "wannabe", "wannest", "wanting", "wantons", "wapitis", "warbled", "warbler", "warbles", "wardens", "warders", "warding", "warfare", "warhead", "wariest", "warlike", "warlock", "warlord", "warmers", "warmest", "warming", "warning", "warpath", "warping", "warrant", "warrens", "warring", "warrior", "warship", "warthog", "wartier", "wartime", "washers", "washing", "washout", "washtub", "waspish", "wassail", "wastage", "wasters", "wasting", "wastrel", "watched", "watcher", "watches", "watered", "wattage", "wattest", "wattled", "wattles", "wavelet", "wavered", "waviest", "waxiest", "waxwing", "waxwork", "waylaid", "waylays", "wayside", "wayward", "weakens", "weakest", "wealthy", "weaning", "weapons", "wearers", "wearied", "wearier", "wearies", "wearily", "wearing", "weasels", "weather", "weavers", "weaving", "webbing", "website", "wedding", "wedging", "wedlock", "weeders", "weedier", "weeding", "weekday", "weekend", "weenies", "weepers", "weepier", "weepies", "weeping", "weevils", "wefting", "weighed", "weights", "weighty", "weirded", "weirder", "weirdly", "weirdos", "weiring", "welcome", "welders", "welding", "welfare", "wellies", "welling", "welshed", "welshes", "welters", "welting", "wenches", "wending", "western", "westing", "wetback", "wetland", "wetness", "wettest", "wetting", "whacked", "whalers", "whaling", "whammed", "wharves", "whatnot", "whatsit", "wheaten", "wheedle", "wheeled", "wheeler", "wheelie", "wheezed", "wheezes", "whelked", "whelped", "whences", "whereas", "whereat", "whereby", "wherein", "whereof", "whereon", "whether", "whetted", "whewing", "whiffed", "whiling", "whimmed", "whimper", "whiners", "whinged", "whinger", "whinges", "whinier", "whining", "whipped", "whippet", "whirled", "whirred", "whisked", "whisker", "whisper", "whistle", "whitens", "whitest", "whiteys", "whither", "whiting", "whitish", "whitter", "whittle", "whizzed", "whizzes", "whoever", "whooped", "whoopee", "whopped", "whopper", "whoring", "whorled", "whupped", "wickers", "wickets", "widened", "widgets", "widowed", "widower", "wielded", "wieners", "wienies", "wigeons", "wigging", "wiggled", "wiggler", "wiggles", "wighted", "wigwags", "wigwams", "wildcat", "wildest", "wilding", "wiliest", "willies", "willing", "willows", "willowy", "wilting", "wimpier", "wimping", "wimpish", "wimpled", "wimples", "winched", "winches", "wincing", "windbag", "windier", "winding", "windows", "windups", "wingers", "winging", "wingtip", "winking", "winkled", "winkles", "winners", "winning", "winnows", "winsome", "winters", "wiretap", "wiriest", "wiseguy", "wishers", "wishful", "wishing", "wispier", "wistful", "witched", "witches", "withers", "withing", "without", "witless", "witness", "witters", "wittier", "wittily", "witting", "wizards", "wizened", "wobbled", "wobbles", "wolfing", "wolfish", "wolfram", "womanly", "wombats", "wonders", "woodcut", "woodier", "woodies", "wooding", "woodman", "woodmen", "woofers", "woofing", "woozier", "wordier", "wording", "workday", "workers", "working", "workman", "workmen", "workout", "workshy", "worktop", "worldly", "wormier", "worming", "worried", "worrier", "worries", "worsens", "worship", "worsted", "wounded", "wounder", "wracked", "wraiths", "wrangle", "wrapped", "wrapper", "wrathed", "wreaked", "wreathe", "wreaths", "wrecked", "wrecker", "wrested", "wrestle", "wriggle", "wriggly", "wringer", "wrinkle", "wrinkly", "writers", "writhed", "writhes", "writing", "written", "wronged", "wronger", "wrongly", "wrought", "wryness", "xeroxed", "xeroxes", "yachted", "yakking", "yammers", "yanking", "yapping", "yardage", "yardarm", "yashmak", "yawning", "yearned", "yelling", "yellows", "yellowy", "yelping", "yeshiva", "yessing", "yielded", "yippees", "yipping", "yogurts", "younger", "yowling", "yttrium", "yuckier", "yucking", "yukking", "yummier", "yuppies", "yuppify", "zaniest", "zanying", "zappers", "zapping", "zealots", "zealous", "zeniths", "zephyrs", "zeroing", "zestful", "zigzags", "zillion", "zincked", "zingers", "zinging", "zinnias", "zippers", "zippier", "zipping", "zircons", "zithers", "zodiacs", "zombies", "zonally", "zoology", "zooming", "zygotes" }; const char* w_8[] = { "aardvark", "abacuses", "abalones", "abandons", "abashing", "abattoir", "abbesses", "abdicate", "abdomens", "abducted", "abductor", "aberrant", "abetting", "abettors", "abeyance", "abhorred", "abidings", "abjected", "abjectly", "abjuring", "ablative", "ablution", "abnegate", "abnormal", "aborting", "abortion", "abortive", "abounded", "abrading", "abrasion", "abrasive", "abridged", "abridges", "abrogate", "abrupter", "abruptly", "abscissa", "absconds", "abseiled", "absences", "absented", "absentee", "absently", "absinthe", "absolute", "absolved", "absolves", "absorbed", "abstains", "abstract", "abstruse", "absurder", "absurdly", "abundant", "abutment", "abutting", "academia", "academic", "acanthus", "acceding", "accented", "accepted", "accessed", "accesses", "accident", "acclaims", "accolade", "accorded", "accosted", "accounts", "accredit", "accruals", "accruing", "accuracy", "accurate", "accursed", "accusers", "accusing", "accustom", "acerbity", "acetates", "achieved", "achiever", "achieves", "achingly", "acolytes", "aconites", "acoustic", "acquaint", "acquired", "acquirer", "acquires", "acreages", "acridest", "acrimony", "acrobats", "acronyms", "acrostic", "acrylics", "actinium", "actioned", "activate", "actively", "activism", "activist", "activity", "actually", "actuated", "actuates", "actuator", "adapting", "adaption", "adaptive", "addendum", "addicted", "addition", "additive", "adducing", "adenoids", "adeptest", "adequacy", "adequate", "adherent", "adhering", "adhesion", "adhesive", "adjacent", "adjoined", "adjourns", "adjudged", "adjudges", "adjuncts", "adjuring", "adjusted", "adjuster", "adjutant", "admirals", "admirers", "admiring", "admitted", "admonish", "adopting", "adoption", "adoptive", "adorable", "adorably", "adorning", "adrenals", "adroiter", "adroitly", "adulated", "adulates", "adultery", "advanced", "advances", "adverser", "adverted", "advisers", "advising", "advisory", "advocacy", "advocate", "aerating", "aeration", "aerators", "aerobics", "aerogram", "aerosols", "aesthete", "affabler", "affected", "affinity", "affirmed", "affixing", "afflicts", "affluent", "afforded", "afforest", "affronts", "aflutter", "agencies", "aggrieve", "agitated", "agitates", "agitator", "agitprop", "aglitter", "agnostic", "agrarian", "agreeing", "agronomy", "ailerons", "ailments", "airbases", "airborne", "airbrush", "aircraft", "aircrews", "airdrome", "airdrops", "airfares", "airfield", "airheads", "airiness", "airlifts", "airliner", "airlines", "airlocks", "airmails", "airports", "airships", "airshows", "airspace", "airspeed", "airstrip", "airtight", "airwaves", "airwoman", "airwomen", "alacrity", "alarming", "alarmist", "albacore", "alcohols", "alderman", "aldermen", "alehouse", "alertest", "alerting", "alfresco", "algebras", "aliasing", "alibiing", "alienate", "aliening", "alighted", "aligning", "alkalies", "alkaline", "alkaloid", "allaying", "alleging", "allegory", "allegros", "alleluia", "allergen", "allergic", "alleyway", "alliance", "allocate", "allotted", "allowing", "alloying", "allspice", "alluding", "alluring", "allusion", "allusive", "alluvial", "alluvium", "almanack", "almanacs", "almighty", "almoners", "alphabet", "altering", "although", "altitude", "altruism", "altruist", "alveolar", "amalgams", "amaranth", "amassing", "amateurs", "ambiance", "ambition", "ambrosia", "ambushed", "ambushes", "amenable", "amending", "amethyst", "amicable", "amicably", "ammeters", "amnesiac", "amorally", "amounted", "amperage", "amputate", "amputees", "anaconda", "anagrams", "analogue", "analysis", "analysts", "analytic", "anapests", "anarchic", "anathema", "anatomic", "ancestor", "ancestry", "anchored", "ancients", "andantes", "andirons", "androgen", "androids", "anecdote", "anemones", "aneurysm", "angelica", "angering", "angriest", "angstrom", "animated", "animates", "animator", "animists", "annealed", "annexing", "annotate", "announce", "annoying", "annually", "annulars", "annulled", "anodynes", "anointed", "anorexia", "anorexic", "answered", "antacids", "anteater", "antedate", "antelope", "antennae", "antennas", "anterior", "anteroom", "anthills", "antibody", "anticked", "antidote", "antigens", "antihero", "antimony", "antiqued", "antiques", "antlered", "antonyms", "anyplace", "anything", "anywhere", "aperitif", "aperture", "aphasics", "aphelion", "aphorism", "apiaries", "apologia", "apoplexy", "apostasy", "apostate", "apostles", "appalled", "apparels", "apparent", "appealed", "appeared", "appeased", "appeaser", "appeases", "appended", "appendix", "appetite", "applauds", "applause", "applying", "appoints", "apposite", "appraise", "apprised", "apprises", "approach", "approval", "approved", "approves", "apricots", "aptitude", "aquanaut", "aquarium", "aquatics", "aquatint", "aqueduct", "aquifers", "aquiline", "arachnid", "arbiters", "arboreal", "archaism", "archduke", "archival", "archived", "archives", "archness", "archways", "ardently", "argosies", "arguable", "arguably", "argument", "armament", "armature", "armbands", "armchair", "armholes", "armloads", "armrests", "aromatic", "arousing", "arpeggio", "arraigns", "arranged", "arranger", "arranges", "arraying", "arrested", "arrivals", "arriving", "arrogant", "arrogate", "arsenals", "arsonist", "arterial", "arteries", "artfully", "articled", "articles", "artifact", "artifice", "artisans", "artistes", "artistic", "artistry", "artsiest", "artworks", "asbestos", "ascended", "ascetics", "ascribed", "ascribes", "ashtrays", "asocials", "asperity", "asphalts", "asphyxia", "aspirant", "aspirate", "aspiring", "aspirins", "assailed", "assassin", "assaults", "assaying", "assemble", "assembly", "assented", "asserted", "assessed", "assesses", "assessor", "assigned", "assisted", "assorted", "assuaged", "assuages", "assuming", "assureds", "assuring", "asterisk", "asteroid", "astonish", "astounds", "astutely", "astutest", "ateliers", "atheists", "athletes", "athletic", "atlantes", "atrocity", "attached", "attacked", "attacker", "attained", "attempts", "attended", "attendee", "attender", "attested", "attiring", "attitude", "attorney", "attracts", "attuning", "atwitter", "atypical", "auctions", "audacity", "audibles", "audience", "auditing", "audition", "auditors", "auditory", "augments", "auguries", "auguring", "auguster", "aureoled", "aureoles", "auricles", "auspices", "austerer", "authored", "autistic", "autobahn", "autocrat", "automate", "autonomy", "autumnal", "availing", "avengers", "avenging", "averaged", "averages", "averring", "aversion", "averting", "aviaries", "aviation", "aviators", "aviatrix", "avionics", "avocados", "avoiding", "avowedly", "awaiting", "awakened", "awarding", "awfuller", "azimuths", "babblers", "babbling", "babushka", "babyhood", "babysits", "bachelor", "bacillus", "backache", "backbite", "backbone", "backchat", "backcomb", "backdate", "backdoor", "backdrop", "backfire", "backhand", "backhoes", "backings", "backlash", "backless", "backlogs", "backpack", "backrest", "backroom", "backside", "backslid", "backspin", "backstop", "backward", "backwash", "backyard", "bacteria", "badgered", "badinage", "badlands", "badmouth", "baffling", "baggiest", "bagpipes", "baguette", "bailiffs", "bailouts", "bakeries", "balanced", "balances", "baldness", "balkiest", "ballasts", "ballcock", "balletic", "ballgirl", "ballgown", "balloons", "balloted", "ballpark", "ballroom", "ballsier", "ballsing", "ballyhoo", "balmiest", "balsamed", "baluster", "banalest", "banality", "bandaged", "bandages", "bandanna", "bandiest", "banditry", "bandsman", "bandsmen", "bandying", "banished", "banishes", "banister", "banjoist", "bankable", "bankbook", "banknote", "bankroll", "bankrupt", "bannered", "bannocks", "banquets", "banshees", "bantered", "baptisms", "baptists", "barbaric", "barbecue", "barbells", "barbered", "barberry", "bareback", "barefoot", "bareness", "barflies", "bargains", "baritone", "barmaids", "barmiest", "barnacle", "barnyard", "baroness", "baronets", "baronial", "baronies", "barracks", "barraged", "barrages", "barrener", "barrette", "barriers", "barrings", "barrooms", "bartered", "baseball", "baseless", "baseline", "basement", "baseness", "basilica", "basilisk", "basketry", "bassinet", "bassists", "bassoons", "bastards", "bastions", "batching", "bathmats", "bathrobe", "bathroom", "bathtubs", "battened", "battered", "battiest", "battlers", "battling", "baulking", "bawdiest", "bayberry", "bayonets", "bazookas", "beaching", "beadiest", "beagling", "beanbags", "beanpole", "bearable", "bearding", "bearings", "bearskin", "beatific", "beatings", "beatniks", "beauties", "beautify", "beavered", "becalmed", "beckoned", "becoming", "bedaubed", "bedazzle", "bedecked", "bedevils", "bedheads", "bedposts", "bedrocks", "bedrolls", "bedrooms", "bedsides", "bedsores", "bedstead", "bedtimes", "beechnut", "beefcake", "beefiest", "beehives", "beelined", "beelines", "beetling", "beetroot", "befallen", "befitted", "befogged", "befouled", "befriend", "befuddle", "begetter", "beggared", "beggarly", "beginner", "begonias", "begotten", "begrudge", "beguiled", "beguiles", "behalves", "behaving", "beheaded", "behemoth", "beholden", "beholder", "bejewels", "belaying", "belching", "belfries", "believed", "believer", "believes", "belittle", "bellboys", "bellhops", "bellowed", "bellyful", "bellying", "belonged", "beloveds", "beltways", "bemoaned", "bemusing", "benching", "bendable", "bendiest", "benefice", "benefits", "benignly", "benumbed", "bequeath", "bequests", "berating", "bereaved", "bereaves", "beriberi", "berrying", "berthing", "besieged", "besieger", "besieges", "besmirch", "besoming", "besotted", "besought", "bespeaks", "bespoken", "bestiary", "bestowal", "bestowed", "bestride", "bestrode", "betaking", "bethinks", "betiding", "betokens", "betrayal", "betrayed", "betrayer", "betroths", "bettered", "beverage", "bewailed", "bewaring", "bewigged", "bewilder", "biannual", "biathlon", "biblical", "bibulous", "bickered", "bicuspid", "bicycled", "bicycles", "biennial", "bifocals", "bigamist", "bigamous", "bighorns", "bigmouth", "bilabial", "bilberry", "billeted", "billfold", "billhook", "billiard", "billings", "billions", "billowed", "billycan", "binaries", "bindings", "bindweed", "binnacle", "binomial", "biopsied", "biopsies", "biplanes", "biracial", "birching", "birdbath", "birdcage", "birdlike", "birdseed", "birdsong", "birdying", "birettas", "birthday", "birthing", "biscuits", "bisected", "bisector", "bisexual", "bitchier", "bitching", "bitingly", "bitterer", "bitterly", "bitterns", "bivalves", "bivouacs", "biweekly", "bizarres", "blabbers", "blabbing", "blackens", "blackest", "blacking", "blackish", "blackleg", "blackout", "blacktop", "bladders", "blagging", "blanched", "blanches", "blandest", "blankest", "blankets", "blanking", "blarneys", "blasters", "blasting", "blastoff", "blathers", "blazoned", "bleached", "bleacher", "bleaches", "bleakest", "blearier", "blearily", "bleating", "bleeders", "bleeding", "bleepers", "bleeping", "blenched", "blenches", "blenders", "blending", "blessing", "blethers", "blighted", "blighter", "blimpish", "blinders", "blindest", "blinding", "blinkers", "blinking", "blintzes", "blissful", "blissing", "blisters", "blithely", "blithest", "blitzing", "blizzard", "bloaters", "bloating", "blobbing", "blockade", "blockage", "blocking", "blondest", "bloodied", "bloodier", "bloodies", "bloodily", "blooding", "bloomers", "blooming", "bloopers", "blossoms", "blotched", "blotches", "blotters", "blotting", "blousing", "blowguns", "blowhard", "blowhole", "blowlamp", "blowouts", "blowpipe", "blowzier", "blubbers", "bludgeon", "bluebell", "bluebird", "bluefish", "bluenose", "bluffers", "bluffest", "bluffing", "blunders", "bluntest", "blunting", "blurrier", "blurring", "blurting", "blushers", "blushing", "blusters", "blustery", "boarders", "boarding", "boasters", "boastful", "boasting", "boatload", "boatyard", "bobbling", "bobolink", "bobsleds", "bobtails", "bobwhite", "bodysuit", "bodywork", "bogeying", "bogeyman", "bogeymen", "boggiest", "boggling", "bohemian", "boilings", "boldface", "boldness", "bollards", "bollocks", "bolsters", "bolthole", "bombards", "bombings", "bombsite", "bonanzas", "bondsman", "bondsmen", "bonehead", "boneless", "bonfires", "bonhomie", "bonniest", "bookable", "bookcase", "bookends", "bookings", "booklets", "bookmark", "bookshop", "bookworm", "boosters", "boosting", "bootlace", "bootlegs", "bootless", "booziest", "bordello", "bordered", "borehole", "boringly", "boroughs", "borrowed", "borrower", "borstals", "bossiest", "botanist", "botching", "bothered", "bottlers", "bottling", "bottomed", "botulism", "boudoirs", "bouffant", "bouillon", "boulders", "bouncers", "bouncier", "bouncing", "boundary", "bounders", "bounding", "bounties", "bouquets", "bourbons", "boutique", "bowsprit", "boxrooms", "boycotts", "boyhoods", "boyishly", "bracelet", "brackets", "brackish", "bradawls", "braggart", "braggers", "bragging", "braiding", "brainier", "braining", "braising", "brakeman", "brakemen", "brambles", "branched", "branches", "brandied", "brandies", "branding", "brandish", "brashest", "brassier", "brassing", "brattier", "bravuras", "brawlers", "brawling", "brawnier", "brazened", "brazenly", "braziers", "breached", "breaches", "breadbox", "breading", "breadths", "breakage", "breakers", "breaking", "breakout", "breakups", "breasted", "breathed", "breather", "breathes", "breeches", "breeders", "breeding", "breezier", "breezily", "breezing", "brethren", "breviary", "brickbat", "brickies", "bricking", "bridging", "bridling", "briefest", "briefing", "brigades", "brigands", "brighten", "brighter", "brightly", "brimming", "brindled", "bringing", "briniest", "brioches", "briskest", "briskets", "brisking", "bristled", "bristles", "britches", "brittler", "broached", "broaches", "broadens", "broadest", "brocaded", "brocades", "broccoli", "brochure", "broilers", "broiling", "brokered", "brollies", "bromides", "bronchus", "bronzing", "brooches", "brooders", "broodily", "brooding", "brooking", "brothels", "brothers", "brougham", "brouhaha", "browbeat", "brownest", "brownier", "brownies", "browning", "brownish", "brownout", "browsers", "browsing", "bruisers", "bruising", "bruiting", "brunched", "brunches", "brunette", "brunting", "brushing", "brusquer", "brutally", "bubblier", "bubbling", "bucketed", "buckeyes", "bucklers", "buckling", "bucksaws", "buckshot", "buckskin", "bucolics", "buddings", "budgeted", "buffered", "buffeted", "buffoons", "bugaboos", "bugbears", "buggered", "buggiest", "builders", "building", "buildups", "bulgiest", "bulimics", "bulkhead", "bulkiest", "bulldogs", "bulldoze", "bulletin", "bullfrog", "bullhorn", "bulliest", "bullocks", "bullpens", "bullring", "bullshit", "bullwhip", "bullying", "bulwarks", "bumblers", "bumbling", "bumpiest", "bumpkins", "bunching", "bundling", "bungalow", "bunghole", "bunglers", "bungling", "buntings", "buoyancy", "burbling", "burdened", "burgeons", "burghers", "burglars", "burglary", "burgling", "burgundy", "burliest", "burnoose", "burnouts", "burritos", "burrowed", "bursitis", "bursting", "bushiest", "bushings", "business", "busloads", "bustiers", "bustiest", "bustling", "busybody", "busyness", "busywork", "butchers", "butchery", "butlered", "buttered", "buttocks", "buttoned", "buttress", "buxomest", "buzzards", "buzzword", "bypassed", "bypasses", "cabarets", "cabbages", "cabinets", "caboodle", "cabooses", "cacheted", "cackling", "cadavers", "cadences", "cadenzas", "caduceus", "caesuras", "caffeine", "caginess", "cagoules", "caissons", "cajolery", "cajoling", "cakewalk", "calabash", "calamine", "calamity", "calcined", "calcines", "calculus", "calendar", "calfskin", "calicoes", "callable", "callings", "calliope", "callower", "callused", "calluses", "calmness", "calories", "calypsos", "cambered", "cambiums", "camellia", "cameoing", "camisole", "campaign", "campfire", "campiest", "campsite", "campused", "campuses", "camshaft", "canaries", "candider", "candidly", "candling", "candying", "canister", "cankered", "cannabis", "cannibal", "canniest", "cannoned", "canoeist", "canoodle", "canopied", "canopies", "cantatas", "canteens", "cantered", "canticle", "canvased", "canvases", "capabler", "capacity", "capering", "capitals", "capitols", "caprices", "capsicum", "capsized", "capsizes", "capstans", "capsuled", "capsules", "captains", "captions", "captious", "captives", "captured", "captures", "caramels", "carapace", "caravans", "caraways", "carbides", "carbines", "carbolic", "carcases", "cardamom", "cardamon", "cardigan", "cardinal", "careened", "careered", "carefree", "careless", "caressed", "caresses", "careworn", "caribous", "carillon", "carjacks", "carloads", "carmines", "carnally", "carnival", "caroming", "carotids", "carousal", "caroused", "carousel", "carouser", "carouses", "carpeted", "carpools", "carports", "carriage", "carriers", "carryall", "carrycot", "carrying", "carryout", "cartload", "cartoons", "carvings", "caryatid", "cascaded", "cascades", "casebook", "caseload", "casement", "casework", "cashiers", "cashless", "cashmere", "cassavas", "cassette", "cassocks", "castanet", "castaway", "castings", "castling", "castoffs", "castrate", "casually", "casualty", "casuists", "catacomb", "catalpas", "catalyst", "catapult", "cataract", "catbirds", "catboats", "catcalls", "catchall", "catchers", "catchier", "catching", "category", "caterers", "catering", "catheter", "cathodes", "catholic", "catsuits", "cattails", "cattiest", "catwalks", "caucused", "caucuses", "cauldron", "caulking", "causally", "causeway", "caustics", "cautions", "cautious", "cavalier", "cavities", "cavorted", "cedillas", "ceilidhs", "ceilings", "celeriac", "celerity", "celestas", "celibacy", "celibate", "cellists", "cellmate", "cellular", "cemented", "cemetery", "cenotaph", "censored", "censured", "censures", "censused", "censuses", "centaurs", "centimes", "centrals", "centrist", "cephalic", "ceramics", "cerebral", "cerebrum", "ceremony", "cerulean", "cervical", "cervices", "cesarean", "cessions", "cesspits", "cesspool", "cetacean", "chaffing", "chagrins", "chaining", "chainsaw", "chairing", "chairman", "chairmen", "chalices", "chalkier", "chalking", "chambers", "chambray", "champers", "champing", "champion", "chancels", "chancery", "chancier", "chancing", "chandler", "changing", "channels", "chanters", "chanteys", "chanting", "chapatis", "chapatti", "chaperon", "chaplain", "chaplets", "chappies", "chapping", "chapters", "charades", "charcoal", "chargers", "charging", "chariest", "chariots", "charisma", "charlady", "charlies", "charmers", "charming", "charring", "charters", "charting", "chastely", "chastens", "chastest", "chastise", "chastity", "chasuble", "chateaus", "chatline", "chattels", "chatters", "chattier", "chattily", "chatting", "cheapens", "cheapest", "cheaters", "cheating", "checking", "checkout", "checkups", "cheekier", "cheekily", "cheeking", "cheeping", "cheerful", "cheerier", "cheerily", "cheering", "cheerses", "cheesier", "cheesing", "cheetahs", "cheffing", "chemical", "chemises", "chemists", "chenille", "cheroots", "cherries", "cherubic", "cherubim", "chessman", "chessmen", "chestnut", "chevrons", "chewiest", "chicanes", "chichier", "chickens", "chickpea", "chiefest", "chiggers", "chignons", "childing", "childish", "children", "chillers", "chillest", "chillier", "chillies", "chilling", "chimeras", "chimneys", "chinking", "chinless", "chinning", "chinwags", "chipmunk", "chippers", "chippies", "chipping", "chirpier", "chirpily", "chirping", "chirrups", "chiseled", "chiseler", "chitchat", "chivalry", "chivvied", "chivvies", "chivying", "chloride", "chlorine", "chocking", "choicest", "choirboy", "choleric", "chomping", "choosier", "choosing", "choppers", "choppier", "choppily", "chopping", "chorales", "chortled", "chortles", "chorused", "choruses", "chowders", "christen", "chroming", "chromium", "chronics", "chubbier", "chucking", "chuckled", "chuckles", "chugging", "chummier", "chummies", "chummily", "chumming", "chunders", "chunkier", "chunters", "churches", "churlish", "churning", "chutneys", "chutzpah", "cilantro", "cinching", "cinchona", "cincture", "cindered", "cinnabar", "cinnamon", "ciphered", "circlets", "circling", "circuits", "circular", "circuses", "cisterns", "citadels", "citation", "citizens", "citruses", "citywide", "civilian", "civility", "clacking", "cladding", "claimant", "claiming", "clambake", "clambers", "clammier", "clamming", "clamping", "clangers", "clanging", "clanking", "clannish", "clansman", "clansmen", "clappers", "clapping", "claptrap", "clareted", "clarinet", "clarions", "clashing", "clasping", "classics", "classier", "classify", "classing", "clatters", "clavicle", "clayiest", "cleaners", "cleanest", "cleaning", "cleansed", "cleanser", "cleanses", "cleanups", "clearest", "clearing", "clearway", "cleavage", "cleavers", "cleaving", "clefting", "clematis", "clemency", "clenched", "clenches", "clergies", "clerical", "clerking", "cleverer", "cleverly", "clicking", "clifftop", "climates", "climatic", "climaxed", "climaxes", "climbers", "climbing", "clinched", "clincher", "clinches", "clingier", "clinging", "clinical", "clinkers", "clinking", "clippers", "clipping", "cliquish", "clitoral", "clitoris", "cloaking", "clobbers", "clocking", "clodding", "clogging", "cloister", "clomping", "clonking", "clopping", "closeout", "closeted", "closures", "clothier", "clothing", "clotting", "clotures", "cloudier", "clouding", "clouting", "clowning", "clownish", "clubbers", "clubbing", "clubfeet", "clubfoot", "clubland", "clucking", "clueless", "clumping", "clumsier", "clumsily", "clunkers", "clunkier", "clunking", "clusters", "clutched", "clutches", "clutters", "coaching", "coachman", "coachmen", "coalesce", "coalface", "coalmine", "coarsely", "coarsens", "coarsest", "coasters", "coasting", "coatings", "coatroom", "coattail", "coattest", "coauthor", "cobblers", "cobbling", "coccyges", "cochleae", "cochleas", "cockades", "cockatoo", "cockerel", "cockeyed", "cockiest", "cockneys", "cockpits", "cocksure", "cocktail", "coconuts", "cocooned", "coddling", "codicils", "codified", "codifies", "codpiece", "coequals", "coercing", "coercion", "coercive", "coexists", "coffined", "cogently", "cogitate", "cognates", "cognomen", "cogwheel", "cohabits", "coherent", "cohering", "cohesion", "cohesive", "coiffing", "coiffure", "coinages", "coincide", "colander", "coldness", "coleslaw", "coliseum", "collagen", "collages", "collapse", "collared", "collated", "collates", "collects", "colleens", "colleges", "collided", "collides", "colliers", "colliery", "colloids", "colloquy", "colluded", "colludes", "collying", "colognes", "colonels", "colonial", "colonies", "colonist", "colossal", "colossus", "columned", "comatose", "combated", "combined", "combines", "comeback", "comedian", "comedies", "comedown", "comelier", "comfiest", "comforts", "commando", "commands", "commence", "commends", "comments", "commerce", "commodes", "commoner", "commonly", "communal", "communed", "communes", "commuted", "commuter", "commutes", "compacts", "compared", "compares", "competed", "competes", "compiled", "compiler", "compiles", "complain", "complete", "complied", "complies", "comports", "composed", "composer", "composes", "composts", "compotes", "compound", "compress", "comprise", "computed", "computer", "computes", "comrades", "conceals", "conceded", "concedes", "conceits", "conceive", "concepts", "concerns", "concerto", "concerts", "conchies", "conching", "conciser", "conclave", "conclude", "concocts", "concrete", "condemns", "condense", "condoled", "condoles", "condoned", "condones", "conduced", "conduces", "conducts", "conduits", "confetti", "confided", "confides", "confined", "confines", "confirms", "conflate", "conflict", "conforms", "confound", "confront", "confused", "confuses", "confuted", "confutes", "congaing", "congeals", "congests", "congress", "conicals", "conifers", "conjoins", "conjoint", "conjugal", "conjured", "conjurer", "conjures", "connects", "connived", "conniver", "connives", "connoted", "connotes", "conquers", "conquest", "consents", "conserve", "consider", "consigns", "consists", "consoled", "consoles", "consorts", "conspire", "constant", "construe", "consular", "consults", "consumed", "consumer", "consumes", "contacts", "contains", "contempt", "contends", "contents", "contests", "contexts", "continua", "continue", "contorts", "contours", "contract", "contrail", "contrary", "contrast", "contrite", "contrive", "controls", "contused", "contuses", "convened", "convener", "convenes", "convents", "converge", "converse", "converts", "convexed", "convexes", "conveyed", "conveyor", "convicts", "convince", "convoked", "convokes", "convoyed", "convulse", "cookbook", "cookouts", "cookware", "coolants", "coolness", "coopered", "copilots", "copulate", "copybook", "copycats", "copyists", "coquetry", "coquette", "coracles", "cordials", "cordless", "cordoned", "corduroy", "cornball", "corncobs", "cornered", "cornices", "corniest", "cornmeal", "cornrows", "corollas", "coronary", "coroners", "coronets", "corporal", "corporas", "corrects", "corridor", "corroded", "corrodes", "corrupts", "corsages", "corsairs", "corseted", "cortical", "cortices", "corvette", "cosigned", "cosigner", "cosiness", "cosmetic", "cosmoses", "cosseted", "costings", "costlier", "costumed", "costumer", "costumes", "coteries", "cottaged", "cottager", "cottages", "cottoned", "couching", "coughing", "councils", "counsels", "counters", "countess", "counties", "counting", "couplets", "coupling", "couriers", "coursing", "courtesy", "courtier", "courting", "couscous", "covenant", "coverage", "coverall", "covering", "coverlet", "covertly", "coveting", "covetous", "cowardly", "cowbells", "cowbirds", "cowering", "cowgirls", "cowhands", "cowhides", "cowlicks", "cowlings", "coworker", "cowpokes", "cowsheds", "cowslips", "coxcombs", "coxswain", "cozening", "coziness", "crabbier", "crabbily", "crabbing", "crabwise", "crackers", "cracking", "crackled", "crackles", "crackpot", "crackups", "cradling", "craftier", "craftily", "crafting", "craggier", "crammers", "cramming", "cramping", "crampons", "craniums", "crankest", "crankier", "cranking", "crannied", "crannies", "crappers", "crappier", "crappies", "crapping", "crashing", "crassest", "cratered", "cravenly", "cravings", "crawlers", "crawling", "crayfish", "crayoned", "craziest", "creakier", "creakily", "creaking", "creamers", "creamery", "creamier", "creaming", "creasing", "creating", "creation", "creative", "creators", "creature", "credence", "credenza", "credible", "credibly", "credited", "creditor", "creeling", "creepers", "creepier", "creepies", "creepily", "creeping", "cremated", "cremates", "creosote", "crescent", "cresting", "crevasse", "crevices", "cribbage", "cribbing", "crickets", "cricking", "criminal", "crimping", "crimsons", "cringing", "crinkled", "crinkles", "crippled", "cripples", "crispest", "crispier", "crisping", "criteria", "critical", "critique", "critters", "croaking", "crochets", "crockery", "crocuses", "crofters", "crofting", "cronyism", "crooking", "crooners", "crooning", "croppers", "cropping", "crosiers", "crossbar", "crossbow", "crossest", "crossing", "crotches", "crotchet", "crouched", "crouches", "croupier", "crouping", "crowbars", "crowding", "crowning", "crucible", "crucifix", "cruddier", "cruelest", "cruisers", "cruising", "crullers", "crumbier", "crumbing", "crumbled", "crumbles", "crummier", "crumpets", "crumpled", "crumples", "crunched", "cruncher", "crunches", "crusaded", "crusader", "crusades", "crushers", "crushing", "crustier", "crusties", "crusting", "crutches", "cryonics", "crystals", "cubicles", "cuckolds", "cucumber", "cuddlier", "cuddling", "cuisines", "culinary", "culottes", "culpable", "culpably", "culprits", "cultural", "cultured", "cultures", "culverts", "cupboard", "cupcakes", "cupidity", "cupolaed", "curacies", "curating", "curative", "curators", "curbside", "curdling", "curlicue", "curliest", "currants", "currency", "currents", "currying", "curseder", "cursored", "curtails", "curtains", "curtness", "curtsied", "curtsies", "curviest", "cushiest", "cushions", "cuspidor", "cussedly", "custards", "customer", "cutaways", "cutbacks", "cuteness", "cutesier", "cuticles", "cuttings", "cyclamen", "cyclical", "cyclists", "cyclones", "cyclonic", "cylinder", "cynicism", "cynosure", "cystitis", "cytology", "czarinas", "czarists", "dabblers", "dabbling", "dactylic", "daffiest", "daffodil", "daftness", "daintier", "dainties", "daintily", "daiquiri", "dairying", "dairyman", "dairymen", "dallying", "damaging", "damasked", "damnable", "damnably", "damneder", "dampened", "dampness", "dandered", "dandiest", "dandling", "dandruff", "dangered", "dangling", "dankness", "dapperer", "dappling", "daringly", "darkened", "darklier", "darkness", "darkroom", "darlings", "darneder", "dashikis", "database", "datebook", "dateline", "daughter", "daunting", "dauphins", "dawdlers", "dawdling", "daybreak", "daydream", "daylight", "dazzling", "deadbeat", "deadbolt", "deadened", "deadhead", "deadlier", "deadline", "deadlock", "deadpans", "deadwood", "deafened", "deafness", "dealings", "dearests", "dearness", "deathbed", "debacles", "debarked", "debarred", "debasing", "debaters", "debating", "debility", "debiting", "debonair", "debriefs", "debugged", "debugger", "debunked", "debuting", "decadent", "decamped", "decanted", "decanter", "decaying", "deceased", "deceases", "decedent", "deceived", "deceiver", "deceives", "decenter", "decently", "decibels", "deciders", "deciding", "decimals", "decimate", "decipher", "decision", "decisive", "deckhand", "declaims", "declared", "declares", "declined", "declines", "decoders", "decoding", "decorate", "decorous", "decouple", "decoying", "decrease", "decrepit", "decrying", "dedicate", "deducing", "deducted", "deejayed", "deepened", "deepness", "deerskin", "defacing", "defaming", "defaults", "defeated", "defecate", "defected", "defector", "defended", "defender", "deferral", "deferred", "defiance", "deficits", "defiling", "definers", "defining", "definite", "deflated", "deflates", "deflects", "deflower", "defogged", "defogger", "deforest", "deformed", "defrauds", "defrayal", "defrayed", "defrocks", "defrosts", "deftness", "defuncts", "defusing", "degraded", "degrades", "deifying", "deigning", "dejected", "delaying", "delegate", "deleting", "deletion", "delicacy", "delicate", "delights", "delimits", "delirium", "delivers", "delivery", "deloused", "delouses", "deluding", "deluging", "delusion", "delusive", "demagogy", "demanded", "demeaned", "demented", "dementia", "demerits", "demesnes", "demigods", "demijohn", "demising", "demisted", "demister", "demobbed", "democrat", "demolish", "demoniac", "demoting", "demotion", "demurely", "demurest", "demurred", "demurrer", "denature", "dendrite", "deniable", "denizens", "denoting", "denounce", "dentists", "dentures", "denuding", "departed", "depended", "depicted", "deplaned", "deplanes", "depleted", "depletes", "deplored", "deplores", "deployed", "deported", "deportee", "deposing", "deposits", "depraved", "depraves", "deprived", "deprives", "deputies", "deputing", "derailed", "deranged", "deranges", "derelict", "deriding", "derision", "derisive", "derisory", "deriving", "derogate", "derricks", "descaled", "descales", "descants", "descends", "descents", "describe", "descried", "descries", "deselect", "deserted", "deserter", "deserved", "deserves", "designed", "designer", "desiring", "desirous", "desisted", "deskills", "desktops", "desolate", "despairs", "despised", "despises", "despoils", "despotic", "desserts", "destined", "destines", "destroys", "destruct", "detached", "detaches", "detailed", "detained", "detainee", "detected", "detector", "detentes", "deterred", "detested", "dethrone", "detonate", "detoured", "detoxify", "detoxing", "detracts", "detritus", "devalued", "devalues", "develops", "deviance", "deviancy", "deviants", "deviated", "deviates", "devilish", "deviltry", "devising", "devolved", "devolves", "devotees", "devoting", "devotion", "devoured", "devouter", "devoutly", "dewberry", "dewdrops", "dextrose", "diabetes", "diabetic", "diabolic", "diagnose", "diagonal", "diagrams", "dialects", "dialysis", "diameter", "diamonds", "diapered", "diarists", "diaspora", "diatonic", "diatribe", "dibbling", "dickered", "dickhead", "dickiest", "dictated", "dictates", "dictator", "didactic", "diddling", "diereses", "dieresis", "dieseled", "dietetic", "differed", "diffract", "diffused", "diffuses", "digested", "digraphs", "dilating", "dilation", "dilatory", "dilemmas", "diligent", "diluting", "dilution", "diminish", "dimpling", "dinettes", "dingbats", "dinghies", "dingiest", "dinkiest", "dinnered", "dinosaur", "diocesan", "dioceses", "dioramas", "dioxides", "diplomas", "diplomat", "dippiest", "dipstick", "directed", "directer", "directly", "director", "dirtiest", "dirtying", "disabled", "disables", "disabuse", "disagree", "disallow", "disarmed", "disarray", "disaster", "disavows", "disbands", "disburse", "discards", "discerns", "disciple", "disclaim", "disclose", "discoing", "discords", "discount", "discover", "discreet", "discrete", "discuses", "disdains", "diseased", "diseases", "disgorge", "disgrace", "disguise", "disgusts", "dishevel", "dishpans", "dishrags", "disinter", "disjoint", "diskette", "disliked", "dislikes", "dislodge", "disloyal", "dismaler", "dismally", "dismayed", "dismount", "disobeys", "disorder", "disowned", "dispatch", "dispense", "disperse", "dispirit", "displace", "displays", "disports", "disposal", "disposed", "disposes", "disproof", "disprove", "disputed", "disputes", "disquiet", "disrobed", "disrobes", "disrupts", "dissects", "dissents", "dissolve", "dissuade", "distaffs", "distance", "distaste", "distends", "distills", "distinct", "distorts", "distract", "distrait", "distress", "district", "distrust", "disturbs", "disunite", "disunity", "disusing", "ditching", "dithered", "ditherer", "dittoing", "diuretic", "diverged", "diverges", "diverted", "divested", "dividend", "dividers", "dividing", "divinely", "diviners", "divinest", "divining", "divinity", "division", "divisive", "divisors", "divorced", "divorces", "divulged", "divulges", "divvying", "dizziest", "dizzying", "doberman", "docilely", "docility", "docketed", "dockland", "dockside", "dockyard", "doctoral", "doctored", "doctrine", "document", "doddered", "dodgiest", "dogcarts", "dogfight", "doggedly", "doggerel", "doggiest", "doggoned", "doggoner", "doggones", "doghouse", "dogmatic", "dogsbody", "dogsleds", "dogtrots", "dogwoods", "doldrums", "dolloped", "dolorous", "dolphins", "domestic", "domicile", "dominant", "dominate", "domineer", "dominion", "dominoes", "donating", "donation", "doodlers", "doodling", "doolally", "doomsday", "doomster", "doorbell", "doorjamb", "doorknob", "doormats", "doorpost", "doorstep", "doorstop", "doorways", "dorkiest", "dormancy", "dormants", "dormouse", "dossiers", "dotingly", "dottiest", "doublets", "doubling", "doubloon", "doubters", "doubtful", "doubting", "douching", "doughier", "dovecote", "dovecots", "dovetail", "dowagers", "dowdiest", "downbeat", "downcast", "downfall", "downhill", "downiest", "download", "downplay", "downpour", "downside", "downsize", "downtime", "downtown", "downturn", "downward", "downwind", "doxology", "doyennes", "doziness", "drabbest", "drabness", "drachmas", "draftees", "dragging", "dragnets", "dragoons", "dragster", "drainage", "drainers", "draining", "dramatic", "drawback", "drawings", "drawling", "dreadful", "dreading", "dreamers", "dreamier", "dreamily", "dreaming", "drearier", "drearies", "drearily", "dredgers", "dredging", "drenched", "drenches", "dressage", "dressers", "dressier", "dressing", "dribbled", "dribbler", "dribbles", "driblets", "drifters", "drifting", "driftnet", "drilling", "drinkers", "drinking", "drippier", "dripping", "driveway", "drivings", "drizzled", "drizzles", "drollery", "drollest", "drooling", "droopier", "drooping", "droplets", "dropouts", "droppers", "dropping", "droughts", "drowning", "drowsier", "drowsily", "drowsing", "drubbing", "drudgery", "drudging", "druggies", "drugging", "druggist", "drumbeat", "drummers", "drumming", "drunkard", "drunkest", "drywalls", "duckbill", "duckling", "duckweed", "ductless", "dukedoms", "dulcimer", "dullards", "dullness", "dumbbell", "dumbness", "dumpiest", "dumpling", "dumpster", "dungaree", "dungeons", "duodenal", "duodenum", "duplexes", "duration", "duskiest", "dustbins", "dustcart", "dustiest", "dustless", "dustpans", "dutiable", "dwarfest", "dwarfing", "dwarfish", "dwarfism", "dwellers", "dwelling", "dwindled", "dwindles", "dyestuff", "dynamics", "dynamism", "dynamite", "dynastic", "dyslexia", "dyslexic", "eagerest", "earaches", "eardrums", "earldoms", "earliest", "earlobes", "earmarks", "earmuffs", "earnests", "earnings", "earphone", "earpiece", "earplugs", "earrings", "earthier", "earthing", "easiness", "easterly", "eastward", "eatables", "eateries", "echelons", "eclectic", "eclipsed", "eclipses", "ecliptic", "economic", "ecstatic", "edgewise", "edginess", "edifices", "edifying", "editable", "editions", "educable", "educated", "educates", "educator", "eeriness", "effacing", "effected", "efficacy", "effigies", "effluent", "effusion", "effusive", "eggheads", "eggplant", "eggshell", "egoistic", "egomania", "egotists", "egresses", "eighteen", "eighties", "ejecting", "ejection", "elapsing", "elastics", "elbowing", "electing", "election", "elective", "electors", "electric", "electron", "elegance", "elegiacs", "elements", "elephant", "elevated", "elevates", "elevator", "eleventh", "elicited", "eligible", "elisions", "elitists", "ellipses", "ellipsis", "elliptic", "elongate", "eloquent", "emaciate", "emailing", "emanated", "emanates", "embalmed", "embalmer", "embarked", "embedded", "embezzle", "embitter", "emblazon", "embodied", "embodies", "embolden", "embolism", "embossed", "embosses", "embraced", "embraces", "embroils", "emceeing", "emending", "emeralds", "emergent", "emerging", "emeritus", "emerying", "emigrant", "emigrate", "eminence", "emirates", "emissary", "emission", "emitting", "emotions", "emperors", "emphases", "emphasis", "emphatic", "employed", "employee", "employer", "emporium", "empowers", "emptiest", "emptying", "emulated", "emulates", "emulator", "emulsify", "emulsion", "enablers", "enabling", "enacting", "encamped", "encasing", "enchants", "encircle", "enclaves", "enclosed", "encloses", "encoders", "encoding", "encoring", "encroach", "encrusts", "encrypts", "encumber", "endanger", "endeared", "endemics", "endgames", "endorsed", "endorser", "endorses", "endowing", "endpoint", "enduring", "energies", "enervate", "enfeeble", "enfolded", "enforced", "enforcer", "enforces", "engaging", "engender", "engineer", "engining", "engorged", "engorges", "engraved", "engraver", "engraves", "engulfed", "enhanced", "enhancer", "enhances", "enjoined", "enjoying", "enlarged", "enlarger", "enlarges", "enlisted", "enlistee", "enlivens", "enmeshed", "enmeshes", "enmities", "ennobled", "ennobles", "enormity", "enormous", "enquirer", "enraging", "enriched", "enriches", "enrolled", "ensconce", "ensemble", "enshrine", "enshroud", "enslaved", "enslaves", "ensnared", "ensnares", "ensuring", "entailed", "entangle", "ententes", "entering", "enthrone", "enthused", "enthuses", "enticing", "entirely", "entirety", "entities", "entitled", "entitles", "entombed", "entrails", "entrance", "entrants", "entreats", "entreaty", "entrench", "entrusts", "entryway", "entwined", "entwines", "envelope", "envelops", "enviable", "enviably", "environs", "envisage", "envision", "epaulets", "ephemera", "epicures", "epidemic", "epidural", "epigrams", "epigraph", "epilepsy", "epilogue", "epiphany", "episodes", "episodic", "epistles", "epitaphs", "epithets", "epitomes", "epoxying", "equality", "equating", "equation", "equators", "equipage", "equipped", "equities", "erasures", "erectile", "erecting", "erection", "erratics", "ersatzes", "erupting", "eruption", "escalate", "escalope", "escapade", "escapees", "escaping", "escapism", "escapist", "escarole", "eschewed", "escorted", "esoteric", "especial", "espousal", "espoused", "espouses", "espresso", "esquires", "essaying", "essayist", "essences", "esteemed", "estimate", "estrange", "etchings", "eternity", "ethereal", "ethicals", "etiology", "eugenics", "eulogies", "eulogist", "euphoria", "euphoric", "eutectic", "evacuate", "evacuees", "evaluate", "evasions", "evenings", "evenness", "evensong", "eventful", "eventide", "eventual", "evermore", "everyday", "everyone", "evicting", "eviction", "evidence", "evidents", "evildoer", "evincing", "evolving", "exactest", "exacting", "exalting", "examined", "examiner", "examines", "exampled", "examples", "excavate", "exceeded", "excelled", "excepted", "excerpts", "excesses", "exchange", "excising", "excision", "exciting", "exclaims", "excluded", "excludes", "excreted", "excretes", "excusing", "execrate", "executed", "executes", "executor", "exegeses", "exegesis", "exemplar", "exempted", "exercise", "exerting", "exertion", "exhaling", "exhausts", "exhibits", "exhorted", "exhuming", "exigency", "exigents", "exiguous", "existent", "existing", "exoduses", "exorcise", "exorcism", "exorcist", "expanded", "expanses", "expected", "expedite", "expelled", "expended", "expenses", "expertly", "expiated", "expiates", "expiring", "explains", "explicit", "exploded", "explodes", "exploits", "explored", "explorer", "explores", "exponent", "exported", "exporter", "exposing", "exposure", "expounds", "expunged", "expunges", "extended", "exterior", "external", "extincts", "extolled", "extorted", "extracts", "extremer", "extremes", "extruded", "extrudes", "exultant", "exulting", "eyeballs", "eyebrows", "eyeglass", "eyeliner", "eyepiece", "eyesight", "eyesores", "eyeteeth", "eyetooth", "fabulous", "faceless", "faceting", "facially", "facility", "factions", "factored", "factotum", "failings", "failures", "faintest", "fainting", "fairness", "fairways", "faithful", "faithing", "falconer", "falconry", "fallback", "fallible", "fallibly", "falloffs", "fallowed", "falsetto", "faltered", "familial", "familiar", "families", "famished", "famishes", "famously", "fanatics", "fanciers", "fanciest", "fanciful", "fancying", "fandango", "fanfares", "fanlight", "fantasia", "fanzines", "farcical", "farewell", "farmhand", "farmland", "farmyard", "farriers", "farrowed", "farthest", "farthing", "fascists", "fashions", "fastball", "fastened", "fastener", "fastness", "fatalism", "fatalist", "fatality", "fatheads", "fathered", "fatherly", "fathomed", "fatigued", "fatigues", "fattened", "fattiest", "faultier", "faultily", "faulting", "fearless", "fearsome", "feasible", "feasibly", "feasting", "feathers", "feathery", "featured", "features", "feckless", "federals", "federate", "feeblest", "feedback", "feedbags", "feedings", "feelgood", "feelings", "feigning", "feinting", "feistier", "feldspar", "felicity", "fellatio", "felonies", "feminine", "feminism", "feminist", "ferments", "ferocity", "ferreted", "ferrules", "ferrying", "ferryman", "ferrymen", "fervency", "fervidly", "festered", "festival", "festoons", "fetching", "fetishes", "fetlocks", "fettered", "feverish", "fiascoes", "ficklest", "fictions", "fiddlers", "fiddlier", "fiddling", "fidelity", "fidgeted", "fielders", "fielding", "fiendish", "fiercely", "fiercest", "fieriest", "fifteens", "fiftieth", "fighters", "fighting", "figments", "figurine", "figuring", "filament", "filberts", "filching", "filigree", "filleted", "fillings", "filliped", "filmiest", "filtered", "filthier", "filthily", "filtrate", "finagled", "finagler", "finagles", "finalist", "finality", "financed", "finances", "findings", "fineness", "finessed", "finesses", "fingered", "finished", "finisher", "finishes", "finitely", "finniest", "firearms", "fireball", "firebomb", "firebugs", "fireplug", "fireside", "firetrap", "firewall", "firewood", "firework", "firmness", "firmware", "fiscally", "fishbowl", "fishcake", "fishhook", "fishiest", "fishnets", "fishtail", "fishwife", "fissures", "fistfuls", "fitfully", "fitments", "fittings", "fixating", "fixation", "fixative", "fixtures", "fizziest", "fizzling", "flabbier", "flagella", "flagging", "flagpole", "flagrant", "flagship", "flailing", "flakiest", "flamenco", "flamingo", "flamings", "flanking", "flannels", "flapjack", "flappers", "flapping", "flashers", "flashest", "flashgun", "flashier", "flashily", "flashing", "flatbeds", "flatboat", "flatcars", "flatfeet", "flatfish", "flatfoot", "flatiron", "flatlets", "flatmate", "flatness", "flattens", "flatters", "flattery", "flattest", "flatting", "flattops", "flatware", "flaunted", "flautist", "flawless", "fleabags", "fleabite", "fleapits", "flecking", "fleecier", "fleecing", "fleetest", "fleeting", "fleshier", "fleshing", "fleshpot", "flexible", "flexibly", "flextime", "flickers", "flicking", "flimflam", "flimsier", "flimsily", "flinched", "flinches", "flinging", "flintier", "flippant", "flippers", "flippest", "flipping", "flirting", "flitting", "floaters", "floating", "flocking", "flogging", "flooding", "floodlit", "flooring", "floozies", "floppier", "floppies", "flopping", "floridly", "florists", "flossing", "flotilla", "flounced", "flounces", "flounder", "flourier", "flouring", "flourish", "flouting", "flowered", "flubbing", "fluently", "fluffier", "fluffing", "fluidity", "flukiest", "flunkies", "flunking", "fluoride", "fluorine", "fluorite", "flurried", "flurries", "flushest", "flushing", "flusters", "flutists", "flutters", "fluttery", "flyblown", "flyovers", "flypaper", "flypasts", "flysheet", "flyspeck", "flywheel", "foamiest", "focusing", "fogbound", "foggiest", "foghorns", "foisting", "foldaway", "folklore", "folksier", "follicle", "followed", "follower", "fomented", "fondants", "fondling", "fondness", "foolscap", "football", "footfall", "foothill", "foothold", "footings", "footling", "footnote", "footpath", "footrest", "footsies", "footsore", "footstep", "footwear", "footwork", "foragers", "foraging", "foraying", "forbears", "forborne", "forceful", "forcible", "forcibly", "forearms", "forebear", "forebode", "forecast", "foredoom", "forefeet", "forefoot", "foregone", "forehand", "forehead", "forelegs", "forelock", "foremast", "foremost", "forename", "forenoon", "forensic", "foreplay", "foresail", "foreseen", "foresees", "foreskin", "forested", "forester", "forestry", "foretell", "foretold", "forewarn", "forewent", "foreword", "forfeits", "forgiven", "forgives", "forgoing", "forkfuls", "forklift", "formalin", "formally", "formerly", "formless", "forsaken", "forsakes", "forsooth", "forswear", "forswore", "forsworn", "fortieth", "fortress", "fortunes", "forwards", "fostered", "foulness", "founders", "founding", "fountain", "fourfold", "foursome", "fourteen", "fourthly", "foxglove", "foxholes", "foxhound", "foxhunts", "foxtrots", "fracases", "fractals", "fraction", "fracture", "fragment", "fragrant", "frailest", "frankest", "franking", "fraughts", "frazzled", "frazzles", "freakier", "freaking", "freakish", "freckled", "freckles", "freebase", "freebies", "freedman", "freedmen", "freedoms", "freehand", "freehold", "freeload", "freesias", "freeware", "freeways", "freewill", "freezers", "freezing", "freights", "frenetic", "frenzied", "frenzies", "frequent", "frescoes", "freshens", "freshers", "freshest", "freshets", "freshman", "freshmen", "fretting", "fretwork", "friaries", "friction", "friendly", "friezing", "frigates", "frigging", "frighted", "frighten", "frigidly", "frillier", "frillies", "fringing", "frippery", "friskier", "friskily", "frisking", "frissons", "fritters", "frizzier", "frizzing", "frizzled", "frizzles", "frontage", "frontier", "fronting", "frostbit", "frostier", "frostily", "frosting", "frothier", "frothing", "frowning", "frowzier", "fructify", "fructose", "frugally", "fruitful", "fruitier", "fruiting", "fruition", "frumpier", "frumpish", "fuchsias", "fuckhead", "fuddling", "fugitive", "fulcrums", "fullback", "fullness", "fumblers", "fumbling", "fumigate", "function", "funerals", "funerary", "funereal", "funfairs", "funkiest", "funniest", "funnyman", "funnymen", "furbelow", "furlongs", "furlough", "furnaces", "furriers", "furriest", "furrowed", "furthers", "furthest", "fuselage", "fusilier", "fussiest", "fusspots", "fustiest", "futilely", "futility", "futurism", "futurist", "futurity", "fuzziest", "gabbiest", "gabbling", "gadabout", "gadflies", "gadgetry", "gainsaid", "gainsays", "galactic", "galaxies", "gallants", "galleons", "galloped", "galoshed", "galoshes", "galumphs", "galvanic", "gamblers", "gambling", "gamecock", "gameness", "gangland", "gangling", "ganglion", "gangrene", "gangstas", "gangster", "gangways", "gantlets", "gantries", "gaolbird", "garaging", "garbanzo", "garbling", "gardened", "gardener", "gardenia", "gargling", "gargoyle", "garishly", "garlands", "garlicky", "garments", "garnered", "garrison", "garroted", "garrotes", "gaslight", "gasoline", "gassiest", "gasworks", "gatepost", "gateways", "gathered", "gatherer", "gauchest", "gaudiest", "gauntest", "gaunting", "gauntlet", "gauziest", "gavottes", "gawkiest", "gazelles", "gazetted", "gazettes", "gazpacho", "gazumped", "geekiest", "geldings", "gemstone", "gendarme", "generals", "generate", "generics", "generous", "genetics", "genially", "genitals", "genitive", "geniuses", "genocide", "gentians", "gentiles", "gentlest", "gentling", "gentries", "gentrify", "geodesic", "geologic", "geometer", "geometry", "geranium", "germinal", "gestalts", "gestated", "gestates", "gestured", "gestures", "getaways", "gherkins", "ghosting", "ghoulish", "giantess", "gibbered", "gibbeted", "giddiest", "gigabyte", "gigantic", "gigglers", "gigglier", "giggling", "gimcrack", "gimleted", "gimmicks", "gimmicky", "gimpiest", "gingered", "gingerly", "ginkgoes", "giraffes", "girdling", "girlhood", "giveaway", "gizzards", "glaciers", "gladdens", "gladdest", "gladiola", "gladioli", "gladlier", "gladness", "glancing", "glasnost", "glassful", "glassier", "glassing", "glaucoma", "glaziers", "gleaming", "gleaning", "glibbest", "glibness", "glimmers", "glimpsed", "glimpses", "glinting", "glistens", "glitches", "glitters", "glittery", "glitzier", "gloaming", "gloating", "globally", "globular", "globules", "gloomier", "gloomily", "glopping", "glorious", "glorying", "glossary", "glossier", "glossies", "glossing", "glowered", "glowworm", "glummest", "glumness", "glutting", "gluttons", "gluttony", "glycerin", "glycerol", "glycogen", "gnarlier", "gnarling", "gnashing", "goalless", "goalpost", "goatherd", "goatskin", "gobblers", "gobbling", "godawful", "godchild", "godliest", "godsends", "godspeed", "goggling", "goldener", "goldfish", "goldmine", "golliwog", "gondolas", "goodbyes", "goodlier", "goodness", "goodwill", "goofiest", "googlies", "gorgeous", "gorillas", "goriness", "gormless", "goslings", "gossamer", "gouaches", "gourmand", "gourmets", "goutiest", "governed", "governor", "grabbier", "grabbing", "graceful", "gracious", "grackles", "gradable", "gradient", "graduate", "graffiti", "graffito", "grafters", "grafting", "grainier", "grammars", "grandads", "granddad", "grandees", "grandest", "grandeur", "grandmas", "grandpas", "grandson", "grannies", "granting", "granular", "granules", "graphics", "graphing", "graphite", "grapnels", "grappled", "grapples", "grasping", "grassier", "grassing", "grateful", "gratings", "gratuity", "gravelly", "gravitas", "grayness", "greasers", "greasier", "greasing", "greatest", "greedier", "greedily", "greenery", "greenest", "greenfly", "greening", "greenish", "greeting", "gremlins", "grenades", "greyness", "griddles", "gridiron", "gridlock", "grieving", "grievous", "griffins", "grilling", "grimaced", "grimaces", "grimiest", "grimmest", "grimness", "grinders", "grinding", "grinning", "gripping", "grislier", "gritters", "grittier", "gritting", "grizzled", "grizzles", "groaning", "groggier", "groggily", "grommets", "grooming", "groovier", "grooving", "grosbeak", "grossest", "grossing", "grottier", "grottoes", "grouched", "grouches", "grounded", "grounder", "groupers", "groupies", "grouping", "grousing", "grouting", "growling", "grownups", "grubbier", "grubbing", "grudging", "gruesome", "gruffest", "gruffing", "grumbled", "grumbler", "grumbles", "grumpier", "grumpily", "grungier", "grunting", "guaranty", "guardian", "guarding", "guessers", "guessing", "guesting", "guffawed", "guidance", "guilders", "guileful", "guiltier", "guiltily", "gullible", "gumballs", "gumboots", "gumdrops", "gummiest", "gumption", "gumshoes", "gunboats", "gunfight", "gunmetal", "gunpoint", "gunshots", "gunsmith", "gunwales", "gurgling", "gushiest", "gusseted", "gustiest", "gutsiest", "guttered", "guttural", "guzzlers", "guzzling", "gymkhana", "gymnasts", "gymslips", "gyrating", "gyration", "habitats", "habitual", "hacienda", "hackneys", "hacksaws", "haddocks", "haggises", "hagglers", "haggling", "hairband", "haircuts", "hairgrip", "hairiest", "hairless", "hairline", "hairnets", "hairpins", "halberds", "halfback", "halftime", "halftone", "halfwits", "halibuts", "hallmark", "hallowed", "hallways", "halogens", "haltered", "haltings", "halyards", "hammered", "hammocks", "hampered", "hamsters", "handbags", "handball", "handbill", "handbook", "handcars", "handcart", "handcuff", "handfuls", "handguns", "handhold", "handicap", "handiest", "handlers", "handling", "handmade", "handmaid", "handouts", "handover", "handpick", "handrail", "handsaws", "handsets", "handsome", "handwork", "handyman", "handymen", "hangings", "hangnail", "hangouts", "hangover", "hankered", "happened", "happiest", "harangue", "harassed", "harasses", "hardback", "hardball", "hardcore", "hardened", "hardener", "hardiest", "hardness", "hardship", "hardtack", "hardtops", "hardware", "hardwood", "harebell", "harelips", "haricots", "harmless", "harmonic", "harpists", "harpoons", "harridan", "harrowed", "harrumph", "harrying", "harshest", "harvests", "hassling", "hassocks", "hastened", "hastiest", "hatbands", "hatboxes", "hatchery", "hatchets", "hatching", "hatchway", "hatstand", "hauliers", "haunched", "haunches", "haunting", "hawthorn", "haycocks", "haylofts", "hayricks", "hayrides", "hayseeds", "haystack", "hazarded", "hazelnut", "haziness", "headache", "headband", "headbutt", "headcase", "headgear", "headhunt", "headiest", "headings", "headlamp", "headland", "headless", "headline", "headlock", "headlong", "headrest", "headroom", "headsets", "headship", "headwind", "headword", "hearings", "hearkens", "hearsing", "heartens", "heartier", "hearties", "heartily", "hearting", "heatedly", "heathens", "heatwave", "heavenly", "heaviest", "heavyset", "hecklers", "heckling", "hectares", "hectored", "hedgehog", "hedgerow", "hedonism", "hedonist", "heedless", "heehawed", "heftiest", "hegemony", "heighten", "heirloom", "heisting", "helipads", "heliport", "hellhole", "hellions", "helmeted", "helmsman", "helmsmen", "helpings", "helpless", "helpline", "helpmate", "hemlines", "hemlocks", "henchman", "henchmen", "hennaing", "henpecks", "hepatics", "heptagon", "heralded", "heraldic", "heraldry", "herdsman", "herdsmen", "heredity", "heresies", "heretics", "hereupon", "herewith", "heritage", "hermetic", "heroines", "herrings", "hesitant", "hesitate", "hexagons", "hiatuses", "hibachis", "hibiscus", "hideaway", "hideouts", "highball", "highborn", "highboys", "highbrow", "highland", "highness", "hightail", "highways", "hijacked", "hijacker", "hilarity", "hilliest", "hillocks", "hillside", "hilltops", "hindered", "hindmost", "hipbaths", "hippiest", "hipsters", "hireling", "historic", "hitching", "hitherto", "hoarders", "hoarding", "hoariest", "hoarsely", "hoarsest", "hobbling", "hobbyist", "hobnails", "hockshop", "hoedowns", "hogshead", "hoicking", "hoisting", "holdalls", "holdings", "holdouts", "holdover", "holidays", "holiness", "holistic", "hollered", "hollowed", "hollower", "hollowly", "hologram", "holsters", "homaging", "homburgs", "homebody", "homeboys", "homeland", "homeless", "homelier", "homemade", "homepage", "homering", "homeroom", "homesick", "homespun", "hometown", "homeward", "homework", "homicide", "homilies", "homonyms", "honester", "honestly", "honeybee", "honeydew", "honeying", "honeypot", "honorary", "hoodlums", "hoodooed", "hoodwink", "hookiest", "hookworm", "hooligan", "hoorayed", "hoovered", "hopefuls", "hopeless", "horizons", "hormonal", "hormones", "horniest", "hornless", "hornpipe", "horology", "horrible", "horribly", "horridly", "horrific", "horsebox", "horsefly", "horseman", "horsemen", "horsiest", "hosannas", "hosepipe", "hospices", "hospital", "hostages", "hosteled", "hosteler", "hostelry", "hostiles", "hostlers", "hotcakes", "hotelier", "hotfoots", "hotheads", "hothouse", "hotplate", "hotshots", "hounding", "hourlies", "houseboy", "housefly", "houseful", "houseman", "housemen", "housetop", "housings", "hovering", "howdying", "howitzer", "huckster", "huddling", "huffiest", "hugeness", "humanely", "humanest", "humanism", "humanist", "humanity", "humanoid", "humblest", "humbling", "humidify", "humidity", "humidors", "humility", "hummocks", "humorist", "humorous", "humpback", "hunching", "hundreds", "hungered", "hungover", "hungrier", "hungrily", "hunkered", "hunkiest", "huntress", "huntsman", "huntsmen", "hurdlers", "hurdling", "hurrying", "hurtling", "husbands", "huskiest", "hustings", "hustlers", "hustling", "hutching", "hyacinth", "hydrants", "hydrated", "hydrates", "hydrogen", "hygienic", "hyphened", "hypnoses", "hypnosis", "hypnotic", "hysteria", "hysteric", "icebergs", "icebound", "iceboxes", "idealism", "idealist", "identify", "identity", "ideogram", "ideology", "idiocies", "idleness", "idolater", "idolatry", "igniting", "ignition", "ignominy", "ignorant", "ignoring", "illegals", "illumine", "illusion", "illusive", "illusory", "imagined", "imagines", "imbecile", "imbibing", "imitated", "imitates", "imitator", "immanent", "immature", "immenser", "immersed", "immerses", "imminent", "immobile", "immodest", "immolate", "immortal", "immunity", "immuring", "impacted", "impaired", "impaling", "impanels", "imparted", "impasses", "impeding", "impelled", "impended", "imperial", "imperils", "impetigo", "impinged", "impinges", "impishly", "implants", "implicit", "imploded", "implodes", "implored", "implores", "implying", "impolite", "imported", "importer", "imposing", "impostor", "impotent", "impounds", "imprints", "imprison", "improper", "improved", "improves", "impudent", "impugned", "impulsed", "impulses", "impunity", "impurely", "impurest", "impurity", "imputing", "inaction", "inactive", "inasmuch", "inboards", "inbounds", "inbreeds", "incensed", "incenses", "inchoate", "incident", "incising", "incision", "incisive", "incisors", "inciting", "inclined", "inclines", "included", "includes", "incomers", "incoming", "increase", "incubate", "incurred", "indebted", "indecent", "indented", "indexing", "indicate", "indicted", "indigent", "indirect", "indolent", "inducing", "inducted", "inductee", "indulged", "indulges", "industry", "inedible", "inequity", "inertial", "inexpert", "infamies", "infamous", "infantry", "infected", "inferior", "infernal", "infernos", "inferred", "infested", "infidels", "infields", "infilled", "infinite", "infinity", "inflamed", "inflames", "inflated", "inflates", "inflects", "inflicts", "influxes", "informal", "informed", "informer", "infrared", "infringe", "infusing", "infusion", "ingested", "ingrains", "ingrates", "inhabits", "inhalant", "inhalers", "inhaling", "inherent", "inhering", "inherits", "inhibits", "inhumane", "inimical", "iniquity", "initials", "initiate", "injected", "injector", "injuries", "injuring", "inkblots", "inkiness", "inklings", "inkstand", "inkwells", "inlaying", "innately", "innocent", "innovate", "innuendo", "inputted", "inquests", "inquirer", "insanely", "insanest", "insanity", "inscribe", "insecure", "inserted", "insiders", "insights", "insignia", "insisted", "insolent", "insomnia", "inspects", "inspired", "inspires", "installs", "instance", "instants", "instills", "instinct", "instruct", "insulate", "insulted", "insureds", "insurers", "insuring", "intaglio", "integers", "integral", "intended", "intenser", "intently", "interact", "intercom", "interest", "interior", "internal", "interned", "internee", "interred", "interval", "interwar", "intimacy", "intimate", "intoning", "intranet", "intrepid", "intrigue", "intruded", "intruder", "intrudes", "intuited", "inundate", "invaders", "invading", "invalids", "invasion", "invasive", "inveighs", "inveigle", "invented", "inventor", "inverses", "inverted", "invested", "investor", "inviting", "invoiced", "invoices", "invoking", "involved", "involves", "inwardly", "ironclad", "ironical", "ironware", "ironwork", "irrigate", "irritant", "irritate", "islander", "isolated", "isolates", "isotherm", "isotopes", "isotopic", "issuance", "itchiest", "iterated", "iterates", "iterator", "jabbered", "jabberer", "jackboot", "jackdaws", "jackpots", "jaggeder", "jaggedly", "jailbird", "jalopies", "jalousie", "jamboree", "jammiest", "jangling", "janitors", "japanned", "jasmines", "jaundice", "jauntier", "jaunties", "jauntily", "jaunting", "javelins", "jawboned", "jawbones", "jawlines", "jaywalks", "jazziest", "jealousy", "jellying", "jemmying", "jeopardy", "jeremiad", "jerkiest", "jeroboam", "jerrycan", "jetliner", "jettison", "jiggered", "jiggling", "jigsawed", "jimmying", "jingling", "jingoism", "jingoist", "jobshare", "jockeyed", "jocosely", "jocosity", "jocundly", "jodhpurs", "joggling", "johnnies", "jointing", "jokingly", "jolliest", "jollying", "jonquils", "jostling", "jottings", "jouncing", "journals", "journeys", "jousting", "jovially", "joyfully", "joyously", "joyrider", "joyrides", "joystick", "jubilant", "jubilees", "juddered", "judicial", "jugglers", "juggling", "jugulars", "juiciest", "julienne", "jumbling", "jumpiest", "jumpsuit", "junction", "juncture", "junipers", "junketed", "junkiest", "junkyard", "justices", "justness", "juvenile", "kamikaze", "kangaroo", "karaokes", "katydids", "kayaking", "kedgeree", "keelhaul", "keenness", "keepsake", "kerbside", "kerchief", "kerosene", "kestrels", "keyboard", "keyholes", "keynoted", "keynotes", "keypunch", "keystone", "keywords", "kibitzed", "kibitzer", "kibitzes", "kickback", "kickiest", "kickoffs", "kiddying", "kielbasa", "killdeer", "killings", "killjoys", "kilobyte", "kilotons", "kilowatt", "kindlier", "kindling", "kindness", "kinetics", "kinfolks", "kingdoms", "kinglier", "kingpins", "kingship", "kinkiest", "kinsfolk", "kippered", "kirsches", "kitchens", "klutzier", "knackers", "knacking", "knapsack", "kneaders", "kneading", "kneecaps", "kneeling", "knelling", "knickers", "knighted", "knightly", "knitters", "knitting", "knitwear", "knobbier", "knockers", "knocking", "knockoff", "knockout", "knothole", "knottier", "knotting", "knowable", "knowings", "knuckled", "knuckles", "kohlrabi", "kookiest", "koshered", "kowtowed", "kumquats", "kvetched", "kvetches", "laburnum", "lacerate", "lacquers", "lacrosse", "lactated", "lactates", "laddered", "ladybird", "ladybugs", "ladylike", "ladyship", "laggards", "lakeside", "lamasery", "lambadas", "lambaste", "lambkins", "lambskin", "lameness", "lamented", "laminate", "lampoons", "lamppost", "lampreys", "landfall", "landfill", "landings", "landlady", "landless", "landlord", "landmark", "landmass", "landmine", "landslid", "landslip", "landward", "language", "languish", "languors", "lankiest", "lanterns", "lanyards", "lapidary", "lapwings", "larboard", "lariated", "larkspur", "larynges", "lasagnas", "lashings", "lassoing", "latching", "latchkey", "lateness", "laterals", "lathered", "latitude", "latrines", "latterly", "latticed", "lattices", "laudable", "laudably", "laudanum", "laughing", "laughter", "launched", "launcher", "launches", "launders", "laureate", "lavatory", "lavender", "lavished", "lavisher", "lavishes", "lavishly", "lawfully", "lawgiver", "lawmaker", "lawsuits", "laxative", "layabout", "layering", "layettes", "layovers", "laywoman", "laywomen", "laziness", "leaching", "leafiest", "leafless", "leaflets", "leaguing", "leakages", "leakiest", "leanings", "leanness", "leapfrog", "learners", "learning", "leashing", "leathers", "leathery", "leavened", "leavings", "lecithin", "lecterns", "lectured", "lecturer", "lectures", "ledgered", "leeching", "leeriest", "leewards", "leftists", "leftmost", "leftover", "leftward", "legacies", "legalese", "legalism", "legality", "legatees", "legating", "legation", "leggiest", "leggings", "legrooms", "leisured", "lemmings", "lemonade", "lemoning", "lengthen", "leniency", "lenients", "leopards", "leotards", "lesbians", "lessened", "letdowns", "lethally", "lethargy", "lettered", "lettings", "lettuces", "leverage", "levering", "levitate", "lewdness", "lexicons", "liaising", "liaisons", "libation", "liberals", "liberate", "libretto", "licensee", "lickings", "licorice", "lifebelt", "lifeboat", "lifeless", "lifelike", "lifeline", "lifelong", "lifespan", "lifetime", "lifework", "liftoffs", "ligament", "ligature", "lightens", "lighters", "lightest", "lighting", "likelier", "likeness", "likening", "likewise", "limbered", "limberer", "limbless", "limboing", "limeades", "limerick", "limiting", "limpidly", "limpness", "linchpin", "lineages", "lineally", "linearly", "linefeed", "linesman", "linesmen", "lingered", "lingerer", "lingerie", "linguist", "liniment", "linkages", "linoleum", "lipreads", "lipstick", "liqueurs", "liquored", "listened", "listener", "listeria", "listings", "listless", "litanies", "literacy", "literals", "literary", "literate", "literati", "litigant", "litigate", "littered", "littlest", "littoral", "livelier", "livelong", "livening", "liveried", "liveries", "liverish", "loadable", "loamiest", "loanword", "loathing", "lobbying", "lobbyist", "lobotomy", "lobsters", "localing", "locality", "locating", "location", "lockable", "lockouts", "lockstep", "locoweed", "locution", "lodestar", "lodgings", "loftiest", "logbooks", "logician", "logistic", "logotype", "loitered", "loiterer", "lollipop", "lolloped", "lonelier", "lonesome", "longboat", "longbows", "longhair", "longhand", "longhorn", "longings", "longtime", "longueur", "longways", "lookouts", "looniest", "loophole", "loopiest", "loosened", "lopsided", "lordlier", "lordship", "loudlier", "loudness", "loungers", "lounging", "lousiest", "lovebird", "loveless", "lovelier", "lovelies", "lovelorn", "lovesick", "lovingly", "lowbrows", "lowering", "lowlands", "lowliest", "loyalest", "loyalist", "lozenges", "lucidity", "luckiest", "luckless", "lugholes", "lukewarm", "lumbered", "luminary", "luminous", "lummoxes", "lumpiest", "lunacies", "lunatics", "lunchbox", "luncheon", "lunching", "lungfuls", "lurching", "luscious", "lushness", "lustiest", "lustrous", "luxuries", "lychgate", "lymphoma", "lynching", "lyrebird", "lyricism", "lyricist", "macaroni", "macaroon", "macerate", "machetes", "machined", "machines", "machismo", "mackerel", "mackinaw", "maddened", "madhouse", "madrases", "madrigal", "madwoman", "madwomen", "maestros", "magazine", "magician", "magicked", "magnates", "magnesia", "magnetic", "magnetos", "magnolia", "maharani", "mahatmas", "mahogany", "maidenly", "mailbags", "mailings", "mailshot", "mainland", "mainline", "mainmast", "mainsail", "mainstay", "maintain", "majestic", "majoring", "majority", "makeover", "maladies", "malarial", "malarkey", "maleness", "malicing", "maligned", "malinger", "mallards", "maltreat", "mamboing", "mammoths", "manacled", "manacles", "managers", "managing", "manatees", "mandalas", "mandarin", "mandated", "mandates", "mandible", "mandolin", "mandrake", "mandrill", "manfully", "mangiest", "mangling", "mangrove", "manholes", "manhunts", "maniacal", "manicure", "manifest", "manifold", "manikins", "manliest", "mannered", "mannerly", "manorial", "manpower", "mansards", "mansions", "mantilla", "mantises", "mantissa", "mantling", "manually", "manumits", "manuring", "mappings", "marabous", "marathon", "marauded", "marauder", "marbling", "marchers", "marching", "marginal", "mariachi", "marigold", "marimbas", "marinade", "marinate", "mariners", "maritime", "marjoram", "markdown", "markedly", "marketed", "marketer", "markings", "marksman", "marksmen", "marmoset", "marooned", "marquees", "marquess", "marquise", "marriage", "marrieds", "marrowed", "marrying", "marshals", "marshier", "martinet", "martinis", "martyred", "marzipan", "mascaras", "massacre", "massaged", "massages", "masseurs", "masseuse", "mastered", "masterly", "masthead", "mastiffs", "mastitis", "mastodon", "mastoids", "matadors", "matchbox", "matching", "material", "maternal", "matrices", "matronly", "mattered", "mattocks", "mattress", "maturely", "maturest", "maturing", "maturity", "maunders", "maverick", "maxillae", "maximals", "maximums", "mayflies", "mayoress", "maypoles", "meagerly", "mealiest", "mealtime", "meanders", "meanings", "meanness", "meantime", "measlier", "measured", "measures", "meatball", "meatiest", "meatloaf", "mechanic", "meddlers", "meddling", "mediated", "mediates", "mediator", "medicals", "medicate", "medicine", "medieval", "mediocre", "meditate", "medullas", "meekness", "meetings", "megabyte", "megalith", "megastar", "megatons", "megawatt", "melamine", "melanges", "melanoma", "mellowed", "mellower", "melodics", "melodies", "meltdown", "membrane", "mementos", "memorial", "memories", "memsahib", "menacing", "menhaden", "menially", "menorahs", "menswear", "mentally", "mentions", "mentored", "merchant", "merciful", "mercuric", "meridian", "meringue", "meriting", "mermaids", "merriest", "mescalin", "mesdames", "mesmeric", "mesquite", "messaged", "messages", "messiahs", "messiest", "mestizos", "metallic", "metaphor", "meteoric", "methanol", "methinks", "metrical", "microbes", "middling", "midfield", "midlands", "midmosts", "midnight", "midpoint", "midriffs", "midsized", "midterms", "midweeks", "midwifed", "midwifes", "midwives", "midyears", "mightier", "mightily", "migraine", "migrants", "migrated", "migrates", "mildewed", "mildness", "mileages", "milepost", "militant", "military", "militate", "militias", "milkiest", "milkmaid", "milksops", "milkweed", "millibar", "milliner", "millions", "millpond", "millrace", "mimicked", "minarets", "minatory", "mindless", "mindsets", "minerals", "mingling", "minibars", "minibike", "minicabs", "minicams", "minimals", "minimums", "minister", "ministry", "minivans", "minoring", "minority", "minsters", "minstrel", "mintiest", "minuends", "minutely", "minutest", "minutiae", "minuting", "miracles", "mirrored", "mirthful", "misapply", "miscalls", "miscarry", "miscasts", "mischief", "miscount", "miscuing", "misdeals", "misdealt", "misdeeds", "misdoing", "miseries", "misfired", "misfires", "misguide", "misheard", "mishears", "mishmash", "misjudge", "misleads", "mismatch", "misnamed", "misnames", "misnomer", "misogyny", "misplace", "misplays", "misprint", "misquote", "misreads", "misruled", "misrules", "missiles", "missions", "missives", "misspell", "misspend", "misspent", "misstate", "missteps", "mistaken", "mistakes", "mistiest", "mistimed", "mistimes", "mistreat", "mistress", "mistrial", "mistrust", "mistypes", "misusing", "mitigate", "mixtures", "mnemonic", "mobility", "mobsters", "moccasin", "moderate", "moderner", "modester", "modestly", "modicums", "modified", "modifier", "modifies", "modishly", "modulate", "moieties", "moistens", "moistest", "moisture", "molasses", "moldered", "molecule", "molehill", "moleskin", "molested", "molester", "mollusks", "momentum", "monarchs", "monarchy", "monastic", "monaural", "monetary", "moneybag", "moneybox", "mongered", "mongoose", "mongrels", "monikers", "monitors", "monkeyed", "monocles", "monogamy", "monogram", "monolith", "monopoly", "monorail", "monotone", "monotony", "monoxide", "monsieur", "monsoons", "monsters", "montages", "monument", "moochers", "mooching", "moodiest", "moonbeam", "moonless", "moonshot", "moorhens", "moorings", "moorland", "moraines", "moralist", "morality", "moralled", "morasses", "morbidly", "mordants", "moreover", "moribund", "mornings", "morosely", "morpheme", "morphine", "morphing", "mortally", "mortared", "mortgage", "mortised", "mortises", "mortuary", "moseying", "mosquito", "mossiest", "mothball", "mothered", "motherly", "motioned", "motivate", "motliest", "motorcar", "motoring", "motorist", "motorman", "motormen", "motorway", "mottling", "moulders", "moulting", "mounding", "mountain", "mounting", "mourners", "mournful", "mourning", "mousiest", "moussaka", "moussing", "mouthful", "mouthing", "movables", "movement", "movingly", "mucilage", "muckiest", "muckrake", "muddiest", "muddling", "muddying", "mudflaps", "mudflats", "mudguard", "mudpacks", "mudslide", "muezzins", "mufflers", "muffling", "muggiest", "muggings", "mulberry", "mulching", "muleteer", "mulishly", "mullions", "multiple", "multiply", "mumblers", "mumbling", "munchies", "munching", "mundanes", "munition", "muralist", "murdered", "murderer", "murkiest", "murmured", "muscatel", "muscling", "muscular", "mushiest", "mushroom", "musicale", "musicals", "musician", "musicked", "musketry", "muskiest", "muskrats", "mussiest", "mustangs", "mustered", "mustiest", "mutating", "mutation", "muteness", "mutilate", "mutineer", "mutinied", "mutinies", "mutinous", "muttered", "mutually", "muzzling", "mycology", "mystical", "mystique", "mythical", "nakedest", "nameless", "namesake", "nannying", "napalmed", "nappiest", "narcosis", "narcotic", "narrated", "narrates", "narrator", "narrowed", "narrower", "narrowly", "narwhals", "nastiest", "national", "nativity", "nattered", "nattiest", "naturals", "naturing", "naturism", "naturist", "nauseate", "nauseous", "nautical", "nautilus", "navigate", "naysayer", "nearlier", "nearness", "nearside", "neatened", "neatness", "nebulous", "neckband", "necklace", "neckline", "neckties", "necrosis", "needfuls", "neediest", "needless", "needling", "negating", "negation", "negative", "neglects", "negligee", "neighing", "nematode", "neonatal", "neonates", "neophyte", "neoprene", "nepotism", "nerdiest", "nerviest", "nestling", "nettling", "networks", "neuritis", "neurones", "neuroses", "neurosis", "neurotic", "neutered", "neutrals", "neutrino", "neutrons", "newborns", "newcomer", "newlywed", "newsboys", "newscast", "newsiest", "newsreel", "newsroom", "nibblers", "nibbling", "niceness", "niceties", "nickname", "nicotine", "niftiest", "niggards", "niggling", "nightcap", "nighties", "nihilism", "nihilist", "nimblest", "ninepins", "nineteen", "nineties", "nippered", "nippiest", "nippling", "nitpicks", "nitrated", "nitrates", "nitrogen", "nobbling", "nobility", "nobleman", "noblemen", "nobodies", "nocturne", "noisiest", "nominate", "nominees", "nondairy", "nonempty", "nonesuch", "nonevent", "nonfatal", "nonhuman", "nonrigid", "nonsense", "nonstick", "nontoxic", "nonunion", "nonusers", "nonwhite", "noodling", "noontime", "normalcy", "normally", "northern", "nosebags", "nosedive", "nosegays", "nosiness", "nostrils", "nostrums", "notables", "notaries", "notation", "notching", "notebook", "notelets", "notepads", "nothings", "noticing", "notified", "notifies", "notional", "novelist", "novellas", "nowadays", "nugatory", "nuisance", "numbered", "numbness", "numeracy", "numerals", "numerate", "numerous", "numinous", "numskull", "nuptials", "nurtured", "nurtures", "nutcases", "nuthatch", "nuthouse", "nutmeats", "nutrient", "nutshell", "nuttiest", "nuzzling", "nymphets", "oarlocks", "oatcakes", "obduracy", "obdurate", "obedient", "obeisant", "obelisks", "obituary", "objected", "objector", "oblation", "obligate", "obliging", "obliques", "oblivion", "obscener", "obscured", "obscurer", "obscures", "observed", "observer", "observes", "obsessed", "obsesses", "obsidian", "obsolete", "obstacle", "obstruct", "obtained", "obtruded", "obtrudes", "obtusely", "obtusest", "obverses", "obviated", "obviates", "ocarinas", "occasion", "occluded", "occludes", "occupant", "occupied", "occupier", "occupies", "occurred", "octagons", "oculists", "oddballs", "oddities", "oddments", "odiously", "odometer", "odysseys", "offbeats", "offended", "offender", "offering", "officers", "official", "offloads", "offshoot", "offshore", "offsides", "offstage", "oftenest", "oilcloth", "oilfield", "oiliness", "oilskins", "ointment", "oldening", "oleander", "oligarch", "omission", "omitting", "omnivore", "oncology", "oncoming", "ongoings", "onioning", "onlooker", "onrushes", "ontology", "opaquely", "opaquest", "opaquing", "opencast", "openings", "openness", "openwork", "operable", "operands", "operated", "operates", "operatic", "operator", "operetta", "opinions", "opossums", "opponent", "opposing", "opposite", "optician", "optimism", "optimist", "optimums", "optional", "optioned", "opulence", "oracling", "oracular", "orangery", "orations", "oratorio", "orbitals", "orbiting", "orchards", "ordained", "ordering", "ordinals", "ordinary", "ordnance", "organics", "organism", "organist", "orgasmic", "oriental", "oriented", "orifices", "original", "ornament", "ornately", "ornerier", "orphaned", "orthodox", "ossified", "ossifies", "ottering", "ottomans", "outbacks", "outboard", "outbound", "outbreak", "outbroke", "outburst", "outcasts", "outclass", "outcomes", "outcries", "outcrops", "outdated", "outdoing", "outdoors", "outfaced", "outfaces", "outfalls", "outfield", "outflank", "outflows", "outfoxed", "outfoxes", "outgoing", "outgrown", "outgrows", "outguess", "outhouse", "outlasts", "outlawed", "outlined", "outlines", "outlived", "outlives", "outlooks", "outlying", "outmoded", "outpaced", "outpaces", "outplays", "outpoint", "outposts", "outraged", "outrages", "outranks", "outreach", "outrider", "outright", "outsells", "outshine", "outshone", "outsider", "outsides", "outsizes", "outskirt", "outsmart", "outstays", "outstrip", "outtakes", "outvoted", "outvotes", "outwards", "outwears", "outweigh", "ovations", "ovenware", "overacts", "overages", "overalls", "overawed", "overawes", "overbear", "overbids", "overbite", "overbook", "overbore", "overcame", "overcast", "overcoat", "overcome", "overcook", "overdoes", "overdone", "overdose", "overdraw", "overdrew", "overeats", "overflew", "overflow", "overfull", "overgrew", "overgrow", "overhand", "overhang", "overhaul", "overhead", "overhear", "overheat", "overhung", "overjoys", "overkill", "overlaid", "overlain", "overland", "overlaps", "overlays", "overleaf", "overlies", "overload", "overlong", "overlook", "overlord", "overmuch", "overpaid", "overpass", "overpays", "overplay", "overrate", "override", "overripe", "overrode", "overrule", "overruns", "overseas", "overseen", "overseer", "oversees", "oversell", "overshoe", "overshot", "oversize", "oversold", "overstay", "overstep", "overtake", "overtime", "overtire", "overtone", "overtook", "overture", "overturn", "overused", "overuses", "overview", "overwork", "oviducts", "ovulated", "ovulates", "owlishly", "oxymoron", "pacified", "pacifier", "pacifies", "pacifism", "pacifist", "packaged", "packages", "paddling", "paddocks", "padlocks", "paganism", "pageants", "pageboys", "paginate", "pailfuls", "painless", "paintbox", "painters", "painting", "pairings", "pairwise", "paisleys", "palatals", "palatial", "palavers", "paleface", "paleness", "palettes", "palimony", "palisade", "palliate", "palmetto", "palmiest", "palmists", "palmtops", "palomino", "palpable", "palpably", "palpated", "palpates", "palsying", "paltrier", "pampered", "pamphlet", "panaceas", "pancaked", "pancakes", "pancreas", "pandemic", "pandered", "panderer", "panelist", "panicked", "panniers", "panorama", "panpipes", "pantheon", "panthers", "pantries", "pantsuit", "papacies", "paperboy", "papering", "papillae", "papooses", "parabled", "parables", "parabola", "paradigm", "parading", "paradise", "paraffin", "paragons", "parakeet", "parallax", "parallel", "paramour", "paranoia", "paranoid", "parapets", "paraquat", "parasite", "parasols", "parboils", "parching", "pardners", "pardoned", "parental", "parented", "parfaits", "parishes", "parities", "parkland", "parkways", "parlance", "parlayed", "parleyed", "parodied", "parodies", "parodist", "parolees", "paroling", "paroxysm", "parquets", "parroted", "parrying", "parsnips", "partaken", "partaker", "partakes", "parterre", "partials", "particle", "partings", "partisan", "partners", "partying", "parvenus", "passable", "passably", "passages", "passbook", "passerby", "passions", "passives", "passkeys", "passport", "password", "pasterns", "pastiche", "pastiest", "pastille", "pastimes", "pastoral", "pastrami", "pastries", "pastured", "pastures", "patchier", "patchily", "patching", "patellae", "patellas", "patented", "patently", "paternal", "pathetic", "pathogen", "pathways", "patience", "patients", "patriots", "pattered", "patterns", "paunched", "paunches", "pavement", "pavilion", "pavlovas", "pawnshop", "paybacks", "paycheck", "payloads", "payments", "payphone", "payrolls", "payslips", "peaceful", "peacocks", "peafowls", "pearlier", "pearling", "peasants", "pebblier", "pebbling", "pectoral", "peculiar", "pedagogy", "pedantic", "pedantry", "peddlers", "peddling", "pederast", "pedestal", "pedicure", "pedigree", "pediment", "peekaboo", "peelings", "peephole", "peepshow", "peerages", "peerless", "pelicans", "pellagra", "pelleted", "pellucid", "pelvises", "penanced", "penances", "penchant", "pendants", "pendents", "pendulum", "penguins", "penitent", "penknife", "penlight", "pennants", "penology", "pensions", "pentagon", "penumbra", "peopling", "peppered", "peppiest", "percales", "perceive", "percents", "perching", "perfects", "perforce", "performs", "perfumed", "perfumes", "pergolas", "perigees", "perilous", "periodic", "perished", "perisher", "perishes", "periwigs", "perjured", "perjurer", "perjures", "perkiest", "permeate", "permuted", "permutes", "peroxide", "persists", "personae", "personal", "perspire", "persuade", "pertains", "pertness", "perturbs", "perusals", "perusing", "pervaded", "pervades", "perverse", "perverts", "peskiest", "pestered", "pestling", "petering", "petioles", "petition", "pettiest", "pettifog", "petulant", "petunias", "pfennigs", "phantasm", "phantoms", "pharaohs", "pharmacy", "pheasant", "phialled", "philters", "philtres", "phonemes", "phonemic", "phonetic", "phoniest", "phonying", "phosphor", "photoing", "phrasing", "physical", "physique", "pianists", "pianolas", "picadors", "picayune", "piccolos", "pickaxed", "pickaxes", "pickerel", "picketed", "picketer", "pickiest", "pickings", "pickling", "pictured", "pictures", "piddling", "piebalds", "piercing", "piffling", "pigeoned", "piggiest", "pigments", "pigskins", "pigsties", "pigswill", "pigtails", "pilaster", "pilchard", "pilfered", "pilferer", "pilgrims", "pillaged", "pillages", "pillared", "pillions", "pillocks", "pillowed", "piloting", "pimentos", "pimiento", "pimplier", "pinafore", "pinching", "pinewood", "pinheads", "pinholes", "pinioned", "pinkness", "pinnacle", "pinochle", "pinpoint", "pinprick", "pinwheel", "pioneers", "pipeline", "pipettes", "pipework", "piquancy", "piranhas", "pirating", "pissoirs", "pitchers", "pitching", "pitchman", "pitchmen", "pitfalls", "pitheads", "pithiest", "pitiable", "pitiably", "pitiless", "pittance", "pivoting", "pizzeria", "placards", "placated", "placates", "placebos", "placenta", "placidly", "placings", "plackets", "plaguing", "plaiding", "plainest", "plaiting", "plangent", "planking", "plankton", "planners", "planning", "plantain", "planters", "planting", "plasters", "plastics", "plateaus", "plateful", "platelet", "platform", "platinum", "platonic", "platoons", "platters", "platypus", "plaudits", "playable", "playacts", "playback", "playbill", "playboys", "playgoer", "playmate", "playoffs", "playpens", "playroom", "playtime", "pleaders", "pleading", "pleasant", "pleasing", "pleasure", "pleating", "plebeian", "plectrum", "pledging", "plethora", "pleurisy", "plexuses", "pliantly", "plighted", "plimsoll", "plodders", "plodding", "plonkers", "plonking", "plopping", "plosives", "plotters", "plotting", "pluckier", "plucking", "plugging", "plughole", "plumbers", "plumbing", "plummets", "plumpest", "plumping", "plunders", "plungers", "plunging", "plunking", "plushest", "plushier", "plussing", "poachers", "poaching", "pocketed", "pockmark", "podiatry", "poesying", "poetical", "pogromed", "poignant", "pointers", "pointier", "pointing", "poisoned", "poisoner", "polarity", "poleaxed", "poleaxes", "polecats", "polemics", "polestar", "policies", "policing", "polished", "polisher", "polishes", "politely", "politest", "politico", "politics", "polities", "polkaing", "pollards", "polliwog", "pollster", "polluted", "polluter", "pollutes", "polonium", "poltroon", "polygamy", "polyglot", "polygons", "polymath", "polymers", "pomading", "pomander", "pondered", "poniards", "pontiffs", "pontoons", "ponytail", "pooching", "poofters", "poolside", "popinjay", "popovers", "poppadom", "populace", "populars", "populate", "populism", "populist", "populous", "porosity", "porphyry", "porpoise", "porridge", "portable", "portaged", "portages", "portends", "portents", "portered", "porthole", "portions", "portlier", "portrait", "portrays", "positing", "position", "positive", "positron", "possible", "possibly", "postbags", "postcard", "postcode", "postdate", "postdocs", "postings", "postlude", "postmark", "postpaid", "postpone", "postural", "postured", "postures", "potables", "potatoes", "potbelly", "potently", "potheads", "potholed", "potholer", "potholes", "pothooks", "potlucks", "potsherd", "potshots", "pottered", "pottiest", "pouching", "poultice", "pouncing", "poundage", "pounding", "powdered", "powerful", "powering", "powwowed", "prairies", "praising", "pralines", "prancers", "prancing", "pranging", "pratfall", "prattled", "prattler", "prattles", "prawning", "preached", "preacher", "preaches", "preamble", "preceded", "precedes", "precepts", "precinct", "precious", "preciser", "precises", "preclude", "precooks", "predated", "predates", "predator", "predicts", "preemies", "preempts", "preening", "preexist", "prefaced", "prefaces", "prefects", "prefixed", "prefixes", "pregnant", "preheats", "prejudge", "prelates", "preludes", "premiere", "premiers", "premised", "premises", "premiums", "prenatal", "prepared", "prepares", "preppier", "preppies", "prepping", "prequels", "presaged", "presages", "presence", "presents", "preserve", "presided", "presides", "pressies", "pressing", "pressman", "pressmen", "pressure", "prestige", "presumed", "presumes", "preteens", "pretends", "preterit", "pretexts", "prettied", "prettier", "pretties", "prettify", "prettily", "pretzels", "prevails", "prevents", "previews", "previous", "prezzies", "priciest", "pricking", "prickled", "prickles", "priestly", "priggish", "primates", "primeval", "primmest", "primness", "primping", "primrose", "primulas", "princely", "princess", "printers", "printing", "printout", "prioress", "priories", "priority", "prisoned", "prisoner", "prissier", "prissies", "prissily", "pristine", "prithees", "privater", "privates", "priviest", "probable", "probably", "probated", "probates", "probings", "problems", "proceeds", "proclaim", "proctors", "procured", "procurer", "procures", "prodding", "prodigal", "produced", "producer", "produces", "products", "profaned", "profanes", "proffers", "profiled", "profiles", "profited", "proforma", "profound", "progress", "prohibit", "projects", "prolapse", "prolific", "prologue", "prolongs", "promised", "promises", "promoted", "promoter", "promotes", "prompted", "prompter", "promptly", "pronouns", "proofing", "properer", "properly", "property", "prophecy", "prophesy", "prophets", "proposal", "proposed", "proposer", "proposes", "propound", "propping", "prorated", "prorates", "prosiest", "prospect", "prospers", "prostate", "proteans", "protects", "proteins", "protests", "protocol", "protozoa", "protract", "protrude", "proudest", "provable", "provably", "proverbs", "provided", "provider", "provides", "province", "provisos", "provoked", "provokes", "provosts", "prowlers", "prowling", "prudence", "prurient", "psalmist", "psychics", "psyching", "ptomaine", "publican", "publicly", "puckered", "puddings", "puddling", "pudendum", "pudgiest", "puffball", "puffiest", "pugilism", "pugilist", "pullback", "pullouts", "pullover", "pulpiest", "pulsated", "pulsates", "pumpkins", "punchbag", "punchier", "punching", "punctual", "puncture", "pungency", "punished", "punishes", "punitive", "punsters", "pupating", "puppetry", "puppying", "purblind", "purchase", "purebred", "pureeing", "pureness", "purified", "purifier", "purifies", "puritans", "purloins", "purplest", "purplish", "purports", "purposed", "purposes", "pursuant", "pursuers", "pursuing", "pursuits", "purulent", "purveyed", "purveyor", "pushbike", "pushcart", "pushiest", "pushover", "pushpins", "pussiest", "pussycat", "pustules", "putative", "putsches", "puttered", "puttying", "puzzlers", "puzzling", "pyramids", "quackery", "quacking", "quadrant", "quaffing", "quagmire", "quailing", "quainter", "quaintly", "quandary", "quantify", "quantity", "quarrels", "quarried", "quarries", "quarters", "quartets", "quashing", "quatrain", "quavered", "quayside", "queasier", "queasily", "queening", "queerest", "queering", "quelling", "quenched", "quenches", "querying", "questing", "question", "quibbled", "quibbler", "quibbles", "quickens", "quickest", "quickies", "quietens", "quietest", "quieting", "quietism", "quietude", "quilters", "quilting", "quintets", "quipping", "quirkier", "quirking", "quisling", "quitters", "quitting", "quivered", "quixotic", "quizzing", "quoiting", "quotable", "quotient", "rabbinic", "rabbited", "raccoons", "racegoer", "raceways", "racially", "raciness", "racketed", "radially", "radiance", "radiated", "radiates", "radiator", "radicals", "radioing", "radishes", "raffling", "raggeder", "raggedly", "railcard", "railings", "raillery", "railroad", "railways", "rainbows", "raincoat", "raindrop", "rainfall", "rainiest", "rakishly", "rallying", "ramblers", "rambling", "ramekins", "ramified", "ramifies", "rampaged", "rampages", "ramparts", "ranchers", "ranching", "randiest", "randomly", "rangiest", "rankings", "rankling", "rankness", "ransacks", "ransomed", "rantings", "rapacity", "rapidest", "rapidity", "rapports", "raptures", "rarefied", "rarefies", "rareness", "rarities", "rascally", "rashness", "raspiest", "ratchets", "ratified", "ratifies", "rational", "rationed", "rattiest", "rattlers", "rattling", "rattraps", "ravaging", "ravening", "ravenous", "ravining", "raviolis", "ravished", "ravishes", "rawboned", "reaching", "reactant", "reacting", "reaction", "reactive", "reactors", "readable", "readiest", "readings", "readjust", "readmits", "readouts", "readying", "reaffirm", "reagents", "realigns", "realists", "reallied", "reallies", "reappear", "rearming", "rearmost", "rearward", "reasoned", "reassert", "reassess", "reassign", "reassure", "reawaken", "rebating", "rebelled", "rebirths", "rebooted", "rebounds", "rebuffed", "rebuilds", "rebuking", "rebuttal", "rebutted", "recalled", "recanted", "recapped", "receding", "receipts", "received", "receiver", "receives", "recenter", "recently", "receptor", "recessed", "recesses", "recharge", "rechecks", "recitals", "reciting", "reckless", "reckoned", "reclaims", "reclined", "recliner", "reclines", "recluses", "recoiled", "recopied", "recopies", "recorded", "recorder", "recounts", "recouped", "recourse", "recovers", "recovery", "recreant", "recreate", "recruits", "recurred", "recycled", "recycles", "redbrick", "redcoats", "reddened", "redeemed", "redeemer", "redefine", "redeploy", "redesign", "redheads", "redirect", "rednecks", "redolent", "redouble", "redoubts", "redounds", "redrafts", "redskins", "reducing", "redwoods", "reediest", "reelects", "reemerge", "reenacts", "reenlist", "reenters", "refereed", "referees", "referent", "referral", "referred", "refiling", "refilled", "refiners", "refinery", "refining", "refinish", "refitted", "reflated", "reflates", "reflects", "reflexes", "reforest", "reformat", "reformed", "reformer", "refracts", "refrains", "refugees", "refunded", "refusals", "refusing", "refuting", "regained", "regaling", "regarded", "regattas", "regicide", "regimens", "regiment", "regional", "register", "registry", "regroups", "regulars", "regulate", "rehabbed", "rehashed", "rehashes", "rehearse", "reheated", "rehiring", "rehoused", "rehouses", "reigning", "reimpose", "reindeer", "reinsert", "reinvent", "reinvest", "reissued", "reissues", "rejected", "rejigged", "rejigger", "rejoiced", "rejoices", "rejoined", "rekindle", "relabels", "relapsed", "relapses", "relating", "relation", "relative", "relaunch", "relaxant", "relaxing", "relaying", "relearns", "released", "releases", "relegate", "relented", "relevant", "reliable", "reliably", "reliance", "relieved", "relieves", "religion", "relished", "relishes", "reliving", "reloaded", "relocate", "remained", "remaking", "remanded", "remarked", "remaster", "remedial", "remedied", "remedies", "remember", "reminded", "reminder", "remitted", "remixing", "remnants", "remodels", "remolded", "remotely", "remotest", "remoulds", "remounts", "removals", "removers", "removing", "renaming", "rendered", "renegade", "reneging", "renewals", "renewing", "renounce", "renovate", "renowned", "renumber", "reoccupy", "reoccurs", "reopened", "reorders", "repaints", "repaired", "repairer", "repartee", "repasted", "repaying", "repealed", "repeated", "repeater", "repelled", "repented", "rephrase", "replaced", "replaces", "replayed", "repleted", "repletes", "replicas", "replying", "reported", "reporter", "reposing", "reprieve", "reprints", "reprisal", "reprises", "reproach", "reproofs", "reproved", "reproves", "reptiles", "republic", "repulsed", "repulses", "reputing", "requests", "requiems", "required", "requires", "requital", "requited", "requites", "rerouted", "reroutes", "rescinds", "rescuers", "rescuing", "research", "resemble", "resented", "reserved", "reserves", "resettle", "reshaped", "reshapes", "resident", "residing", "residual", "residues", "resigned", "resinous", "resisted", "resister", "resistor", "resolute", "resolved", "resolver", "resolves", "resonant", "resonate", "resorted", "resounds", "resource", "respects", "respells", "respired", "respires", "respites", "responds", "response", "restarts", "restated", "restates", "restless", "restocks", "restored", "restorer", "restores", "restrain", "restrict", "restroom", "resubmit", "resulted", "resuming", "resupply", "retailed", "retailer", "retained", "retainer", "retaking", "retarded", "retching", "rethinks", "reticent", "retinues", "retirees", "retiring", "retooled", "retorted", "retraced", "retraces", "retracts", "retrains", "retreads", "retreats", "retrench", "retrials", "retrieve", "retrofit", "retrying", "returned", "returnee", "returner", "retyping", "reunions", "reunited", "reunites", "reusable", "revalued", "revalues", "revamped", "revealed", "reveille", "revenged", "revenges", "revenues", "reverend", "reverent", "reveries", "revering", "reversal", "reversed", "reverses", "reverted", "reviewed", "reviewer", "revilers", "reviling", "revising", "revision", "revisits", "revivals", "revivify", "reviving", "revoking", "revolted", "revolved", "revolver", "revolves", "rewarded", "rewiring", "reworded", "reworked", "rewrites", "rhapsody", "rheostat", "rhetoric", "rheumier", "rhizomes", "rhomboid", "rhubarbs", "rhythmic", "ribaldry", "richness", "rickshaw", "ricochet", "riddance", "riddling", "ridicule", "riffling", "riffraff", "rifleman", "riflemen", "rightest", "rightful", "righting", "rightist", "rigidity", "rigorous", "ringlets", "ringside", "ringworm", "ripcords", "ripeness", "ripening", "riposted", "ripostes", "rippling", "risibles", "riskiest", "risottos", "rissoles", "ritually", "ritziest", "riverbed", "riveting", "rivieras", "rivulets", "roadbeds", "roadkill", "roadshow", "roadside", "roadster", "roadways", "roadwork", "roasters", "roasting", "robotics", "robuster", "robustly", "rocketed", "rocketry", "rockfall", "rockiest", "roebucks", "roentgen", "rogering", "roisters", "rollback", "rollicks", "rollmops", "rollover", "romaines", "romanced", "romances", "romantic", "roofless", "rooftops", "rookiest", "roomfuls", "roomiest", "roommate", "roosters", "roosting", "rootless", "rosaries", "rosebuds", "rosebush", "rosemary", "rosetted", "rosettes", "rosewood", "rosiness", "rosining", "rostered", "rostrums", "rotaries", "rotating", "rotation", "rottener", "rotundas", "rotunded", "roughage", "roughens", "roughest", "roughing", "roulette", "roundels", "rounders", "roundest", "rounding", "roundish", "roundups", "rousting", "routines", "rowboats", "rowdiest", "rowdyism", "rowlocks", "royalist", "rubbings", "rubbishy", "rubbling", "rubdowns", "rubicund", "rucksack", "ruckuses", "ructions", "ruddiest", "ruddying", "rudeness", "rudiment", "ruefully", "ruffians", "ruffling", "ruggeder", "ruggedly", "rulering", "rumbaing", "rumbling", "ruminant", "ruminate", "rummaged", "rummages", "rumpling", "rumpuses", "runabout", "runaways", "rundowns", "runniest", "ruptured", "ruptures", "russeted", "rustiest", "rustlers", "rustling", "rutabaga", "ruthless", "sabotage", "saboteur", "sackfuls", "sackings", "sacredly", "sacristy", "saddened", "saddlers", "saddlery", "saddling", "sadistic", "safaried", "safeness", "safetied", "safeties", "saffrons", "sagacity", "saguaros", "sailboat", "sailfish", "sailings", "salaamed", "salaried", "salaries", "saleroom", "salesman", "salesmen", "salience", "salients", "salinity", "salivary", "salivate", "sallower", "sallying", "saltiest", "saltines", "salutary", "saluting", "salvaged", "salvages", "sambaing", "sameness", "samovars", "samplers", "sampling", "sanctify", "sanction", "sanctity", "sanctums", "sandbags", "sandbank", "sandbars", "sandhogs", "sandiest", "sandlots", "sandpits", "sandwich", "sanguine", "sanitary", "sanserif", "sapience", "saplings", "sapphire", "sappiest", "sarcasms", "sarcomas", "sardined", "sardines", "sardonic", "sashayed", "sassiest", "satanism", "satanist", "satchels", "satiated", "satiates", "satining", "satirist", "satsumas", "saturate", "saucepan", "sauciest", "saunaing", "saunters", "sausages", "savagely", "savagery", "savagest", "savaging", "savannas", "savviest", "savvying", "sawdusts", "sawhorse", "sawmills", "scabbard", "scabbier", "scabbing", "scabrous", "scaffold", "scalawag", "scalding", "scaliest", "scallion", "scallops", "scalpels", "scalpers", "scalping", "scamming", "scampers", "scandals", "scanners", "scanning", "scansion", "scantest", "scantier", "scanties", "scantily", "scanting", "scapulae", "scarcely", "scarcest", "scarcity", "scarfing", "scariest", "scarlets", "scarpers", "scarring", "scathing", "scatters", "scatting", "scavenge", "scenario", "scenting", "schedule", "schemata", "schemers", "scheming", "scherzos", "schizoid", "schlocky", "schmaltz", "schmooze", "schmucks", "schnapps", "schnooks", "scholars", "schooled", "schooner", "schussed", "schusses", "sciatica", "sciences", "scimitar", "scissors", "scoffing", "scofflaw", "scolding", "scooping", "scooters", "scooting", "scorched", "scorcher", "scorches", "scornful", "scorning", "scorpion", "scotched", "scotches", "scourers", "scourged", "scourges", "scouring", "scouters", "scouting", "scowling", "scrabble", "scraggly", "scramble", "scrammed", "scrapers", "scraping", "scrapped", "scratchy", "scrawled", "screamed", "screechy", "screened", "screwier", "screwing", "scribble", "scrimped", "scripted", "scrofula", "scrolled", "scrooges", "scrounge", "scrubbed", "scrubber", "scrummed", "scrumped", "scrunchy", "scrupled", "scruples", "scrutiny", "scubaing", "scudding", "scuffing", "scuffled", "scuffles", "scullery", "sculling", "scullion", "sculpted", "sculptor", "scumbags", "scummier", "scumming", "scuppers", "scurfier", "scurried", "scurries", "scurvier", "scuttled", "scuttles", "scuzzier", "scything", "seabirds", "seaboard", "seaborne", "seacoast", "seafarer", "seafloor", "seafront", "seagoing", "seagulls", "seahorse", "sealants", "sealskin", "seamiest", "seamless", "seaplane", "seaports", "searched", "searcher", "searches", "seascape", "seashell", "seashore", "seasides", "seasonal", "seasoned", "seawards", "seaweeds", "seceding", "secluded", "secludes", "seconded", "seconder", "secondly", "secreted", "secreter", "secretes", "secretly", "sections", "securely", "securest", "securing", "security", "sedately", "sedatest", "sedating", "sedation", "sedative", "sediment", "sedition", "seducers", "seducing", "sedulous", "seedbeds", "seediest", "seedless", "seedling", "seemlier", "seesawed", "seething", "segments", "segueing", "seizures", "selected", "selector", "selenium", "selfless", "selfsame", "sellouts", "seltzers", "selvaged", "selvages", "semantic", "semester", "seminars", "seminary", "semiotic", "semitone", "semolina", "senators", "senility", "sensible", "sensibly", "sensuous", "sentence", "sentient", "sentinel", "sentries", "separate", "sequence", "sequined", "sequoias", "seraglio", "seraphic", "serenade", "serenely", "serenest", "serening", "serenity", "sergeant", "serially", "sermoned", "serpents", "serrated", "servants", "serviced", "services", "serviles", "servings", "sessions", "setbacks", "settable", "settings", "settlers", "settling", "sevenths", "severely", "severest", "severing", "severity", "sewerage", "sexiness", "sexology", "sextants", "sexually", "shabbier", "shabbily", "shacking", "shackled", "shackles", "shadiest", "shadings", "shadowed", "shafting", "shaggier", "shagging", "shakeout", "shakeups", "shakiest", "shallots", "shallows", "shambled", "shambles", "shameful", "shamming", "shampoos", "shamrock", "shandies", "shanghai", "shanties", "shantung", "sharking", "sharpens", "sharpers", "sharpest", "sharping", "sharpish", "shatters", "shavings", "shawling", "shearers", "shearing", "sheathed", "sheathes", "shebangs", "shebeens", "shedding", "sheepdog", "sheepish", "sheerest", "sheering", "sheeting", "sheikdom", "shellacs", "shelling", "shelters", "shelving", "shepherd", "sherbets", "sheriffs", "sherries", "shielded", "shiftier", "shiftily", "shifting", "shilling", "shimmers", "shimmery", "shimmied", "shimmies", "shimming", "shinbone", "shindigs", "shingled", "shingles", "shiniest", "shinnied", "shinnies", "shinning", "shipload", "shipmate", "shipment", "shippers", "shipping", "shipyard", "shirkers", "shirking", "shirring", "shirting", "shithead", "shitload", "shittier", "shitting", "shivered", "shoaling", "shockers", "shocking", "shoddier", "shoddily", "shoehorn", "shoelace", "shoetree", "shooters", "shooting", "shootout", "shoplift", "shoppers", "shopping", "shoptalk", "shopworn", "shortage", "shortcut", "shortens", "shortest", "shorties", "shorting", "shortish", "shotguns", "shoulder", "shouting", "showboat", "showcase", "showdown", "showered", "showgirl", "showiest", "showings", "showoffs", "showroom", "showtime", "shrapnel", "shredded", "shredder", "shrewder", "shrewdly", "shrewing", "shrewish", "shrieked", "shrilled", "shriller", "shrimped", "shrimper", "shrivels", "shriving", "shrouded", "shrubbed", "shrugged", "shrunken", "shucking", "shuckses", "shudders", "shuffled", "shuffler", "shuffles", "shunning", "shunting", "shushing", "shutdown", "shutouts", "shutters", "shutting", "shuttled", "shuttles", "shysters", "sibilant", "siblings", "sickbays", "sickbeds", "sickened", "sicklier", "sickling", "sickness", "sickouts", "sickroom", "sidearms", "sidebars", "sidecars", "sidekick", "sideline", "sidelong", "sidereal", "sideshow", "sidestep", "sidewalk", "sidewall", "sideways", "sighting", "signally", "signings", "signpost", "silaging", "silenced", "silencer", "silences", "silenter", "silently", "silicate", "silicone", "silkened", "silkiest", "silkworm", "silliest", "silvered", "simmered", "simpered", "simplest", "simplify", "simpling", "simulate", "sincerer", "sinecure", "sinfully", "singeing", "singlets", "singling", "singsong", "singular", "sinister", "sinkable", "sinkhole", "sinology", "sirloins", "siroccos", "sissiest", "sistered", "sisterly", "sittings", "situated", "situates", "sixpence", "sixteens", "sixtieth", "sizzlers", "sizzling", "skeeters", "skeining", "skeletal", "skeleton", "sketched", "sketches", "skewbald", "skewered", "skidding", "skidpans", "skiffing", "skillets", "skillful", "skimming", "skimpier", "skimping", "skincare", "skinhead", "skinless", "skinnier", "skinning", "skippers", "skipping", "skirmish", "skirting", "skitters", "skittish", "skittles", "skivvied", "skivvies", "skulking", "skullcap", "skunking", "skydived", "skydiver", "skydives", "skyjacks", "skylarks", "skylight", "skylines", "skywards", "slabbing", "slackens", "slackers", "slackest", "slacking", "slagging", "slagheap", "slalomed", "slammers", "slamming", "slanders", "slangier", "slanting", "slapdash", "slappers", "slapping", "slashing", "slathers", "slattern", "slavered", "slayings", "sleazier", "sleazily", "sledding", "sledging", "sleekest", "sleeking", "sleepers", "sleepier", "sleepily", "sleeping", "sleetier", "sleeting", "sleighed", "slickers", "slickest", "slicking", "slighted", "slighter", "slightly", "slimiest", "slimline", "slimmers", "slimmest", "slimming", "slimness", "slinging", "slinkier", "slinking", "slipcase", "slipknot", "slippage", "slippers", "slippery", "slipping", "slipshod", "slipways", "slithers", "slithery", "slitting", "slivered", "slobbers", "slobbery", "slobbing", "slogging", "sloppier", "sloppily", "slopping", "sloshing", "slothful", "slothing", "slotting", "slouched", "slouches", "sloughed", "slovenly", "slowdown", "slowness", "slowpoke", "sludging", "sluggard", "sluggers", "slugging", "sluggish", "sluicing", "slumbers", "slumlord", "slumming", "slumping", "slurping", "slurring", "slushier", "sluttish", "smackers", "smacking", "smallest", "smalling", "smallish", "smallpox", "smarmier", "smartens", "smartest", "smarting", "smashers", "smashing", "smearing", "smellier", "smelling", "smelters", "smelting", "smidgens", "smirched", "smirches", "smirking", "smithies", "smocking", "smoggier", "smokiest", "smolders", "smooched", "smooches", "smoothed", "smoother", "smoothie", "smoothly", "smothers", "smudgier", "smudging", "smuggest", "smugging", "smuggled", "smuggler", "smuggles", "smugness", "smuttier", "snacking", "snaffled", "snaffles", "snagging", "snailing", "snakiest", "snappers", "snappier", "snappily", "snapping", "snappish", "snapshot", "snarling", "snatched", "snatcher", "snatches", "snazzier", "snazzily", "sneakers", "sneakier", "sneakily", "sneaking", "sneering", "sneezing", "snickers", "snicking", "sniffers", "sniffier", "sniffing", "sniffled", "sniffles", "snifters", "snippets", "snippier", "snipping", "snitched", "snitches", "snobbery", "snobbier", "snobbish", "snogging", "snookers", "snoopers", "snoopier", "snooping", "snootier", "snootily", "snoozing", "snorkels", "snorting", "snottier", "snotting", "snouting", "snowball", "snowdrop", "snowfall", "snowiest", "snowline", "snowplow", "snowshoe", "snowsuit", "snubbing", "snuffbox", "snuffers", "snuffing", "snuffled", "snuffles", "snuggest", "snugging", "snuggled", "snuggles", "snugness", "soakings", "soapiest", "soapsuds", "soberest", "sobering", "sobriety", "sociable", "sociably", "socially", "societal", "sodomite", "softback", "softball", "softened", "softener", "softness", "software", "softwood", "soggiest", "sojourns", "solacing", "solarium", "soldered", "soldiers", "soldiery", "solecism", "solemner", "solemnly", "solenoid", "solicits", "solidest", "solidify", "solidity", "solitary", "solitude", "soloists", "solstice", "solubles", "solution", "solvable", "solvency", "solvents", "sombrero", "somebody", "someones", "sometime", "someways", "somewhat", "songbird", "songbook", "songster", "sonogram", "sonority", "sonorous", "soothest", "soothing", "sootiest", "sophists", "soppiest", "soppings", "sopranos", "sorcerer", "sordidly", "sorehead", "soreness", "sorority", "sorriest", "sorrowed", "soughing", "soulless", "soundest", "sounding", "soupiest", "sourcing", "sourness", "sourpuss", "southern", "southpaw", "souvenir", "soybeans", "spaceman", "spacemen", "spaciest", "spacious", "spadeful", "spamming", "spangled", "spangles", "spaniels", "spanking", "spanners", "spanning", "sparkier", "sparking", "sparkled", "sparkler", "sparkles", "sparring", "sparrows", "sparsely", "sparsest", "sparsity", "spasming", "spastics", "spatters", "spatting", "spatulas", "spawning", "speakers", "speaking", "spearing", "specials", "specific", "specimen", "specious", "specking", "speckled", "speckles", "spectate", "spectral", "spectrum", "speeched", "speeches", "speeders", "speedier", "speedily", "speeding", "speedups", "speedway", "spellers", "spelling", "spenders", "spending", "sphagnum", "spheroid", "sphinxes", "spiciest", "spieling", "spiffied", "spiffier", "spiffies", "spiffing", "spikiest", "spillage", "spilling", "spillway", "spindled", "spindles", "spiniest", "spinners", "spinneys", "spinning", "spinster", "spirally", "spirited", "spitball", "spiteful", "spitfire", "spitting", "spittoon", "splashed", "splashes", "splatted", "splatter", "splaying", "splendid", "splicers", "splicing", "splinted", "splinter", "splodges", "sploshed", "sploshes", "splotchy", "splurged", "splurges", "splutter", "spoilage", "spoilers", "spoiling", "spongers", "spongier", "sponging", "sponsors", "spoofing", "spookier", "spooking", "spooling", "spoonful", "spooning", "spooring", "sporadic", "sporrans", "sportier", "sporting", "sportive", "spotless", "spotters", "spottier", "spotting", "spouting", "sprained", "sprawled", "sprayers", "spraying", "spreader", "spreeing", "sprigged", "sprinkle", "sprinted", "sprinter", "spritzed", "spritzer", "spritzes", "sprocket", "sprouted", "sprucest", "sprucing", "spryness", "spunkier", "spunkies", "spunking", "spurious", "spurning", "spurring", "spurting", "sputters", "spyglass", "squabbed", "squabble", "squadded", "squaddie", "squadron", "squalled", "squander", "squarely", "squarest", "squaring", "squarish", "squashed", "squashes", "squatted", "squatter", "squawked", "squeaked", "squealed", "squealer", "squeegee", "squeezed", "squeezer", "squeezes", "squelchy", "squidded", "squiggle", "squiggly", "squinted", "squinter", "squiring", "squirmed", "squirrel", "squirted", "squished", "squishes", "stabbing", "stablest", "stabling", "staccato", "stacking", "stadiums", "staffers", "staffing", "staggers", "stagings", "stagnant", "stagnate", "staidest", "staining", "stairway", "stakeout", "stalkers", "stalking", "stalling", "stallion", "stalwart", "stammers", "stampede", "stamping", "stanched", "stancher", "stanches", "standard", "standbys", "standing", "standoff", "standout", "staplers", "stapling", "starched", "starches", "stardust", "starfish", "stargaze", "starkers", "starkest", "starking", "starless", "starlets", "starling", "starrier", "starring", "starters", "starting", "startled", "startles", "starving", "stashing", "stations", "statuary", "statures", "statuses", "statutes", "steadied", "steadier", "steadies", "steadily", "stealing", "stealthy", "steamers", "steamier", "steamies", "steaming", "steelier", "steelies", "steeling", "steepens", "steepest", "steeping", "steeples", "steerage", "steering", "steining", "stemming", "stenched", "stenches", "stencils", "stepping", "stepsons", "sterling", "sternest", "sterning", "sternums", "steroids", "stetsons", "stewards", "stickers", "stickied", "stickier", "stickies", "sticking", "stickler", "stickpin", "stickups", "stiffens", "stiffest", "stiffing", "stifling", "stigmata", "stiletto", "stillest", "stilling", "stimulus", "stingers", "stingier", "stingily", "stinging", "stingray", "stinkers", "stinking", "stinting", "stipends", "stippled", "stipples", "stirrers", "stirring", "stirrups", "stitched", "stitches", "stockade", "stockier", "stockily", "stocking", "stockist", "stodgier", "stoicism", "stolider", "stolidly", "stomachs", "stomping", "stoniest", "stonking", "stooping", "stopcock", "stopgaps", "stopover", "stoppage", "stoppers", "stopping", "stormier", "stormily", "storming", "stoutest", "stowaway", "straddle", "strafing", "straggle", "straggly", "straight", "strained", "strainer", "straited", "straiten", "stranded", "stranger", "strangle", "strapped", "strategy", "stratify", "strawing", "straying", "streaked", "streaker", "streamed", "streamer", "strength", "stressed", "stresses", "stretchy", "strewing", "striated", "stricken", "stricter", "strictly", "stridden", "strident", "striding", "strikers", "striking", "stringed", "stringer", "striping", "stripped", "stripper", "striving", "stroking", "strolled", "stroller", "stronger", "strongly", "strophes", "stropped", "strudels", "struggle", "strummed", "strumpet", "strutted", "stubbier", "stubbies", "stubbing", "stubborn", "stuccoed", "stuccoes", "studbook", "studding", "students", "studious", "studying", "stuffier", "stuffily", "stuffing", "stultify", "stumbled", "stumbler", "stumbles", "stumpier", "stumping", "stunners", "stunning", "stunting", "stuntman", "stuntmen", "stupider", "stupidly", "sturdier", "sturdily", "sturgeon", "stutters", "stylists", "styluses", "styptics", "subclass", "subduing", "subgroup", "subheads", "subhuman", "subjects", "subjoins", "sublease", "sublimed", "sublimer", "sublimes", "submerge", "submerse", "suborned", "subplots", "subpoena", "subsided", "subsides", "subsists", "subsoils", "subsonic", "subspace", "subsumed", "subsumes", "subteens", "subtends", "subtexts", "subtitle", "subtlest", "subtlety", "subtotal", "subtract", "suburban", "suburbia", "subverts", "succeeds", "succinct", "succubus", "succumbs", "suchlike", "suckered", "suckling", "suctions", "suddenly", "sudsiest", "suffered", "sufferer", "sufficed", "suffices", "suffixed", "suffixes", "suffrage", "suffused", "suffuses", "sugarier", "sugaring", "suggests", "suicidal", "suicides", "suitable", "suitably", "suitcase", "sukiyaki", "sulfates", "sulfides", "sulkiest", "sullener", "sullenly", "sullying", "sulphate", "sulphide", "sultanas", "sultrier", "summered", "summitry", "summoned", "summoner", "sunbathe", "sunbeams", "sunblock", "sunburns", "sundecks", "sundered", "sundials", "sundowns", "sundress", "sundries", "sunlamps", "sunlight", "sunniest", "sunrises", "sunroofs", "sunshade", "sunshine", "sunspots", "suntraps", "superber", "superbly", "superego", "supering", "superior", "superman", "supermen", "supinely", "supplant", "supplest", "supplied", "supplier", "supplies", "supports", "supposed", "supposes", "suppress", "supremer", "supremos", "surcease", "surefire", "sureness", "sureties", "surfaced", "surfaces", "surfeits", "surgeons", "surgical", "surliest", "surmised", "surmises", "surmount", "surnames", "surplice", "surprise", "surreals", "surround", "surtaxed", "surtaxes", "surtitle", "surveyed", "surveyor", "survival", "survived", "survives", "survivor", "suspects", "suspends", "suspense", "sustains", "suturing", "sveltest", "swabbing", "swaddled", "swaddles", "swaggers", "swagging", "swallows", "swampier", "swamping", "swankest", "swankier", "swankies", "swanking", "swanning", "swansong", "swapping", "swarming", "swashing", "swastika", "swatches", "swathing", "swatters", "swatting", "swearers", "swearing", "sweaters", "sweatier", "sweating", "sweepers", "sweeping", "sweetens", "sweetest", "sweeties", "sweetish", "swellest", "swelling", "swelters", "swerving", "swiftest", "swifting", "swigging", "swilling", "swimmers", "swimming", "swimsuit", "swimwear", "swindled", "swindler", "swindles", "swingers", "swinging", "swirlier", "swirling", "swishest", "swishing", "switched", "switcher", "switches", "swooning", "swooping", "swooshed", "swooshes", "swording", "swotting", "sybarite", "sycamore", "syllabic", "syllable", "syllabub", "syllabus", "symbolic", "symmetry", "sympathy", "symphony", "symptoms", "synapses", "synaptic", "syndrome", "synonyms", "synopses", "synopsis", "syphilis", "syringed", "syringes", "systemic", "systolic", "tableaux", "tabloids", "tabooing", "tabulate", "taciturn", "tackiest", "tacklers", "tackling", "tactical", "tactless", "tadpoles", "tailback", "tailbone", "tailcoat", "tailgate", "tailless", "tailored", "tailpipe", "tailspin", "tailwind", "tainting", "takeaway", "takeoffs", "takeouts", "takeover", "talented", "talisman", "tallboys", "tallness", "tallyhos", "tallying", "tamarind", "tameness", "tampered", "tanagers", "tandoori", "tangelos", "tangents", "tangible", "tangibly", "tangiest", "tangling", "tangoing", "tankards", "tankfuls", "tantrums", "tapering", "tapestry", "tapeworm", "taprooms", "taproots", "tardiest", "targeted", "tarragon", "tarriest", "tarrying", "tartiest", "tartness", "tasteful", "tastiest", "tastings", "tattered", "tattiest", "tattlers", "tattling", "tattooed", "taunting", "tautened", "tautness", "tawdrier", "tawniest", "taxation", "taxicabs", "taxiways", "taxonomy", "taxpayer", "teacakes", "teachers", "teaching", "teammate", "teamster", "teamwork", "tearaway", "teardrop", "teariest", "tearooms", "teaspoon", "teatimes", "tectonic", "teenager", "teeniest", "teetered", "teething", "teetotal", "telecast", "telegram", "teletext", "telethon", "teletype", "televise", "telexing", "tellered", "telltale", "temblors", "temerity", "temperas", "tempered", "tempests", "template", "temporal", "tempters", "tempting", "tenacity", "tenanted", "tendency", "tendered", "tenderer", "tenderly", "tendrils", "tenement", "tenfolds", "tensions", "tentacle", "tenuring", "tequilas", "terminal", "terminus", "termites", "terraced", "terraces", "terrains", "terrapin", "terrible", "terribly", "terriers", "terrific", "terrines", "tertiary", "testable", "testates", "testicle", "testiest", "tetchier", "tetchily", "tethered", "textbook", "textiles", "textural", "textured", "textures", "thalamus", "thallium", "thankful", "thanking", "thatched", "thatcher", "thatches", "theistic", "thematic", "theology", "theorems", "theories", "theorist", "thermals", "thesauri", "thespian", "thiamine", "thickens", "thickest", "thickets", "thickset", "thievery", "thieving", "thievish", "thimbled", "thimbles", "thingies", "thinkers", "thinking", "thinners", "thinness", "thinnest", "thinning", "thirding", "thirsted", "thirteen", "thirties", "thistles", "thoracic", "thoraxes", "thornier", "thorough", "thoughts", "thousand", "thralled", "thrashed", "thrasher", "thrashes", "threaded", "threaten", "threnody", "threshed", "thresher", "threshes", "thrilled", "thriller", "thriving", "throbbed", "throeing", "thronged", "throttle", "throwers", "throwing", "thrummed", "thrushes", "thruways", "thudding", "thuggery", "thuggish", "thumbing", "thumping", "thunders", "thundery", "thwacked", "thwarted", "thymuses", "thyroids", "ticketed", "tickling", "ticklish", "tiddlers", "tidemark", "tidiness", "tiebreak", "tightens", "tightest", "tightwad", "tillable", "timbered", "timeless", "timelier", "timeworn", "timezone", "timidest", "timidity", "timorous", "tincture", "tingeing", "tinglier", "tingling", "tinkered", "tinkling", "tinniest", "tinnitus", "tinplate", "tinsmith", "tippexed", "tippexes", "tipplers", "tippling", "tipsiest", "tipsters", "tiredest", "tireless", "tiresome", "titanium", "titivate", "titmouse", "tittered", "tittling", "toadying", "toasters", "toastier", "toasties", "toasting", "tobaccos", "toboggan", "toccatas", "toddlers", "toddling", "toeholds", "toenails", "together", "toggling", "toileted", "toiletry", "toilette", "toilsome", "tokenism", "tolerant", "tolerate", "tollgate", "tomahawk", "tomatoes", "tombolas", "tomorrow", "tonality", "toneless", "tonguing", "tonnages", "tonsured", "tonsures", "toolbars", "toothier", "tootling", "tootsies", "topcoats", "topknots", "topmasts", "topology", "toppings", "toppling", "topsails", "topsides", "torching", "toreador", "torments", "torpidly", "torquing", "torrents", "torrider", "tortilla", "tortoise", "tortuous", "tortured", "torturer", "tortures", "totality", "tottered", "touchier", "touchily", "touching", "toughens", "toughest", "toughies", "toughing", "tourists", "touristy", "tourneys", "tousling", "towering", "towheads", "township", "townsman", "townsmen", "towpaths", "towropes", "toxicity", "tracheae", "tracings", "trackers", "tracking", "traction", "tractors", "traduced", "traduces", "traffics", "trailers", "trailing", "trainees", "trainers", "training", "traipsed", "traipses", "traitors", "tramcars", "trammels", "tramming", "tramping", "trampled", "tramples", "tramways", "tranches", "tranquil", "transact", "transept", "transfer", "transfix", "transits", "transmit", "transoms", "trapdoor", "trapezed", "trapezes", "trappers", "trapping", "trashcan", "trashier", "trashing", "travails", "traverse", "travesty", "trawlers", "trawling", "treacled", "treacles", "treading", "treadled", "treadles", "treasure", "treasury", "treaties", "treating", "treatise", "trebling", "treeless", "treeline", "treetops", "trefoils", "trekking", "trembled", "trembles", "tremolos", "trenched", "trencher", "trenches", "trendier", "trendies", "trendily", "trending", "trespass", "trestles", "trialing", "trialled", "triangle", "tribunal", "tribunes", "tributes", "trickery", "trickier", "tricking", "trickled", "trickles", "tricycle", "tridents", "triflers", "trifling", "triggers", "triggest", "trilbies", "trilling", "trillion", "trimaran", "trimmers", "trimmest", "trimming", "trimness", "trinkets", "triplets", "triplied", "triplies", "tripling", "trippers", "tripping", "triptych", "tripwire", "trisects", "triumphs", "trochees", "trolleys", "trolling", "trollops", "trombone", "tromping", "troopers", "trooping", "trophied", "trophies", "tropical", "tropisms", "trothing", "trotters", "trotting", "troubled", "troubles", "trounced", "trounces", "troupers", "trouping", "trousers", "truanted", "truckers", "trucking", "truckled", "truckles", "trudging", "truelove", "truffles", "trumpery", "trumpets", "trumping", "truncate", "trundled", "trundles", "trunking", "trussing", "trustees", "trustful", "trustier", "trusties", "trusting", "truthful", "trysting", "tsarists", "tsunamis", "tubbiest", "tubeless", "tubercle", "tuberous", "tuckered", "tugboats", "tumblers", "tumbling", "tumbrels", "tumulted", "tuneless", "tungsten", "tuppence", "tuppenny", "turbaned", "turbines", "turbojet", "turgidly", "turmeric", "turmoils", "turncoat", "turnings", "turniped", "turnkeys", "turnoffs", "turnouts", "turnover", "turnpike", "turreted", "tussling", "tussocks", "tutelage", "tutorial", "tutoring", "twaddled", "twaddles", "twanging", "tweaking", "tweedier", "tweeters", "tweeting", "tweezers", "twelfths", "twenties", "twiddled", "twiddles", "twiggier", "twigging", "twilight", "twinging", "twinkled", "twinkles", "twinning", "twinsets", "twirlers", "twirling", "twisters", "twisting", "twitched", "twitches", "twitters", "twitting", "twofolds", "twopence", "twopenny", "twosomes", "tympanum", "typecast", "typeface", "typesets", "typhoons", "typified", "typifies", "typology", "ubiquity", "ugliness", "ukuleles", "ulcerate", "ulcering", "ulcerous", "ulterior", "ultimate", "ululated", "ululates", "umbilici", "umbraged", "umbrages", "umbrella", "umpiring", "unabated", "unafraid", "unawares", "unbarred", "unbeaten", "unbelief", "unbiased", "unbidden", "unblocks", "unbolted", "unbosoms", "unbroken", "unbuckle", "unburden", "unbutton", "uncalled", "uncaring", "unclasps", "unclothe", "uncoiled", "uncommon", "uncooked", "uncorked", "uncouple", "uncovers", "unctions", "unctuous", "uncurled", "underact", "underage", "underarm", "underbid", "undercut", "underdog", "underfed", "underlay", "underlie", "underpay", "underpin", "undersea", "undertow", "underway", "undoings", "undulant", "undulate", "unearned", "unearths", "uneasier", "uneasily", "unedited", "unending", "unequals", "unerring", "unevener", "unevenly", "unfairer", "unfairly", "unfasten", "unfetter", "unfilled", "unfitted", "unfolded", "unformed", "unfrocks", "unfurled", "ungainly", "unguents", "ungulate", "unhanded", "unharmed", "unheeded", "unhinged", "unhinges", "unholier", "unhooked", "unhorsed", "unhorses", "unicorns", "unicycle", "uniforms", "unifying", "unionism", "unionist", "uniquely", "uniquest", "universe", "unjustly", "unkinder", "unkindly", "unknowns", "unlacing", "unlawful", "unleaded", "unlearns", "unlikely", "unlisted", "unloaded", "unlocked", "unloosed", "unlooses", "unlovely", "unmaking", "unmanned", "unmarked", "unmasked", "unneeded", "unnerved", "unnerves", "unopened", "unpacked", "unpicked", "unpinned", "unplaced", "unproved", "unproven", "unquoted", "unquotes", "unravels", "unrested", "unripest", "unrolled", "unrulier", "unsaddle", "unsafest", "unsalted", "unsaying", "unscrews", "unsealed", "unseated", "unseeded", "unseeing", "unseemly", "unsettle", "unshaken", "unshaven", "unsigned", "unsnarls", "unsocial", "unsolved", "unspoilt", "unspoken", "unstable", "unstated", "unsteady", "unstrung", "unsubtle", "unsuited", "untangle", "untapped", "untaught", "untested", "untidier", "untidily", "untiling", "untimely", "untiring", "untitled", "untoward", "untruest", "untruths", "untwists", "unusable", "unveiled", "unversed", "unvoiced", "unwanted", "unwarier", "unwashed", "unwieldy", "unwisely", "unwisest", "unwonted", "unworthy", "unzipped", "upbraids", "upchucks", "upcoming", "updating", "upending", "upgraded", "upgrades", "upheaval", "upholder", "uplifted", "uploaded", "upmarket", "uppercut", "upraised", "upraises", "uprights", "uprising", "uprooted", "upstaged", "upstages", "upstairs", "upstarts", "upstream", "upsurged", "upsurges", "upswings", "upturned", "upwardly", "urbanely", "urbanest", "urbanity", "urethrae", "urgently", "urinated", "urinates", "usefully", "ushering", "usurious", "usurpers", "usurping", "utensils", "utterest", "uttering", "vacantly", "vacating", "vacation", "vaccines", "vacuumed", "vagabond", "vagaries", "vagrancy", "vagrants", "vagueing", "valanced", "valances", "valences", "valeting", "validate", "validity", "valorous", "valuable", "vamoosed", "vamooses", "vampired", "vampires", "vanadium", "vanguard", "vanillas", "vanished", "vanishes", "vanities", "vanquish", "vantages", "vapidity", "vaporise", "vaporous", "variable", "variably", "variance", "variants", "varicose", "varmints", "vascular", "vassaled", "vastness", "vaulters", "vaulting", "vaunting", "vectored", "vegetate", "vehement", "vehicles", "velocity", "velveted", "venality", "vendetta", "veneered", "venerate", "venereal", "vengeful", "venomous", "ventrals", "ventured", "ventures", "veracity", "verandas", "verbally", "verbatim", "verbenas", "verbiage", "verdicts", "verified", "verifies", "verities", "vermouth", "verrucae", "verrucas", "versions", "vertebra", "vertexes", "vertical", "vesicles", "vestiges", "vestment", "vestries", "veterans", "vexation", "viaducts", "vibrancy", "vibrated", "vibrates", "vibrator", "vibratos", "viburnum", "vicarage", "viceroys", "vicinity", "victuals", "videoing", "viewings", "vigilant", "vignette", "vigorous", "vileness", "vilified", "vilifies", "villager", "villages", "villains", "villainy", "villeins", "vinegary", "vineyard", "vintages", "vintners", "violable", "violated", "violates", "violator", "violence", "violists", "viragoes", "virginal", "virgules", "virility", "virology", "virtuoso", "virtuous", "virulent", "visceral", "viscount", "visioned", "visiting", "visitors", "vistaing", "visually", "vitality", "vitamins", "vitiated", "vitiates", "vitreous", "vivacity", "vividest", "vivified", "vivifies", "vixenish", "vocalics", "vocalist", "vocation", "vocative", "vogueing", "volatile", "volcanic", "volition", "volleyed", "voltages", "voluming", "vomiting", "voodooed", "voracity", "vortexes", "votaries", "vouchers", "vouching", "voyagers", "voyaging", "vulgarer", "vulgarly", "vultures", "wackiest", "waddling", "waffling", "wagering", "waggling", "wagtails", "wainscot", "waisting", "waitress", "wakening", "walkaway", "walkouts", "walkover", "walkways", "walleyed", "walleyes", "walloped", "wallowed", "walruses", "waltzing", "wandered", "wanderer", "wangling", "wannabee", "wannabes", "wantings", "wantoned", "wantoner", "wantonly", "warblers", "warbling", "wardened", "wardered", "wardress", "wardrobe", "wardroom", "warheads", "warhorse", "wariness", "warlocks", "warlords", "warnings", "warpaint", "warpaths", "warplane", "warrants", "warranty", "warriors", "warships", "warthogs", "wartiest", "washable", "washbowl", "washered", "washouts", "washroom", "washtubs", "wassails", "wasteful", "wastered", "wastrels", "watchdog", "watchers", "watchful", "watching", "watchman", "watchmen", "waterier", "watering", "waterway", "wattling", "waveband", "waveform", "wavelets", "wavering", "waviness", "waxiness", "waxwings", "waxworks", "wayfarer", "waysides", "weakened", "weakfish", "weaklier", "weakling", "weakness", "weaponry", "wearable", "weariest", "wearying", "weathers", "websites", "weddings", "weediest", "weekdays", "weekends", "weeklies", "weepiest", "weepings", "weighing", "weighted", "weirdest", "weirding", "welcomed", "welcomes", "wellness", "welshing", "weltered", "werewolf", "westerly", "westerns", "westward", "wetbacks", "wetlands", "whacking", "whammies", "whamming", "whatever", "whatsits", "wheatens", "wheedled", "wheedles", "wheelies", "wheeling", "wheezier", "wheezily", "wheezing", "whelping", "whenever", "wherever", "whetting", "whiffing", "whimming", "whimpers", "whimsier", "whimsies", "whingers", "whinging", "whiniest", "whinnied", "whinnier", "whinnies", "whipcord", "whiplash", "whippets", "whipping", "whirling", "whirring", "whiskers", "whiskery", "whisking", "whispers", "whistled", "whistler", "whistles", "whitecap", "whitened", "whitener", "whiteout", "whithers", "whitings", "whittled", "whittler", "whittles", "whizzing", "whodunit", "whomever", "whoopees", "whooping", "whooshed", "whooshes", "whoppers", "whopping", "whupping", "wickeder", "wickedly", "wideness", "widening", "widowers", "widowing", "wielding", "wifelier", "wigglers", "wigglier", "wiggling", "wighting", "wildcats", "wildfire", "wildfowl", "wildlife", "wildness", "wiliness", "wimpiest", "wimpling", "winching", "windbags", "windburn", "windfall", "windiest", "windlass", "windless", "windmill", "windowed", "windpipe", "windsock", "windsurf", "windward", "wineries", "wingless", "wingspan", "wingtips", "winkling", "winnings", "winnowed", "winsomer", "wintered", "wintrier", "wireless", "wiretaps", "wiriness", "wiseacre", "wiseguys", "wiselier", "wishbone", "wispiest", "wisteria", "witchery", "witching", "withdraw", "withdrew", "withered", "withheld", "withhold", "wittered", "wittiest", "wizardry", "wobblier", "wobblies", "wobbling", "woefully", "womanish", "wondered", "wondrous", "woodbine", "woodcock", "woodcuts", "woodener", "woodenly", "woodiest", "woodland", "woodlice", "woodpile", "woodshed", "woodsier", "woodsman", "woodsmen", "woodwind", "woodwork", "woodworm", "woollier", "woollies", "wooziest", "wordiest", "wordings", "wordless", "wordplay", "workable", "workaday", "workbook", "workdays", "workfare", "workings", "workload", "workmate", "workouts", "workroom", "workshop", "worktops", "workweek", "wormhole", "wormiest", "wormwood", "worriers", "worrying", "worsened", "worships", "worsting", "worthier", "worthies", "worthily", "wounding", "wracking", "wrangled", "wrangler", "wrangles", "wrappers", "wrapping", "wrathful", "wrathing", "wreaking", "wreathed", "wreathes", "wreckage", "wreckers", "wrecking", "wrenched", "wrenches", "wresting", "wrestled", "wrestler", "wrestles", "wretched", "wretches", "wriggled", "wriggler", "wriggles", "wringers", "wringing", "wrinkled", "wrinkles", "writable", "writhing", "writings", "wrongest", "wrongful", "wronging", "xeroxing", "yachting", "yammered", "yardages", "yardarms", "yarmulke", "yashmaks", "yearbook", "yearlies", "yearling", "yearning", "yeastier", "yellowed", "yellower", "yeshivas", "yielding", "youngest", "youngish", "yourself", "youthful", "yuckiest", "yuletide", "yummiest", "zaniness", "zealotry", "zeppelin", "zillions", "zincking", "zippered", "zippiest", "zodiacal", "zucchini", "zwieback" }; const char* w_9[] = { "aardvarks", "abandoned", "abasement", "abatement", "abattoirs", "abdicated", "abdicates", "abdominal", "abducting", "abduction", "abductors", "abhorrent", "abhorring", "abilities", "abjecting", "ablatives", "ablutions", "abnegated", "abnegates", "abolished", "abolishes", "abolition", "abominate", "aborigine", "abortions", "abounding", "abrasions", "abrasives", "abridging", "abrogated", "abrogates", "abruptest", "abscessed", "abscesses", "abscissas", "absconded", "abseiling", "absentees", "absenting", "absoluter", "absolutes", "absolving", "absorbent", "absorbing", "abstained", "abstainer", "abstinent", "abstracts", "abstruser", "absurdest", "absurdity", "abundance", "abusively", "abutments", "abysmally", "academics", "academies", "accenting", "accepting", "accessing", "accession", "accessory", "accidents", "acclaimed", "acclimate", "accoladed", "accolades", "accompany", "according", "accordion", "accosting", "accounted", "accredits", "accretion", "accustoms", "acetylene", "achievers", "achieving", "acidified", "acidifies", "acidulous", "acoustics", "acquaints", "acquiesce", "acquirers", "acquiring", "acquittal", "acquitted", "acrobatic", "acrostics", "actioning", "activated", "activates", "activists", "actresses", "actuality", "actuarial", "actuaries", "actuating", "actuators", "acuteness", "adamantly", "adaptable", "adaptions", "addicting", "addiction", "addictive", "additions", "additives", "addressed", "addressee", "addresses", "adenoidal", "adeptness", "adherence", "adherents", "adhesives", "adiabatic", "adjective", "adjoining", "adjourned", "adjudging", "adjusters", "adjusting", "adjutants", "admirable", "admirably", "admiralty", "admission", "admitting", "admixture", "adoptions", "adoration", "adoringly", "adornment", "adrenalin", "adroitest", "adulating", "adulation", "adulatory", "adulterer", "adulthood", "adumbrate", "advancing", "advantage", "adventure", "adverbial", "adversary", "adversely", "adversest", "adversity", "adverting", "advertise", "advisable", "advisedly", "advocated", "advocates", "aerialist", "aerobatic", "aerodrome", "aerograms", "aerospace", "aesthetes", "aesthetic", "aetiology", "affablest", "affecting", "affection", "affidavit", "affiliate", "affirming", "afflicted", "affluence", "affording", "afforests", "affronted", "aforesaid", "aftercare", "afterglow", "afterlife", "aftermath", "afternoon", "afterword", "aggravate", "aggregate", "aggressor", "aggrieved", "aggrieves", "agitating", "agitation", "agitators", "agnostics", "agrarians", "agreeable", "agreeably", "agreement", "aimlessly", "airdromes", "airfields", "airletter", "airlifted", "airliners", "airmailed", "airstrips", "airworthy", "alabaster", "alarmists", "albacores", "albatross", "alchemist", "alcoholic", "alehouses", "alertness", "algebraic", "algorithm", "alienable", "alienated", "alienates", "alighting", "alignment", "alkaloids", "allegedly", "alleluias", "allergens", "allergies", "allergist", "alleviate", "alleyways", "alliances", "alligator", "allocated", "allocates", "allotment", "allotting", "allowable", "allowance", "allusions", "alluviums", "almanacks", "almshouse", "alongside", "aloofness", "alphabets", "alterable", "alternate", "altimeter", "altitudes", "altruists", "alveolars", "amaranths", "amaryllis", "amazement", "amazingly", "amazonian", "ambergris", "ambiances", "ambiguity", "ambiguous", "ambitions", "ambitious", "ambulance", "ambushing", "amendable", "amendment", "amenities", "amethysts", "amidships", "amnesiacs", "amnestied", "amnesties", "amorality", "amorously", "amorphous", "amounting", "ampersand", "amphibian", "amplified", "amplifier", "amplifies", "amplitude", "amputated", "amputates", "amusement", "amusingly", "anacondas", "anaerobic", "analgesia", "analgesic", "analogies", "analogous", "analogues", "analytics", "anarchism", "anarchist", "anathemas", "anatomies", "anatomist", "ancestors", "ancestral", "anchorage", "anchoring", "anchorite", "anchorman", "anchormen", "anchovies", "ancienter", "anciently", "ancillary", "androgyny", "anecdotal", "anecdotes", "aneurysms", "angleworm", "anglicism", "angostura", "angstroms", "anguished", "anguishes", "animating", "animation", "animators", "animistic", "animosity", "annealing", "annotated", "annotates", "announced", "announcer", "announces", "annoyance", "annuities", "annulling", "annulment", "anointing", "anomalies", "anomalous", "anonymity", "anonymous", "anopheles", "anorexics", "answering", "antarctic", "anteaters", "antedated", "antedates", "antelopes", "antenatal", "anterooms", "anthology", "anticking", "antidotes", "antiknock", "antipasti", "antipasto", "antipathy", "antipodes", "antiquary", "antiquate", "antiquing", "antiquity", "antitoxin", "antitrust", "antiviral", "anxieties", "anxiously", "anybodies", "anythings", "anywheres", "apartheid", "apartment", "apathetic", "aperitifs", "apertures", "aphelions", "aphorisms", "apologias", "apologies", "apologist", "apostates", "apostolic", "appalling", "apparatus", "appealing", "appearing", "appeasers", "appeasing", "appellant", "appellate", "appendage", "appending", "appertain", "appetites", "applauded", "applejack", "appliance", "applicant", "appointed", "appointee", "apportion", "appraisal", "appraised", "appraiser", "appraises", "apprehend", "apprising", "approvals", "approving", "aptitudes", "aquanauts", "aquaplane", "aquariums", "aquatints", "aqueducts", "arabesque", "arachnids", "arbitrage", "arbitrary", "arbitrate", "arboretum", "arbutuses", "archaisms", "archangel", "archdukes", "archenemy", "archetype", "architect", "archiving", "archivist", "arduously", "arguments", "armadillo", "armaments", "armatured", "armatures", "armchairs", "armistice", "aromatics", "arpeggios", "arraigned", "arrangers", "arranging", "arresting", "arrogance", "arrogated", "arrogates", "arrowhead", "arrowroot", "arsonists", "arthritic", "arthritis", "arthropod", "artichoke", "artifacts", "artificer", "artifices", "artillery", "artlessly", "ascendant", "ascending", "ascension", "ascertain", "ascribing", "asexually", "ashamedly", "asparagus", "aspartame", "aspersion", "asphalted", "aspirants", "aspirated", "aspirates", "assailant", "assailing", "assassins", "assaulted", "assaulter", "assembled", "assembler", "assembles", "assenting", "asserting", "assertion", "assertive", "assessing", "assessors", "assiduity", "assiduous", "assigning", "assistant", "assisting", "associate", "assonance", "assorting", "assuaging", "assurance", "assuredly", "asterisks", "asteroids", "asthmatic", "astounded", "astrakhan", "astrology", "astronaut", "astronomy", "asymmetry", "atavistic", "atheistic", "athletics", "atonality", "atonement", "atrocious", "atrophied", "atrophies", "attaching", "attackers", "attacking", "attaining", "attempted", "attendant", "attendees", "attenders", "attending", "attention", "attentive", "attenuate", "attesting", "attitudes", "attorneys", "attracted", "attribute", "attrition", "aubergine", "auctioned", "audacious", "audiences", "audiotape", "auditions", "augmented", "augustest", "aureoling", "austerely", "austerest", "austerity", "authentic", "authoress", "authorial", "authoring", "authority", "autistics", "autobahns", "autocracy", "autocrats", "autocross", "autograph", "automaker", "automated", "automates", "automatic", "automaton", "autopilot", "autopsied", "autopsies", "auxiliary", "available", "avalanche", "averagely", "averaging", "aversions", "avocation", "avoidable", "avoidably", "avoidance", "avuncular", "awakening", "awareness", "awesomely", "awestruck", "awfullest", "awfulness", "awkwarder", "awkwardly", "axiomatic", "ayatollah", "babushkas", "bacchanal", "bachelors", "backaches", "backbench", "backbiter", "backbites", "backboard", "backbones", "backcloth", "backcombs", "backdated", "backdates", "backdrops", "backfield", "backfired", "backfires", "backhands", "backpacks", "backpedal", "backrests", "backrooms", "backsides", "backslash", "backslide", "backspace", "backstage", "backstops", "backtrack", "backwards", "backwater", "backwoods", "backyards", "bacterial", "bacterias", "bacterium", "badgering", "badminton", "badmouths", "bagatelle", "bagginess", "baguettes", "bailiwick", "balaclava", "balalaika", "balancing", "balconies", "balefully", "balladeer", "ballasted", "ballcocks", "ballerina", "ballgirls", "ballgowns", "ballistic", "ballooned", "balloting", "ballparks", "ballpoint", "ballrooms", "ballsiest", "ballyhoos", "balminess", "balsaming", "balusters", "bamboozle", "bandaging", "bandannas", "bandoleer", "bandstand", "bandwagon", "bandwidth", "banishing", "banisters", "banjoists", "bankbooks", "banknotes", "bankrolls", "bankrupts", "bannering", "banqueted", "banquette", "bantering", "baptismal", "barbarian", "barbarism", "barbarity", "barbarous", "barbecued", "barbecues", "barbering", "barefaced", "bargained", "bargainer", "baritones", "barkeeper", "barnacles", "barnstorm", "barnyards", "barometer", "baronetcy", "barracked", "barracuda", "barraging", "barrenest", "barrettes", "barricade", "barrister", "bartender", "bartering", "baseballs", "baseboard", "baselines", "basements", "bashfully", "basically", "basilicas", "basilisks", "bassinets", "bathhouse", "bathrobes", "bathrooms", "bathwater", "battalion", "battening", "batteries", "battering", "bawdiness", "bayoneted", "bazillion", "beachhead", "beachwear", "beanfeast", "beanpoles", "bearskins", "beastlier", "beatified", "beatifies", "beatitude", "beauteous", "beautiful", "beavering", "becalming", "beckoning", "becomings", "becquerel", "bedaubing", "bedazzled", "bedazzles", "bedecking", "bedfellow", "bedraggle", "bedridden", "bedsitter", "bedspread", "bedsteads", "beechnuts", "beefcakes", "beefsteak", "beekeeper", "beelining", "beetroots", "befalling", "befitting", "befogging", "befouling", "befriends", "befuddled", "befuddles", "begetters", "begetting", "beggaring", "beginners", "beginning", "begrudged", "begrudges", "beguiling", "beheading", "behemoths", "beholders", "beholding", "belatedly", "beleaguer", "believers", "believing", "belittled", "belittles", "bellicose", "bellowing", "bellyache", "bellyfuls", "belonging", "bemoaning", "benchmark", "benefices", "benefited", "benighted", "benumbing", "bequeaths", "bereaving", "beryllium", "beseeches", "besetting", "besiegers", "besieging", "besotting", "bestirred", "bestowals", "bestowing", "bestrides", "bethought", "betokened", "betrayals", "betrayers", "betraying", "betrothal", "betrothed", "bettering", "beverages", "bewailing", "bewilders", "bewitched", "bewitches", "biathlons", "bicameral", "bickering", "bicuspids", "bicycling", "bicyclist", "biennials", "bifurcate", "bigamists", "bigmouths", "bigotries", "bilabials", "bilateral", "bilingual", "billboard", "billeting", "billfolds", "billhooks", "billiards", "billionth", "billowier", "billowing", "billycans", "bimonthly", "binderies", "binnacles", "binocular", "binomials", "biography", "biologist", "biopsying", "biorhythm", "biosphere", "bipartite", "birdbaths", "birdbrain", "birdcages", "birdhouse", "birdieing", "birthdays", "birthmark", "birthrate", "bisecting", "bisection", "bisectors", "bisexuals", "bishopric", "bitchiest", "bitterest", "bizarrely", "blabbered", "blackball", "blackbird", "blackened", "blackhead", "blackjack", "blacklegs", "blacklist", "blackmail", "blackness", "blackouts", "blacktops", "blameless", "blanching", "blandness", "blanketed", "blankness", "blarneyed", "blaspheme", "blasphemy", "blastoffs", "blatantly", "blathered", "blazoning", "bleachers", "bleaching", "bleakness", "bleariest", "blemished", "blemishes", "blenching", "blesseder", "blessedly", "blessings", "blethered", "blighters", "blighting", "blindfold", "blindness", "blindside", "blinkered", "blistered", "blizzards", "blockaded", "blockades", "blockages", "blockhead", "blondness", "bloodbath", "bloodiest", "bloodless", "bloodline", "bloodshed", "bloodshot", "bloodying", "blossomed", "blotchier", "blotching", "blowhards", "blowholes", "blowlamps", "blowpipes", "blowtorch", "blowziest", "blubbered", "bludgeons", "bluebells", "blueberry", "bluebirds", "bluegrass", "bluenoses", "blueprint", "blundered", "blunderer", "bluntness", "blurriest", "blustered", "boardroom", "boardwalk", "boathouse", "boatloads", "boatswain", "boatyards", "bobolinks", "bobsleigh", "bobwhites", "bodacious", "bodyguard", "bodysuits", "bohemians", "bolstered", "boltholes", "bombarded", "bombastic", "bombshell", "bombsites", "boneheads", "boogieing", "bookcases", "bookended", "bookmaker", "bookmarks", "bookplate", "bookshelf", "bookshops", "bookstall", "bookstore", "bookworms", "boomerang", "boondocks", "boorishly", "bootblack", "bootlaces", "bootstrap", "bordellos", "bordering", "boreholes", "borrowers", "borrowing", "bossiness", "botanical", "botanists", "bothering", "bottoming", "bouffants", "bouillons", "bouldered", "boulevard", "bounciest", "boundless", "bounteous", "bountiful", "bourgeois", "boutiques", "bowlegged", "bowsprits", "bowstring", "boycotted", "boyfriend", "bracelets", "bracketed", "braggarts", "brainiest", "brainless", "brainwash", "brainwave", "branching", "brandying", "brashness", "brasserie", "brassiere", "brassiest", "brattiest", "brawniest", "brazening", "breaching", "breadline", "breakable", "breakages", "breakaway", "breakdown", "breakfast", "breakneck", "breakouts", "breastfed", "breasting", "breathers", "breathier", "breathing", "breeziest", "breweries", "brickbats", "brickwork", "brickyard", "bridleway", "briefcase", "briefings", "briefness", "brigadier", "brightens", "brightest", "brilliant", "brimstone", "briquette", "briskness", "bristlier", "bristling", "brittlest", "broaching", "broadcast", "broadened", "broadloom", "broadness", "broadside", "brocading", "brochures", "brokerage", "brokering", "bronchial", "brothered", "brotherly", "broughams", "brouhahas", "browbeats", "browniest", "brownouts", "brunching", "brunettes", "brushwood", "brushwork", "brusquely", "brusquest", "brutality", "brutishly", "bubblegum", "bubbliest", "buccaneer", "buckboard", "bucketful", "bucketing", "buckskins", "buckteeth", "bucktooth", "buckwheat", "budgetary", "budgeting", "buffaloed", "buffaloes", "buffering", "buffeting", "buggering", "buildings", "bulkheads", "bulkiness", "bulldozed", "bulldozer", "bulldozes", "bulletins", "bullfight", "bullfinch", "bullfrogs", "bullhorns", "bullrings", "bullshits", "bullwhips", "bulrushes", "bumblebee", "bumblings", "bumptious", "bungalows", "bungholes", "bunkhouse", "buoyantly", "burdening", "burgeoned", "burlesque", "burliness", "burnished", "burnishes", "burnooses", "burrowing", "bursaries", "bushiness", "bushwhack", "butchered", "butlering", "buttercup", "butterfat", "butterfly", "butterier", "butteries", "buttering", "butternut", "buttocked", "buttoning", "buzzwords", "bypassing", "byproduct", "bystander", "byzantine", "cabdriver", "cablecast", "cablegram", "cacheting", "cacophony", "cafeteria", "cafetiere", "calamined", "calamines", "calcified", "calcifies", "calcining", "calculate", "calendars", "calibrate", "caliphate", "calliopes", "calloused", "callouses", "callously", "callowest", "callusing", "calorific", "calumnies", "cambering", "camcorder", "camellias", "cameraman", "cameramen", "camisoles", "campaigns", "campanile", "campfires", "campsites", "campusing", "camshafts", "cancerous", "candidacy", "candidate", "candidest", "candlelit", "canisters", "cankering", "cankerous", "canneries", "cannibals", "canniness", "cannonade", "cannoning", "canoeists", "canonical", "canoodled", "canoodles", "canopying", "cantering", "canticles", "canvasing", "canvassed", "canvasser", "canvasses", "canyoning", "capablest", "capacious", "capacitor", "caparison", "capillary", "capsicums", "capsizing", "capsuling", "captaincy", "captained", "captioned", "captivate", "captivity", "capturing", "carapaces", "carbonate", "carbuncle", "carcasses", "carcinoma", "cardamoms", "cardamons", "cardboard", "cardigans", "cardinals", "cardsharp", "careening", "careering", "careerism", "careerist", "carefully", "caregiver", "caressing", "caretaker", "carillons", "carjacked", "carjacker", "carnation", "carnelian", "carnivals", "carnivore", "carousals", "carousels", "carousers", "carousing", "carpenter", "carpentry", "carpetbag", "carpeting", "carpooled", "carriages", "carryalls", "carrycots", "carryouts", "carthorse", "cartilage", "cartloads", "cartooned", "cartridge", "cartwheel", "carveries", "caryatids", "cascading", "casebooks", "caseloads", "casements", "cashiered", "cashpoint", "casserole", "cassettes", "castanets", "castaways", "castigate", "castrated", "castrates", "casuistry", "cataclysm", "catacombs", "catalepsy", "catalysis", "catalysts", "catalytic", "catamaran", "catapults", "cataracts", "catatonic", "catcalled", "catchalls", "catchiest", "catchings", "catchment", "catchword", "catechism", "caterings", "caterwaul", "catfishes", "catharses", "catharsis", "cathartic", "cathedral", "catheters", "catholics", "catnapped", "catteries", "cattiness", "cattleman", "cattlemen", "caucusing", "cauldrons", "causality", "causation", "causative", "causeless", "causeways", "cautioned", "cavalcade", "cavaliers", "cavalries", "caveatted", "cavernous", "cavorting", "ceasefire", "ceaseless", "celebrant", "celebrate", "celebrity", "celestial", "celibates", "cellmates", "cellphone", "cellulars", "cellulite", "celluloid", "cellulose", "cementing", "cenotaphs", "censoring", "censuring", "censusing", "centenary", "centipede", "centraler", "centrally", "centrists", "centuries", "centurion", "cephalics", "cerebrums", "certainer", "certainly", "certainty", "certified", "certifies", "certitude", "cesareans", "cessation", "cesspools", "cetaceans", "chaffinch", "chagrined", "chainsaws", "chairlift", "chalkiest", "challenge", "chameleon", "chamomile", "champagne", "champions", "chanciest", "chandlers", "chaparral", "chapattis", "chaperons", "chaplains", "charabanc", "character", "charbroil", "charcoals", "charities", "charlatan", "charmless", "chartered", "charwoman", "charwomen", "chastened", "chastised", "chastises", "chasubles", "chatlines", "chattered", "chatterer", "chattiest", "chauffeur", "cheapened", "cheapness", "checklist", "checkmate", "checkouts", "checkroom", "cheekbone", "cheekiest", "cheeriest", "cheerless", "cheesiest", "chemicals", "chemistry", "cherished", "cherishes", "chestnuts", "chicanery", "chichiest", "chickadee", "chickened", "chickpeas", "chickweed", "chicories", "chieftain", "chihuahua", "chilblain", "childcare", "childhood", "childless", "childlike", "chilliest", "chillings", "chinstrap", "chintzier", "chipboard", "chipmunks", "chipolata", "chippings", "chiropody", "chirpiest", "chirruped", "chiselers", "chiseling", "chitchats", "chivvying", "chlorides", "chocolate", "choirboys", "choosiest", "choppered", "choppiest", "chopstick", "chorister", "chortling", "chorusing", "chowdered", "christens", "christian", "chromatic", "chronicle", "chrysalis", "chubbiest", "chuckhole", "chuckling", "chummiest", "chundered", "chunkiest", "chuntered", "churchman", "churchmen", "cicatrice", "cigarette", "cigarillo", "cinchonas", "cinctures", "cindering", "cinematic", "ciphering", "circadian", "circuited", "circuitry", "circulars", "circulate", "cirrhosis", "citations", "citizenry", "civilians", "claimants", "clambakes", "clambered", "clammiest", "clamorous", "clampdown", "clapboard", "clappered", "clareting", "clarified", "clarifies", "clarinets", "clarioned", "classical", "classiest", "classless", "classmate", "classroom", "clattered", "clavicles", "cleanings", "cleanlier", "cleanness", "cleansers", "cleansing", "clearance", "clearings", "clearness", "clearways", "cleavages", "clenching", "clergyman", "clergymen", "cleverest", "clifftops", "climactic", "climaxing", "clinchers", "clinching", "clingfilm", "clingiest", "clinician", "clipboard", "clippings", "cloakroom", "clobbered", "clockwise", "clockwork", "cloisters", "closeness", "closeouts", "closeting", "clothiers", "cloudiest", "cloudless", "cloyingly", "clubbable", "clubhouse", "clumsiest", "clunkiest", "clustered", "clutching", "cluttered", "coachload", "coachwork", "coagulant", "coagulate", "coalesced", "coalesces", "coalfaces", "coalfield", "coalition", "coalmines", "coarsened", "coastline", "coatrooms", "coattails", "coauthors", "coaxingly", "cobwebbed", "cochineal", "cockatoos", "cockerels", "cockfight", "cockiness", "cockroach", "cockscomb", "cocktails", "cocooning", "codfishes", "codifying", "codpieces", "coexisted", "coffeepot", "cofferdam", "coffining", "cogitated", "cogitates", "cognition", "cognitive", "cognomens", "cogwheels", "cohabited", "coherence", "coiffured", "coiffures", "coincided", "coincides", "colanders", "coliseums", "collapsed", "collapses", "collaring", "collating", "collation", "colleague", "collected", "collector", "collegian", "colliding", "collision", "collocate", "colluding", "collusion", "collusive", "colonials", "colonists", "colonnade", "columbine", "columnist", "combatant", "combating", "combative", "combining", "comebacks", "comedians", "comedowns", "comeliest", "comforted", "comforter", "comically", "commanded", "commander", "commandos", "commenced", "commences", "commended", "commented", "commerced", "commerces", "commingle", "commissar", "committal", "committed", "committee", "commodity", "commodore", "commoners", "commonest", "commotion", "communing", "communion", "communism", "communist", "community", "commuters", "commuting", "compacted", "compacter", "compactly", "compactor", "companies", "companion", "comparing", "compassed", "compasses", "compelled", "competent", "competing", "compilers", "compiling", "complains", "complaint", "completed", "completer", "completes", "complexer", "complexes", "compliant", "complying", "component", "comported", "composers", "composing", "composite", "composted", "composure", "compounds", "comprised", "comprises", "computers", "computing", "comradely", "concavity", "concealed", "conceding", "conceited", "conceived", "conceives", "concerned", "concerted", "concertos", "concierge", "concisely", "concisest", "concision", "conclaves", "concluded", "concludes", "concocted", "concordat", "concourse", "concreted", "concretes", "concubine", "concurred", "concussed", "concusses", "condemned", "condensed", "condenser", "condenses", "condiment", "condition", "condoling", "condoning", "conducing", "conducive", "conducted", "conductor", "confabbed", "conferred", "conferrer", "confessed", "confesses", "confessor", "confidant", "confident", "confiding", "configure", "confining", "confirmed", "conflated", "conflates", "conflicts", "confluent", "conformed", "confounds", "confronts", "confusing", "confusion", "confuting", "congealed", "congenial", "congested", "congruent", "congruity", "congruous", "conjoined", "conjugate", "conjurers", "conjuring", "connected", "connector", "connexion", "connivers", "conniving", "connoting", "connubial", "conquered", "conqueror", "conquests", "conscious", "conscript", "consensus", "consented", "conserved", "conserves", "considers", "consigned", "consignee", "consisted", "consoling", "consonant", "consorted", "consortia", "conspired", "conspires", "constable", "constancy", "constants", "constrain", "constrict", "construct", "construed", "construes", "consulars", "consulate", "consulted", "consumers", "consuming", "contacted", "contagion", "contained", "container", "contended", "contender", "contented", "contested", "continent", "continual", "continued", "continues", "continuum", "contorted", "contoured", "contracts", "contrails", "contralto", "contrasts", "contrived", "contrives", "contumely", "contusing", "contusion", "conundrum", "convector", "conveners", "convening", "convented", "converged", "converges", "conversed", "converses", "converted", "converter", "convexing", "convexity", "conveying", "conveyors", "convicted", "convinced", "convinces", "convivial", "convoking", "convoying", "convulsed", "convulses", "cookbooks", "cookeries", "cookhouse", "cooperate", "coopering", "copiously", "copulated", "copulates", "copyright", "coquetted", "coquettes", "cordially", "cordoning", "corduroys", "coriander", "corkscrew", "cormorant", "cornballs", "cornbread", "corncrake", "cornering", "cornfield", "cornflour", "cornrowed", "cornstalk", "corollary", "corporals", "corporate", "corporeal", "corpulent", "corpuscle", "corralled", "corrected", "correcter", "correctly", "corrector", "correlate", "corridors", "corroding", "corrosion", "corrosive", "corrugate", "corrupted", "corrupter", "corruptly", "corseting", "cortisone", "coruscate", "cosigners", "cosigning", "cosmetics", "cosmogony", "cosmology", "cosmonaut", "cosponsor", "cosseting", "cossetted", "costarred", "costliest", "costumers", "costuming", "cotillion", "cottagers", "cottaging", "cottoning", "cotyledon", "couchette", "countable", "countably", "countdown", "countered", "countless", "countries", "couplings", "courgette", "couriered", "courteous", "courtesan", "courtiers", "courtlier", "courtroom", "courtship", "courtyard", "couturier", "covenants", "coveralls", "coverings", "coverlets", "cowardice", "coworkers", "coxswains", "crabbiest", "crabgrass", "crackdown", "cracklier", "crackling", "crackpots", "craftiest", "craftsman", "craftsmen", "craggiest", "cranberry", "crankcase", "crankiest", "crannying", "crappiest", "crassness", "cratering", "cravatted", "crayoning", "craziness", "creakiest", "creamiest", "creations", "creatures", "credenzas", "crediting", "creditors", "credulity", "credulous", "creepiest", "cremating", "cremation", "crematory", "creosoted", "creosotes", "crescendo", "crescents", "cretinous", "crevasses", "cricketer", "criminals", "crimsoned", "crinklier", "crinklies", "crinkling", "crinoline", "crippling", "crispiest", "crispness", "criterion", "criticism", "critiqued", "critiques", "crocheted", "crocodile", "croissant", "crookeder", "crookedly", "croquette", "crossbars", "crossbeam", "crossbows", "crossbred", "crossfire", "crossings", "crossness", "crossover", "crossroad", "crosstown", "crosswalk", "crosswind", "crosswise", "crossword", "crotchets", "crotchety", "crouching", "croupiers", "croupiest", "crucially", "crucibles", "crucified", "crucifies", "cruciform", "cruddiest", "crudeness", "crudities", "cruelties", "crumbiest", "crumblier", "crumblies", "crumbling", "crummiest", "crumpling", "crunchier", "crunching", "crusaders", "crusading", "crustiest", "crybabies", "cryogenic", "cubbyhole", "cuckolded", "cucumbers", "cuddliest", "culminate", "cultivate", "culturing", "cuneiform", "cunninger", "cunningly", "cupboards", "cupolaing", "curatives", "curiosity", "curiouser", "curiously", "curlicued", "curlicues", "curliness", "currently", "curricula", "currycomb", "cursedest", "cursorily", "cursoring", "curtailed", "curtained", "curtsying", "curvature", "cushioned", "cuspidors", "custodial", "custodian", "customary", "customers", "cutesiest", "cutlasses", "cutthroat", "cyberpunk", "cyclamens", "cyclotron", "cylinders", "cynically", "cynosures", "cypresses", "cytoplasm", "dachshund", "dactylics", "daffodils", "daintiest", "daiquiris", "dairymaid", "dalliance", "dalmatian", "damasking", "damnation", "damnedest", "dampening", "dandelion", "dandering", "dandified", "dandifies", "dangering", "dangerous", "dapperest", "daredevil", "darkening", "darkliest", "darkrooms", "darnedest", "dartboard", "dashboard", "dashingly", "dastardly", "databased", "databases", "datebooks", "datelined", "datelines", "daughters", "dauntless", "davenport", "daydreams", "daylights", "dazzlings", "deaconess", "deadbeats", "deadbolts", "deadening", "deadheads", "deadliest", "deadlined", "deadlines", "deadlocks", "deafening", "deaneries", "deathbeds", "deathblow", "deathless", "deathlier", "deathlike", "deathtrap", "debarking", "debarment", "debarring", "debatable", "debauched", "debauchee", "debauches", "debenture", "debriefed", "debuggers", "debugging", "debunking", "decadence", "decadents", "decamping", "decanters", "decanting", "decathlon", "deceasing", "decedents", "deceitful", "deceivers", "deceiving", "decencies", "decentest", "deception", "deceptive", "decidedly", "deciduous", "decimated", "decimates", "deciphers", "decisions", "deckchair", "deckhands", "declaimed", "declaring", "declining", "declivity", "decompose", "decontrol", "decorated", "decorates", "decorator", "decoupled", "decouples", "decreased", "decreases", "decreeing", "dedicated", "dedicates", "deducible", "deducting", "deduction", "deductive", "deejaying", "deepening", "defaulted", "defaulter", "defeating", "defeatism", "defeatist", "defecated", "defecates", "defecting", "defection", "defective", "defectors", "defendant", "defenders", "defending", "deference", "deferment", "deferrals", "deferring", "defiantly", "deficient", "definable", "deflating", "deflation", "deflected", "deflector", "deflowers", "defoggers", "defogging", "defoliant", "defoliate", "deforests", "deforming", "deformity", "defrauded", "defraying", "defrocked", "defrosted", "defroster", "degrading", "dehydrate", "dejecting", "dejection", "delegated", "delegates", "deletions", "delicious", "delighted", "delimited", "delimiter", "delineate", "delirious", "deliriums", "delivered", "deliverer", "delousing", "delusions", "demagogic", "demagogue", "demanding", "demarcate", "demeaning", "demerited", "demijohns", "demisters", "demisting", "demitasse", "demobbing", "democracy", "democrats", "demotions", "demurring", "demystify", "denatured", "denatures", "dendrites", "denigrate", "denounced", "denounces", "denseness", "densities", "dentistry", "deodorant", "departing", "departure", "depending", "depicting", "depiction", "deplaning", "depleting", "depletion", "deploring", "deploying", "deportees", "deporting", "deposited", "depositor", "depraving", "depravity", "deprecate", "depressed", "depresses", "depriving", "deprogram", "derailing", "deranging", "derelicts", "derivable", "derogated", "derogates", "derringer", "dervishes", "descaling", "descanted", "descended", "descender", "described", "describes", "descrying", "desecrate", "deselects", "deserters", "deserting", "desertion", "deserving", "desiccate", "designate", "designers", "designing", "desirable", "desirably", "desisting", "deskilled", "desolated", "desolates", "despaired", "desperado", "desperate", "despising", "despoiled", "despotism", "destinies", "destining", "destitute", "destroyed", "destroyer", "destructs", "desultory", "detaching", "detailing", "detainees", "detaining", "detecting", "detection", "detective", "detectors", "detention", "detergent", "determine", "deterrent", "deterring", "detesting", "dethroned", "dethrones", "detonated", "detonates", "detonator", "detouring", "detracted", "detractor", "detriment", "deuterium", "devaluing", "devastate", "developed", "developer", "deviating", "deviation", "devilment", "devilries", "deviously", "devolving", "devotedly", "devotions", "devouring", "devoutest", "dexterity", "dexterous", "diabetics", "diacritic", "diagnosed", "diagnoses", "diagnosis", "diagonals", "dialectal", "dialectic", "diameters", "diapering", "diaphragm", "diastolic", "diatribes", "dichotomy", "dickering", "dickheads", "dickybird", "dictating", "dictation", "dictators", "didactics", "dieseling", "dietaries", "dietetics", "dietitian", "different", "differing", "difficult", "diffident", "diffracts", "diffusely", "diffusing", "diffusion", "digesting", "digestion", "digestive", "digitalis", "digitally", "dignified", "dignifies", "dignitary", "dignities", "digressed", "digresses", "diligence", "dilutions", "dimension", "dimwitted", "dinginess", "dinnering", "dinosaurs", "diocesans", "diphthong", "diplomacy", "diplomata", "diplomats", "dipsticks", "directest", "directing", "direction", "directive", "directors", "directory", "dirigible", "dirtiness", "disabling", "disabused", "disabuses", "disaffect", "disagreed", "disagrees", "disallows", "disappear", "disarming", "disarrays", "disasters", "disavowal", "disavowed", "disbanded", "disbarred", "disbelief", "disbursed", "disburses", "discarded", "discerned", "discharge", "disciples", "disclaims", "disclosed", "discloses", "discomfit", "discorded", "discounts", "discourse", "discovers", "discovery", "discredit", "discussed", "discusses", "disdained", "disembark", "disembody", "disengage", "disfigure", "disgorged", "disgorges", "disgraced", "disgraces", "disguised", "disguises", "disgusted", "dishcloth", "dishevels", "dishonest", "dishtowel", "dishwater", "disinfect", "disinters", "disjoints", "diskettes", "disliking", "dislocate", "dislodged", "dislodges", "dismalest", "dismantle", "dismaying", "dismember", "dismissal", "dismissed", "dismisses", "dismounts", "disobeyed", "disoblige", "disorders", "disorient", "disowning", "disparage", "disparate", "disparity", "dispelled", "dispensed", "dispenser", "dispenses", "dispersal", "dispersed", "disperses", "dispirits", "displaced", "displaces", "displayed", "displease", "disported", "disposals", "disposing", "disproved", "disproves", "disputant", "disputing", "disquiets", "disregard", "disrepair", "disrepute", "disrobing", "disrupted", "dissected", "dissemble", "dissented", "dissenter", "dissident", "dissipate", "dissolute", "dissolved", "dissolves", "dissonant", "dissuaded", "dissuades", "distanced", "distances", "distantly", "distastes", "distemper", "distended", "distilled", "distiller", "distorted", "distorter", "distracts", "districts", "distrusts", "disturbed", "disunited", "disunites", "ditherers", "dithering", "diuretics", "diurnally", "divergent", "diverging", "diversely", "diversify", "diversion", "diversity", "diverting", "divesting", "dividends", "divisible", "divisions", "divorcing", "divulging", "dixieland", "dizziness", "dobermans", "docketing", "docklands", "dockyards", "doctorate", "doctoring", "doctrinal", "doctrines", "docudrama", "documents", "doddering", "dogfights", "dogfishes", "dogfought", "doggonest", "doggoning", "doghouses", "dogmatics", "dogmatism", "dogmatist", "dolefully", "dollhouse", "dolloping", "domestics", "domiciled", "domiciles", "dominance", "dominants", "dominated", "dominates", "domineers", "dominions", "donations", "doohickey", "doomsayer", "doomsters", "doorbells", "doorjambs", "doorknobs", "doorposts", "doorsteps", "doorstops", "dormitory", "dosshouse", "doubloons", "doubtless", "doughiest", "doughtier", "dovecotes", "dovetails", "dowdiness", "downbeats", "downfalls", "downgrade", "downhills", "downloads", "downplays", "downpours", "downright", "downriver", "downscale", "downshift", "downsized", "downsizes", "downspout", "downstage", "downstate", "downswing", "downtrend", "downturns", "downwards", "draconian", "dragonfly", "dragooned", "dragsters", "drainpipe", "dramatics", "dramatist", "draperies", "drawbacks", "dreamboat", "dreamiest", "dreamland", "dreamless", "dreamlike", "dreariest", "drenching", "dressiest", "dressings", "dribblers", "dribbling", "driftnets", "driftwood", "drinkable", "drinkings", "drippiest", "drippings", "driveways", "drizzlier", "drizzling", "drollness", "dromedary", "droopiest", "droppings", "drownings", "drowsiest", "drubbings", "druggists", "drugstore", "drumbeats", "drumstick", "drunkards", "drunkenly", "drywalled", "dubiously", "duchesses", "duckbills", "ducklings", "ductility", "dulcimers", "dumbbells", "dumbfound", "dumplings", "dungarees", "dungeoned", "duopolies", "duplicate", "duplicity", "dustcarts", "dustiness", "dustsheet", "dutifully", "dwellings", "dwindling", "dynamical", "dynamited", "dynamites", "dynasties", "dysentery", "dyslexics", "dyspepsia", "dyspeptic", "eagerness", "earliness", "earmarked", "earnestly", "earphones", "earpieces", "earthiest", "earthlier", "earthling", "earthward", "earthwork", "earthworm", "eastbound", "easterner", "eastwards", "easygoing", "eavesdrop", "ebullient", "eccentric", "eclectics", "eclipsing", "ecologist", "economics", "economies", "economist", "ecosystem", "ecstasies", "edelweiss", "edibility", "editorial", "educables", "educating", "education", "educative", "educators", "effecting", "effective", "effectual", "efficient", "effluents", "effulgent", "effusions", "eggbeater", "eggplants", "eggshells", "eglantine", "egomaniac", "egotistic", "egregious", "eiderdown", "eighteens", "eightieth", "ejaculate", "ejections", "elaborate", "elbowroom", "elections", "electives", "electoral", "electrics", "electrify", "electrode", "electrons", "elegantly", "elemental", "elephants", "elevating", "elevation", "elevators", "elevenses", "elevenths", "eliciting", "eliminate", "elocution", "elongated", "elongates", "elopement", "eloquence", "elsewhere", "elucidate", "elusively", "emaciated", "emaciates", "emanating", "emanation", "embalmers", "embalming", "embargoed", "embargoes", "embarking", "embarrass", "embassies", "embattled", "embedding", "embellish", "embezzled", "embezzler", "embezzles", "embitters", "emblazons", "embodying", "emboldens", "embolisms", "embossing", "embracing", "embroider", "embroiled", "embryonic", "emergence", "emergency", "emigrants", "emigrated", "emigrates", "eminences", "eminently", "emissions", "emollient", "emolument", "emotional", "emotively", "emphysema", "empirical", "employees", "employers", "employing", "emporiums", "empowered", "empresses", "emptiness", "emulating", "emulation", "emulators", "emulsions", "enactment", "encamping", "enchanted", "enchanter", "enchilada", "encircled", "encircles", "enclosing", "enclosure", "encompass", "encounter", "encourage", "encrusted", "encrypted", "encumbers", "endangers", "endearing", "endlessly", "endocrine", "endorphin", "endorsers", "endorsing", "endowment", "endpoints", "endurable", "endurance", "energetic", "enervated", "enervates", "enfeebled", "enfeebles", "enfolding", "enforcers", "enforcing", "engenders", "engineers", "engorging", "engravers", "engraving", "engrossed", "engrosses", "engulfing", "enhancers", "enhancing", "enigmatic", "enjoining", "enjoyable", "enjoyably", "enjoyment", "enlargers", "enlarging", "enlighten", "enlistees", "enlisting", "enlivened", "enmeshing", "ennobling", "enquirers", "enrapture", "enriching", "enrolling", "ensconced", "ensconces", "ensembles", "enshrined", "enshrines", "enshrouds", "enslaving", "ensnaring", "entailing", "entangled", "entangles", "enteritis", "entertain", "enthroned", "enthrones", "enthusing", "enticings", "entitling", "entombing", "entourage", "entranced", "entrances", "entrapped", "entreated", "entrusted", "entryways", "entwining", "enumerate", "enunciate", "enveloped", "envelopes", "enviously", "envisaged", "envisages", "envisions", "ephemeral", "epicurean", "epidemics", "epidermal", "epidermis", "epidurals", "epigraphs", "epileptic", "epilogued", "epilogues", "episcopal", "eponymous", "equations", "equerries", "equinoxes", "equipages", "equipment", "equipoise", "equipping", "equitable", "equitably", "equivocal", "eradicate", "erections", "erectness", "ergonomic", "erogenous", "eroticism", "erroneous", "erstwhile", "eruditely", "erudition", "eruptions", "escalated", "escalates", "escalator", "escalopes", "escapades", "escapists", "escaroles", "eschewing", "escorting", "espionage", "esplanade", "espousing", "espressos", "essayists", "essential", "establish", "esteeming", "estimable", "estimated", "estimates", "estimator", "estranged", "estranges", "estuaries", "eternally", "ethically", "ethnicity", "ethnology", "etiolated", "etiquette", "etymology", "eucalypti", "eulogists", "euphemism", "evacuated", "evacuates", "evaluated", "evaluates", "evaporate", "evasively", "eventuate", "everglade", "evergreen", "everybody", "evictions", "evidenced", "evidences", "evidently", "evildoers", "evocation", "evocative", "evolution", "exactness", "examiners", "examining", "exampling", "excavated", "excavates", "excavator", "exceeding", "excellent", "excelling", "excepting", "exception", "excerpted", "excessive", "exchanged", "exchanges", "exchequer", "excisions", "excitable", "excitedly", "exclaimed", "excluding", "exclusion", "exclusive", "excoriate", "excrement", "excreting", "excretion", "excretory", "exculpate", "excursion", "excusable", "execrable", "execrably", "execrated", "execrates", "executing", "execution", "executive", "executors", "executrix", "exemplars", "exemplary", "exemplify", "exempting", "exemption", "exercised", "exercises", "exertions", "exfoliate", "exhausted", "exhibited", "exhibitor", "exhorting", "existence", "exonerate", "exorcised", "exorcises", "exorcisms", "exorcists", "exoticism", "expanding", "expansion", "expansive", "expatiate", "expectant", "expecting", "expedient", "expedited", "expediter", "expedites", "expelling", "expending", "expensive", "expertise", "expiating", "expiation", "explained", "expletive", "explicate", "explicits", "exploding", "exploited", "exploiter", "explorers", "exploring", "explosion", "explosive", "exponents", "exporters", "exporting", "exposures", "expounded", "expressed", "expresses", "expressly", "expulsion", "expunging", "expurgate", "exquisite", "extempore", "extending", "extension", "extensive", "extenuate", "exteriors", "externals", "extincted", "extirpate", "extolling", "extorting", "extortion", "extracted", "extractor", "extradite", "extremely", "extremest", "extremism", "extremist", "extremity", "extricate", "extrinsic", "extrovert", "extruding", "extrusion", "exuberant", "eyeballed", "eyelashes", "eyeliners", "eyepieces", "eyestrain", "fabricate", "facecloth", "facetious", "facsimile", "factional", "factorial", "factories", "factoring", "factotums", "factually", "faculties", "faddiness", "faintness", "fairyland", "faithfuls", "faithless", "falconers", "fallacies", "fallowing", "falsehood", "falseness", "falsettos", "falsified", "falsifies", "falsities", "faltering", "familiars", "famishing", "fanatical", "fanciable", "fanciness", "fandangos", "fanlights", "fantasias", "fantasied", "fantasies", "fantasist", "fantastic", "farewells", "farmhands", "farmhouse", "farmlands", "farmstead", "farmyards", "farragoes", "farrowing", "farthings", "fascinate", "fashioned", "fastballs", "fasteners", "fastening", "fatalists", "fatefully", "fatheaded", "fathering", "fathoming", "fatiguing", "fattening", "fatuously", "faultiest", "faultless", "fearfully", "feathered", "featuring", "fecundity", "federally", "federated", "federates", "feelingly", "feistiest", "felonious", "feminines", "feminists", "fermented", "ferocious", "ferreting", "ferryboat", "fertility", "fervently", "festering", "festivals", "festively", "festivity", "festooned", "fetishism", "fetishist", "fettering", "feudalism", "fictional", "fiddliest", "fidgeting", "fiduciary", "fieldsman", "fieldsmen", "fieldwork", "fieriness", "fifteenth", "fiftieths", "fightback", "figurines", "filaments", "filigreed", "filigrees", "filleting", "filliping", "filmmaker", "filmstrip", "filtering", "filthiest", "filtrated", "filtrates", "finaglers", "finagling", "finalists", "financial", "financier", "financing", "finessing", "fingering", "fingertip", "finickier", "finishers", "finishing", "fireballs", "firebombs", "firebrand", "firebreak", "firebrick", "firefight", "fireflies", "fireguard", "firehouse", "firelight", "fireplace", "fireplugs", "firepower", "fireproof", "firesides", "firestorm", "firetraps", "firewalls", "firewater", "fireworks", "firmament", "firstborn", "firsthand", "fishbowls", "fishcakes", "fisheries", "fisherman", "fishermen", "fishhooks", "fishtails", "fishwives", "fittingly", "fixations", "fixatives", "flabbiest", "flagellum", "flagpoles", "flagships", "flagstaff", "flagstone", "flakiness", "flambeing", "flamencos", "flamingos", "flammable", "flapjacks", "flashback", "flashbulb", "flashcard", "flashguns", "flashiest", "flatboats", "flatfoots", "flatirons", "flatmates", "flattened", "flattered", "flatterer", "flatulent", "flaunting", "flautists", "fleabites", "fledgling", "fleeciest", "fleetness", "fleshiest", "fleshlier", "fleshpots", "flickered", "flightier", "flimflams", "flimsiest", "flinching", "flintiest", "flintlock", "flippancy", "floggings", "floodgate", "flophouse", "floppiest", "flotation", "flotillas", "flouncing", "flounders", "flouriest", "flowerbed", "flowerier", "flowering", "flowerpot", "fluctuate", "fluffiest", "flummoxed", "flummoxes", "fluoresce", "fluorides", "flurrying", "flustered", "fluttered", "flyleaves", "flypapers", "flysheets", "flyspecks", "flyweight", "flywheels", "fogginess", "folksiest", "follicles", "followers", "following", "fomenting", "foodstuff", "fooleries", "foolhardy", "foolisher", "foolishly", "foolproof", "footballs", "footfalls", "foothills", "footholds", "footloose", "footnoted", "footnotes", "footpaths", "footplate", "footprint", "footrests", "footsteps", "footstool", "forbidden", "forearmed", "forebears", "foreboded", "forebodes", "forecasts", "foreclose", "forecourt", "foredooms", "forefront", "foregoing", "forehands", "foreheads", "foreigner", "forelocks", "foremasts", "forenames", "forenoons", "forensics", "foresails", "foreshore", "foresight", "foreskins", "forestall", "foresters", "foresting", "foretaste", "foretells", "forewarns", "forewoman", "forewomen", "forewords", "forfeited", "forgather", "forgeries", "forgetful", "forgiving", "forgotten", "forklifts", "forlorner", "forlornly", "formalism", "formalist", "formality", "formation", "formative", "formatted", "formulaic", "formulate", "fornicate", "forsaking", "forswears", "forsythia", "forthwith", "fortieths", "fortified", "fortifies", "fortitude", "fortnight", "fortunate", "forwarded", "forwarder", "fostering", "foundered", "foundling", "foundries", "fountains", "fourscore", "foursomes", "fourteens", "foxgloves", "foxhounds", "fractions", "fractious", "fractured", "fractures", "fragility", "fragments", "fragrance", "frailties", "framework", "franchise", "frankness", "fraternal", "fraudster", "fraughted", "frazzling", "freakiest", "freckling", "freebased", "freebases", "freeholds", "freelance", "freeloads", "freephone", "freestyle", "freewheel", "freighted", "freighter", "frequency", "frequents", "freshened", "freshness", "fretfully", "fricassee", "fricative", "frictions", "frightens", "frightful", "frighting", "frigidity", "frilliest", "friskiest", "frittered", "frivolity", "frivolous", "frizziest", "frizzling", "frogmarch", "frogspawn", "frolicked", "frontages", "frontally", "frontiers", "frostbite", "frostiest", "frothiest", "frowziest", "frugality", "fruitcake", "fruiterer", "fruitiest", "fruitless", "frumpiest", "frustrate", "fuckheads", "fugitives", "fulfilled", "fullbacks", "fulminate", "fulsomely", "fumigated", "fumigates", "fumigator", "functions", "fungicide", "funicular", "funniness", "furbished", "furbishes", "furiously", "furloughs", "furnished", "furnishes", "furniture", "furrowing", "furthered", "furtively", "fuselages", "fusiliers", "fusillade", "fussiness", "futurists", "fuzziness", "gabardine", "gadabouts", "gainfully", "gallantly", "gallantry", "galleried", "galleries", "gallivant", "galloping", "gallstone", "galoshing", "galumphed", "gamecocks", "gangplank", "gangrened", "gangrenes", "gangsters", "gaolbirds", "gaolbreak", "garbanzos", "gardeners", "gardenias", "gardening", "gargoyles", "garlanded", "garlicked", "garnering", "garnished", "garnishee", "garnishes", "garrisons", "garroting", "garrulity", "garrulous", "gasholder", "gaslights", "gasometer", "gastritis", "gatecrash", "gatehouse", "gateposts", "gatherers", "gathering", "gaudiness", "gauntlets", "gauntness", "gawkiness", "gazetteer", "gazetting", "gazillion", "gazumping", "gearboxes", "gearshift", "gearwheel", "gelignite", "gemstones", "gendarmes", "genealogy", "generally", "generated", "generates", "generator", "geniality", "genitalia", "genitives", "genocidal", "genocides", "genteeler", "genteelly", "gentility", "gentleman", "gentlemen", "genuflect", "genuinely", "geodesics", "geography", "geologies", "geologist", "geometric", "geraniums", "geriatric", "germanium", "germicide", "germinate", "gestating", "gestation", "gesturing", "ghastlier", "ghostlier", "gibbering", "gibberish", "gibbeting", "giddiness", "gigabytes", "giggliest", "gimcracks", "gimleting", "gimmickry", "gingering", "ginormous", "girlhoods", "girlishly", "giveaways", "glacially", "gladdened", "gladiator", "gladiolas", "gladiolus", "gladliest", "glamorous", "glandular", "glaringly", "glassfuls", "glassiest", "glassware", "gleamings", "gleefully", "glimmered", "glimpsing", "glissandi", "glissando", "glistened", "glittered", "glitziest", "gloamings", "gloomiest", "glorified", "glorifies", "glossiest", "glottises", "glowering", "glowingly", "glowworms", "glutinous", "gnarliest", "goalmouth", "goalposts", "goatherds", "goatskins", "goddammit", "goddesses", "godfather", "godlessly", "godliness", "godmother", "godparent", "goldbrick", "goldenest", "goldenrod", "goldfield", "goldfinch", "goldmines", "goldsmith", "golliwogs", "gondolier", "goodliest", "goodnight", "goosestep", "goulashes", "gourmands", "governess", "governing", "governors", "grabbiest", "graceless", "gradation", "gradients", "gradually", "graduated", "graduates", "grainiest", "granaries", "grandaddy", "granddads", "grandiose", "grandness", "grandsons", "granulate", "grapevine", "graphical", "grappling", "grassiest", "grassland", "gratified", "gratifies", "gratitude", "graveside", "graveyard", "gravitate", "graybeard", "greasiest", "greatcoat", "greatness", "greediest", "greenback", "greengage", "greenhorn", "greenness", "greetings", "grenadier", "grenadine", "greyhound", "gridirons", "gridlocks", "grievance", "grillings", "grimacing", "grisliest", "gristlier", "grittiest", "grizzlier", "grizzlies", "grizzling", "groceries", "groggiest", "groomsman", "groomsmen", "grooviest", "grosbeaks", "grossness", "grotesque", "grottiest", "grouchier", "grouching", "grounders", "groundhog", "grounding", "groundnut", "groupings", "grubbiest", "grubstake", "grudgings", "gruesomer", "gruffness", "grumblers", "grumbling", "grumpiest", "grungiest", "guacamole", "guarantee", "guarantor", "guardedly", "guardians", "guardrail", "guardroom", "guardsman", "guardsmen", "guerrilla", "guessable", "guesswork", "guestroom", "guffawing", "guidebook", "guideline", "guildhall", "guileless", "guillemot", "guiltiest", "guiltless", "guitarist", "gunfights", "gunfought", "gunnysack", "gunpowder", "gunrunner", "gunsmiths", "gushingly", "gusseting", "gustatory", "guttering", "gutturals", "gymkhanas", "gymnasium", "gymnastic", "gyrations", "gyroscope", "habitable", "habituals", "habituate", "haciendas", "hackneyed", "hacksawed", "hailstone", "hailstorm", "hairbands", "hairbrush", "hairdryer", "hairgrips", "hairiness", "hairlines", "hairpiece", "hairspray", "hairstyle", "halfbacks", "halfpence", "halfpenny", "halftimes", "halftones", "halitosis", "hallmarks", "hallowing", "haltering", "haltingly", "hamburger", "hammering", "hampering", "hamstring", "hamstrung", "handballs", "handbills", "handbooks", "handbrake", "handcarts", "handcraft", "handcuffs", "handholds", "handicaps", "handiness", "handiwork", "handlebar", "handmaids", "handovers", "handpicks", "handrails", "handshake", "handsomer", "handstand", "hangnails", "hangovers", "hankering", "haphazard", "happening", "happiness", "harangued", "harangues", "harassing", "harbinger", "hardbacks", "hardboard", "hardcover", "hardeners", "hardening", "hardiness", "hardliner", "hardships", "hardwoods", "harebells", "harlequin", "harmfully", "harmonica", "harmonics", "harmonies", "harnessed", "harnesses", "harpooned", "harridans", "harrowing", "harrumphs", "harshness", "harvested", "harvester", "hastening", "hastiness", "hatchback", "hatchways", "hatefully", "hatstands", "haughtier", "haughtily", "haunching", "haversack", "hawthorns", "haymaking", "haystacks", "hazarding", "hazardous", "hazelnuts", "headaches", "headbands", "headboard", "headbutts", "headcases", "headcount", "headdress", "headfirst", "headhunts", "headlamps", "headlands", "headlight", "headlined", "headliner", "headlines", "headlocks", "headphone", "headrests", "headscarf", "headships", "headstone", "headwinds", "headwords", "healthful", "healthier", "healthily", "hearkened", "heartache", "heartbeat", "heartburn", "heartened", "heartfelt", "hearthrug", "heartiest", "heartland", "heartless", "heartsick", "heatproof", "heatwaves", "heaviness", "hectoring", "hedgehogs", "hedgerows", "hedonists", "heehawing", "hegemonic", "heightens", "heinously", "heiresses", "heirlooms", "heliports", "hellebore", "hellholes", "hellishly", "helmeting", "helpfully", "helplines", "helpmates", "hemstitch", "henpecked", "hepatitis", "heptagons", "heralding", "herbalist", "herbicide", "herbivore", "herculean", "hereabout", "hereafter", "heretical", "heritages", "hermetics", "hermitage", "hesitancy", "hesitated", "hesitates", "heterodox", "heuristic", "hexagonal", "hexameter", "hibernate", "hickories", "hideaways", "hidebound", "hideously", "hierarchy", "highballs", "highbrows", "highchair", "highlands", "highlight", "hightails", "hijackers", "hijacking", "hilarious", "hillbilly", "hillsides", "hindering", "hindrance", "hindsight", "hirelings", "histamine", "histogram", "historian", "histories", "hitchhike", "hoardings", "hoarfrost", "hoariness", "hobbyists", "hobgoblin", "hobnailed", "hobnobbed", "hockshops", "hogsheads", "holdovers", "holidayed", "hollering", "hollowest", "hollowing", "hollyhock", "holocaust", "holograms", "holograph", "holstered", "homegrown", "homelands", "homeliest", "homemaker", "homeowner", "homepages", "homerooms", "homestead", "hometowns", "homeyness", "homicidal", "homicides", "homograph", "homophone", "honestest", "honeybees", "honeycomb", "honeydews", "honeymoon", "honeypots", "honorific", "hoodooing", "hoodwinks", "hookworms", "hooligans", "hooraying", "hoovering", "hopefully", "hopscotch", "hornpipes", "horoscope", "horribles", "horrified", "horrifies", "horseback", "horsehair", "horsehide", "horseplay", "horseshit", "horseshoe", "horsetail", "horsewhip", "hosepipes", "hospitals", "hostelers", "hosteling", "hostessed", "hostesses", "hostilely", "hostility", "hoteliers", "hotfooted", "hotheaded", "hothoused", "hothouses", "hotplates", "hourglass", "houseboat", "houseboys", "housecoat", "household", "housemaid", "housemate", "houseroom", "housetops", "housewife", "housework", "howitzers", "howsoever", "hucksters", "humanists", "humankind", "humanness", "humanoids", "humblings", "humbugged", "humdinger", "humiliate", "hummocked", "humongous", "humorists", "humpbacks", "hunchback", "hundredth", "hungering", "hungriest", "hunkering", "hurricane", "hurriedly", "hurtfully", "husbanded", "husbandry", "huskiness", "hyacinths", "hydrangea", "hydrating", "hydration", "hydraulic", "hydrofoil", "hydrology", "hygienics", "hygienist", "hyperbola", "hyperbole", "hyperlink", "hypertext", "hyphenate", "hyphening", "hypnotics", "hypnotism", "hypnotist", "hypocrisy", "hypocrite", "hysterics", "ibuprofen", "idealists", "identical", "identikit", "ideograms", "ideograph", "ideologue", "idiomatic", "idolaters", "ignitions", "ignoramus", "ignorance", "ignorants", "illegally", "illegible", "illegibly", "illiberal", "illicitly", "illnesses", "illogical", "illumined", "illumines", "illusions", "imaginary", "imagining", "imbalance", "imbeciles", "imbecilic", "imbroglio", "imitating", "imitation", "imitative", "imitators", "immanence", "immatures", "immediacy", "immediate", "immensely", "immensest", "immensity", "immersing", "immersion", "immigrant", "immigrate", "imminence", "immodesty", "immolated", "immolates", "immorally", "immortals", "immovable", "immovably", "immutable", "immutably", "impacting", "impairing", "impartial", "imparting", "impassive", "impatient", "impeached", "impeaches", "impedance", "impelling", "impending", "imperfect", "imperials", "imperious", "impetuous", "impetuses", "impieties", "impinging", "impiously", "implanted", "implement", "implicate", "imploding", "imploring", "implosion", "impolitic", "important", "importers", "importing", "importune", "impostors", "imposture", "impotence", "impounded", "imprecise", "impressed", "impresses", "imprinted", "imprisons", "impromptu", "improving", "improvise", "imprudent", "impudence", "impugning", "impulsing", "impulsion", "impulsive", "inability", "inamorata", "inanimate", "inanities", "inaudible", "inaudibly", "inaugural", "inbounded", "incapable", "incarnate", "incensing", "incentive", "inception", "incessant", "inchoated", "inchoates", "incidence", "incidents", "incipient", "incisions", "inclement", "inclining", "including", "inclusion", "inclusive", "incognito", "incorrect", "increased", "increases", "increment", "incubated", "incubates", "incubator", "incubuses", "inculcate", "inculpate", "incumbent", "incurable", "incurably", "incurious", "incurring", "incursion", "indecency", "indelible", "indelibly", "indemnify", "indemnity", "indenting", "indenture", "indicated", "indicates", "indicator", "indicting", "indigence", "indigents", "indignant", "indignity", "indolence", "inductees", "inducting", "induction", "inductive", "indulgent", "indulging", "inebriate", "ineffable", "ineffably", "inelastic", "inelegant", "ineptness", "inertness", "inexperts", "infantile", "infatuate", "infecting", "infection", "inference", "inferiors", "inferring", "infertile", "infesting", "infielder", "infilling", "infirmary", "infirmity", "inflaming", "inflating", "inflation", "inflected", "inflexion", "inflicted", "influence", "influenza", "informant", "informers", "informing", "infringed", "infringes", "infuriate", "infusions", "ingenious", "ingenuity", "ingenuous", "ingesting", "ingestion", "inglenook", "ingrained", "ingresses", "ingrowing", "inhabited", "inhalants", "inhalator", "inherited", "inheritor", "inhibited", "inhumanly", "initially", "initiated", "initiates", "initiator", "injecting", "injection", "injectors", "injurious", "injustice", "inkstands", "innermost", "innkeeper", "innocence", "innocents", "innocuous", "innovated", "innovates", "innovator", "innuendos", "inoculate", "inorganic", "inpatient", "inputting", "inquirers", "inquorate", "inscribed", "inscribes", "insensate", "inserting", "insertion", "insetting", "insidious", "insignias", "insincere", "insinuate", "insipidly", "insistent", "insisting", "insolence", "insoluble", "insolvent", "insomniac", "inspected", "inspector", "inspiring", "installed", "instanced", "instances", "instantly", "instigate", "instilled", "instincts", "institute", "instructs", "insulated", "insulates", "insulator", "insulting", "insurance", "insurgent", "intaglios", "integrals", "integrate", "integrity", "intellect", "intendeds", "intending", "intensely", "intensest", "intensify", "intensity", "intensive", "intention", "interacts", "interbred", "intercede", "intercept", "intercity", "intercoms", "interdict", "interests", "interface", "interfere", "interiors", "interject", "interlace", "interlard", "interlink", "interlock", "interlude", "interment", "internals", "internees", "interning", "internist", "interplay", "interpose", "interpret", "interring", "interrupt", "intersect", "intervals", "intervene", "interview", "interwove", "intestate", "intestine", "intimated", "intimates", "intranets", "intricacy", "intricate", "intrigued", "intrigues", "intrinsic", "introduce", "introvert", "intruders", "intruding", "intrusion", "intrusive", "intuiting", "intuition", "intuitive", "inundated", "inundates", "invalided", "invariant", "invasions", "invective", "inveighed", "inveigled", "inveigles", "inventing", "invention", "inventive", "inventors", "inventory", "inversely", "inversion", "inverting", "investing", "investors", "invidious", "inviolate", "invisible", "invisibly", "invoicing", "involving", "irascible", "irascibly", "irateness", "ironclads", "ironstone", "irradiate", "irregular", "irrigated", "irrigates", "irritable", "irritably", "irritants", "irritated", "irritates", "irruption", "isinglass", "islanders", "isolating", "isolation", "isometric", "isosceles", "isotherms", "isotropic", "isthmuses", "itchiness", "iterating", "iteration", "iterative", "iterators", "itinerant", "itinerary", "jabberers", "jabbering", "jackasses", "jackboots", "jackknife", "jaggedest", "jailbirds", "jailbreak", "jailhouse", "jalousies", "jamborees", "japanning", "jaundiced", "jaundices", "jauntiest", "jawboning", "jaywalked", "jaywalker", "jealously", "jeeringly", "jellybean", "jellyfish", "jeremiads", "jerkiness", "jerkwater", "jeroboams", "jerrycans", "jetliners", "jettisons", "jewelries", "jiggering", "jigsawing", "jingoists", "jitterbug", "jitterier", "jobshares", "jobsworth", "jockeying", "jockstrap", "jocularly", "jocundity", "jolliness", "journeyed", "joviality", "joyfuller", "joylessly", "joyridden", "joyriders", "joyriding", "joysticks", "juddering", "judgeship", "judiciary", "judicious", "juiciness", "jukeboxes", "julienned", "juliennes", "jumpiness", "jumpsuits", "junctions", "junctures", "junketing", "junkyards", "juridical", "jurywoman", "jurywomen", "justified", "justifies", "juveniles", "juxtapose", "kamikazes", "kangaroos", "keelhauls", "keepsakes", "kerchiefs", "kerfuffle", "keyboards", "keynoting", "keystones", "keystroke", "kibbutzes", "kibbutzim", "kibitzers", "kibitzing", "kickbacks", "kickstand", "kidnapped", "kidnapper", "kielbasas", "killdeers", "kilobytes", "kilocycle", "kilohertz", "kilowatts", "kindliest", "kinematic", "kingliest", "kingmaker", "kinswoman", "kinswomen", "kippering", "kissogram", "kitchened", "kittenish", "klutziest", "knackered", "knapsacks", "knighting", "knobbiest", "knockdown", "knockoffs", "knockouts", "knotholes", "knottiest", "knowinger", "knowingly", "knowledge", "knuckling", "kookiness", "koshering", "kowtowing", "kvetching", "laborious", "laburnums", "labyrinth", "lacerated", "lacerates", "lachrymal", "lacquered", "lactating", "lactation", "laddering", "ladybirds", "ladyships", "lagniappe", "lambasted", "lambastes", "lambskins", "lambswool", "lamebrain", "lamenting", "laminated", "laminates", "lampblack", "lamplight", "lampooned", "lampposts", "lampshade", "landfalls", "landfills", "landlords", "landmarks", "landmines", "landowner", "landscape", "landslide", "landslips", "landwards", "languages", "languidly", "lankiness", "larboards", "larcenies", "larcenous", "largeness", "lariating", "larkspurs", "lassitude", "lastingly", "latchkeys", "latecomer", "lateraled", "laterally", "lathering", "latitudes", "laudatory", "laughable", "laughably", "launchers", "launching", "laundered", "launderer", "laundress", "laundries", "laureated", "laureates", "lavenders", "lavishest", "lavishing", "lawgivers", "lawlessly", "lawmakers", "lawnmower", "laxatives", "layabouts", "laypeople", "layperson", "lazybones", "leafleted", "leapfrogs", "leaseback", "leasehold", "leastwise", "leavening", "lecherous", "lecturers", "lecturing", "ledgering", "leftovers", "leftwards", "legalisms", "legations", "legendary", "legionary", "legislate", "legwarmer", "leisurely", "leitmotif", "leitmotiv", "lemonades", "lengthens", "lengthier", "lengthily", "leniently", "lessening", "lethargic", "letterbox", "lettering", "leucotomy", "leukocyte", "levelness", "leveraged", "leverages", "leviathan", "levitated", "levitates", "liability", "libations", "liberally", "liberated", "liberates", "liberator", "liberties", "libertine", "librarian", "libraries", "librettos", "licensees", "licorices", "lifebelts", "lifeblood", "lifeboats", "lifeforms", "lifeguard", "lifelines", "lifesaver", "lifespans", "lifestyle", "lifetimes", "lifeworks", "ligaments", "ligatured", "ligatures", "lightened", "lightness", "lightning", "lightship", "likeliest", "limberest", "limbering", "limelight", "limericks", "limescale", "limestone", "limitings", "limitless", "limousine", "limpidity", "linchpins", "lineament", "linearity", "lingerers", "lingering", "linguists", "liniments", "lionesses", "lipsticks", "liquefied", "liquefies", "liqueured", "liquidate", "liquidity", "liquorice", "liquoring", "listeners", "listening", "literally", "literates", "litigants", "litigated", "litigates", "litigator", "litigious", "litterbug", "littering", "littorals", "liturgies", "liveliest", "livelongs", "livestock", "loanwords", "loathings", "loathsome", "lobbyists", "lobstered", "locations", "locksmith", "locoweeds", "locutions", "lodestars", "lodestone", "loftiness", "logarithm", "logically", "logicians", "logistics", "logotypes", "loincloth", "loiterers", "loitering", "lollipops", "lolloping", "loneliest", "lonesomes", "longboats", "longevity", "longhairs", "longhorns", "longhouse", "longingly", "longitude", "longueurs", "lookalike", "loopholes", "looseness", "loosening", "loquacity", "lordliest", "lordships", "lorgnette", "lotteries", "loudliest", "loudmouth", "lousiness", "lovebirds", "loveliest", "lowercase", "lowlander", "lowliness", "loyalists", "loyalties", "lubricant", "lubricate", "lucidness", "luckiness", "lucrative", "ludicrous", "lullabies", "lumbering", "lumberman", "lumbermen", "lumpiness", "luncheons", "lunchroom", "lunchtime", "luridness", "lustfully", "lustiness", "luxuriant", "luxuriate", "luxurious", "lychgates", "lymphatic", "lymphomas", "lynchings", "lyrebirds", "lyrically", "lyricists", "macadamia", "macaroons", "macerated", "macerates", "machinery", "machining", "machinist", "mackerels", "mackinaws", "macrocosm", "maddening", "madhouses", "madrigals", "maelstrom", "magazines", "magically", "magicians", "magicking", "magnesium", "magnetics", "magnetism", "magnified", "magnifier", "magnifies", "magnitude", "magnolias", "maharajah", "maharanis", "maharishi", "mailboxes", "mailshots", "mainframe", "mainlands", "mainlined", "mainlines", "mainmasts", "mainsails", "mainstays", "maintains", "majesties", "majordomo", "majorette", "makeovers", "makeshift", "malachite", "maladroit", "malformed", "malicious", "malignant", "maligning", "malignity", "malingers", "malleable", "maltreats", "mammalian", "mammogram", "manacling", "mandarins", "mandating", "mandatory", "mandibles", "mandolins", "mandrakes", "mandrills", "manganese", "mangetout", "mangroves", "manhandle", "manically", "manicured", "manicures", "manifesto", "manifests", "manifolds", "manliness", "mannequin", "mannerism", "mannishly", "mantillas", "marathons", "marauders", "marauding", "margarine", "margarita", "marginals", "mariachis", "marigolds", "marijuana", "marinaded", "marinades", "marinated", "marinates", "markdowns", "marketeer", "marketers", "marketing", "marmalade", "marmosets", "marooning", "marquetry", "marquises", "marriages", "marrowing", "marshaled", "marshiest", "marshland", "marsupial", "martinets", "martyrdom", "martyring", "mascaraed", "masculine", "masochism", "masochist", "massacred", "massacres", "massaging", "masseuses", "massively", "masterful", "mastering", "mastheads", "masticate", "mastodons", "matchbook", "matchless", "matchwood", "materials", "maternity", "matriarch", "matricide", "matrimony", "mattering", "maundered", "mausoleum", "mavericks", "mawkishly", "maxillary", "maximally", "mayflower", "mayoralty", "mealtimes", "meandered", "meanwhile", "measliest", "measuring", "meatballs", "mechanics", "mechanism", "medallion", "mediating", "mediation", "mediators", "medically", "medicated", "medicates", "medicinal", "medicines", "meditated", "meditates", "megabucks", "megabytes", "megacycle", "megahertz", "megaliths", "megaphone", "megastars", "megawatts", "melanomas", "mellowest", "mellowing", "melodious", "melodrama", "meltdowns", "membranes", "memorable", "memorably", "memorials", "memsahibs", "menagerie", "mendacity", "mendicant", "menopause", "menstrual", "mentality", "mentioned", "mentoring", "mercenary", "merchants", "merciless", "mercurial", "merganser", "meridians", "meringues", "merriment", "merriness", "mescaline", "mesmerism", "mesquites", "messaging", "messenger", "messianic", "messieurs", "messiness", "metabolic", "metacarpi", "metalwork", "metaphors", "meteorite", "meteoroid", "methadone", "methought", "metronome", "mezzanine", "microchip", "microcode", "microcosm", "microfilm", "microwave", "middleman", "middlemen", "midpoints", "midstream", "midsummer", "midwifery", "midwifing", "midwinter", "mightiest", "migraines", "migrating", "migration", "migratory", "mildewing", "mileposts", "milestone", "militancy", "militants", "militated", "militates", "milkiness", "milkmaids", "milkshake", "milkweeds", "millibars", "milliners", "millinery", "millionth", "millipede", "millponds", "millraces", "millstone", "milometer", "mimicking", "mimicries", "mincemeat", "mindfully", "minefield", "miniature", "minibikes", "minibuses", "minimally", "miniskirt", "ministers", "minstrels", "minuscule", "minuteman", "minutemen", "mirroring", "mirthless", "misbehave", "miscalled", "mischance", "mischiefs", "miscounts", "miscreant", "misdirect", "misdoings", "miserable", "miserably", "misfiring", "misfitted", "misgiving", "misgovern", "misguided", "misguides", "mishandle", "mishapped", "misinform", "misjudged", "misjudges", "mislaying", "mismanage", "misnaming", "misnomers", "misplaced", "misplaces", "misplayed", "misprints", "misquoted", "misquotes", "misreport", "misruling", "misshapen", "missilery", "missioned", "misspells", "misspends", "misstated", "misstates", "mistaking", "mistiming", "mistiness", "mistletoe", "mistreats", "mistrials", "mistrusts", "mistyping", "mitigated", "mitigates", "mnemonics", "moccasins", "mockeries", "mockingly", "moderated", "moderates", "moderator", "modernest", "modernism", "modernist", "modernity", "modestest", "modifiers", "modifying", "modulated", "modulates", "modulator", "moistened", "moistness", "moldering", "moldiness", "molecular", "molecules", "molehills", "molesters", "molesting", "mollified", "mollifies", "momentary", "momentous", "monarchic", "monastery", "monastics", "moneybags", "mongering", "mongolism", "mongooses", "monitored", "monkeying", "monograms", "monograph", "monoliths", "monologue", "monomania", "monoplane", "monorails", "monotoned", "monotones", "monotonic", "monoxides", "monsignor", "monstrous", "monthlies", "monuments", "moodiness", "moonbeams", "moonlight", "moonscape", "moonshine", "moonshots", "moonstone", "moorlands", "moralists", "moralling", "morbidity", "mordantly", "morphemed", "morphemes", "mortality", "mortaring", "mortgaged", "mortgagee", "mortgages", "mortgagor", "mortician", "mortified", "mortifies", "mortising", "mothballs", "mothering", "motioning", "motivated", "motivates", "motivator", "motocross", "motorbike", "motorboat", "motorcade", "motorcars", "motorists", "motorways", "mouldered", "mountains", "mountings", "mousetrap", "mousiness", "moussakas", "mouthfuls", "mouthwash", "movements", "moviegoer", "muckraked", "muckraker", "muckrakes", "muddiness", "mudguards", "mudslides", "mugginess", "mulattoes", "muleteers", "mullioned", "multiples", "multiplex", "multitude", "mummified", "mummifies", "mundanely", "municipal", "munitions", "muralists", "murderers", "murderess", "murdering", "murderous", "murkiness", "murmuring", "muscatels", "muscleman", "musclemen", "mushiness", "mushrooms", "musicales", "musically", "musicians", "musicking", "musketeer", "muskiness", "muskmelon", "mustering", "mustiness", "mutations", "mutilated", "mutilates", "mutineers", "mutinying", "muttering", "mutuality", "muzziness", "mysteried", "mysteries", "mysticism", "mystified", "mystifies", "mythology", "nailbrush", "nakedness", "nameplate", "namesakes", "napalming", "narcissus", "narcotics", "narrating", "narration", "narrative", "narrators", "narrowest", "narrowing", "nastiness", "nationals", "nattering", "naturally", "naturists", "naughtier", "naughties", "naughtily", "nauseated", "nauseates", "navigable", "navigated", "navigates", "navigator", "naysayers", "nearliest", "neatening", "necessary", "necessity", "neckbands", "necklaced", "necklaces", "necklines", "nectarine", "neediness", "nefarious", "negations", "negatived", "negatives", "neglected", "negligees", "negligent", "negotiate", "nematodes", "neodymium", "neolithic", "neologism", "neophytes", "nephritis", "neptunium", "nerveless", "nervously", "nestlings", "networked", "neuralgia", "neuralgic", "neurology", "neurotics", "neutering", "neutrally", "neutrinos", "nevermore", "newcomers", "newlyweds", "newsagent", "newscasts", "newsflash", "newsgroup", "newshound", "newspaper", "newsprint", "newsreels", "newsrooms", "newsstand", "nicknamed", "nicknames", "niggarded", "niggardly", "nigglings", "nightcaps", "nightclub", "nightfall", "nightgown", "nighthawk", "nightlife", "nightlong", "nightmare", "nightspot", "nighttime", "nightwear", "nihilists", "nineteens", "ninetieth", "nippering", "nitpicked", "nitpicker", "nitrating", "nobleness", "nocturnal", "nocturnes", "noiseless", "noisiness", "nominally", "nominated", "nominates", "nonentity", "nonevents", "nonexempt", "nonliving", "nonmember", "nonpareil", "nonpluses", "nonprofit", "nonsexist", "nonsmoker", "nonverbal", "nonvoting", "nonwhites", "normality", "normative", "northeast", "northerly", "northward", "northwest", "nosebleed", "nosedived", "nosedives", "nostalgia", "nostalgic", "notations", "notebooks", "notepaper", "notifying", "notoriety", "notorious", "nourished", "nourishes", "novelette", "novelists", "novelties", "novitiate", "nuisances", "nullified", "nullifies", "numbering", "numerated", "numerates", "numerator", "numerical", "numskulls", "nunneries", "nursemaid", "nurseries", "nurturing", "nuthouses", "nutmegged", "nutrients", "nutriment", "nutrition", "nutritive", "nutshells", "nuttiness", "oarswoman", "oarswomen", "obdurated", "obdurates", "obedience", "obeisance", "obfuscate", "objecting", "objection", "objective", "objectors", "oblations", "obligated", "obligates", "obliquely", "oblivious", "obnoxious", "obscenely", "obscenest", "obscenity", "obscurely", "obscurest", "obscuring", "obscurity", "obsequies", "observant", "observers", "observing", "obsessing", "obsession", "obsessive", "obsoleted", "obsoletes", "obstacles", "obstetric", "obstinacy", "obstinate", "obstructs", "obtaining", "obtruding", "obtrusive", "obviating", "obviously", "occasions", "occluding", "occlusion", "occultist", "occupancy", "occupants", "occupiers", "occupying", "occurring", "octagonal", "octopuses", "odometers", "offenders", "offending", "offerings", "offertory", "officials", "officiate", "officious", "offloaded", "offshoots", "offspring", "offstages", "oilcloths", "oilfields", "ointments", "oleanders", "olfactory", "oligarchs", "oligarchy", "ombudsman", "ombudsmen", "ominously", "omissions", "omnibuses", "omnivores", "onionskin", "onlookers", "onrushing", "onsetting", "onslaught", "operatics", "operating", "operation", "operative", "operators", "operettas", "opponents", "opportune", "opposites", "oppressed", "oppresses", "oppressor", "optically", "opticians", "optimists", "optionals", "optioning", "optometry", "orangeade", "orangutan", "oratories", "oratorios", "orchestra", "ordaining", "orderings", "orderlies", "ordinance", "organelle", "organisms", "organists", "orgiastic", "orientals", "orientate", "orienting", "originals", "originate", "ornaments", "orneriest", "orphanage", "orphaning", "orthodoxy", "oscillate", "ossifying", "osteopath", "ostracism", "ostriches", "otherness", "otherwise", "ourselves", "outbounds", "outbreaks", "outbroken", "outbursts", "outermost", "outerwear", "outfacing", "outfields", "outfitted", "outfitter", "outflanks", "outfoxing", "outgoings", "outgrowth", "outgunned", "outhouses", "outlasted", "outlawing", "outlaying", "outlining", "outliving", "outlooked", "outnumber", "outpacing", "outplayed", "outpoints", "outputted", "outraging", "outranked", "outriders", "outrigger", "outshines", "outsiders", "outskirts", "outsmarts", "outsource", "outspoken", "outspread", "outstayed", "outstrips", "outvoting", "outwardly", "outweighs", "outwitted", "outworker", "ovenproof", "overacted", "overawing", "overbears", "overbites", "overblown", "overboard", "overbooks", "overborne", "overcasts", "overcoats", "overcomes", "overcooks", "overcrowd", "overdoing", "overdosed", "overdoses", "overdraft", "overdrawn", "overdraws", "overdress", "overdrive", "overeager", "overeaten", "overflies", "overflown", "overflows", "overgrown", "overgrows", "overhands", "overhangs", "overhauls", "overheads", "overheard", "overhears", "overheats", "overjoyed", "overkills", "overladen", "overlands", "overloads", "overlooks", "overlords", "overlying", "overnight", "overplays", "overpower", "overprice", "overprint", "overrated", "overrates", "overreach", "overreact", "overrides", "overruled", "overrules", "overseers", "oversells", "oversexed", "overshoes", "overshoot", "oversight", "oversizes", "oversleep", "overslept", "overspend", "overspent", "overspill", "overstate", "overstays", "oversteps", "overstock", "overtaken", "overtakes", "overtaxed", "overtaxes", "overthrew", "overthrow", "overtimes", "overtired", "overtires", "overtones", "overtures", "overturns", "overusing", "overvalue", "overviews", "overwhelm", "overworks", "overwrite", "overwrote", "oviparous", "ovulating", "ovulation", "ownership", "oxidation", "oxygenate", "pacemaker", "pachyderm", "pacifiers", "pacifists", "pacifying", "packaging", "paddocked", "padlocked", "paederast", "pageantry", "paginated", "paginates", "painfully", "paintball", "painterly", "paintings", "paintwork", "palatable", "palavered", "palefaces", "palisades", "palladium", "palliated", "palliates", "palmettos", "palmistry", "palominos", "palpating", "palpation", "palpitate", "paltriest", "pampering", "pamphlets", "panatella", "pancaking", "pandemics", "panderers", "pandering", "panegyric", "panelists", "panellist", "panhandle", "panickier", "panicking", "panoplies", "panoramas", "panoramic", "pantheism", "pantheist", "pantheons", "pantomime", "pantsuits", "pantyhose", "paparazzi", "paparazzo", "paperback", "paperbark", "paperboys", "paperclip", "papergirl", "paperless", "paperwork", "parabling", "parabolas", "parabolic", "parachute", "paradigms", "paradises", "paradoxes", "paragraph", "parakeets", "paralegal", "parallels", "paralysis", "paralytic", "paramecia", "paramedic", "parameter", "paramount", "paramours", "paranoiac", "paranoids", "parasites", "parasitic", "paratroop", "parboiled", "parchment", "pardoning", "parentage", "parenting", "parlaying", "parleying", "parochial", "parodists", "parodying", "paroxysms", "parqueted", "parquetry", "parricide", "parroting", "parsimony", "parsonage", "partakers", "partaking", "parterres", "partially", "particles", "partisans", "partition", "partitive", "partnered", "partridge", "passbooks", "passenger", "passersby", "passioned", "passively", "passivise", "passivity", "passivize", "passports", "passwords", "pastiches", "pastilles", "pastorals", "pastorate", "pasturage", "pasturing", "patchiest", "patchouli", "patchwork", "patenting", "paternity", "pathogens", "pathology", "patienter", "patiently", "patriarch", "patrician", "patricide", "patrimony", "patriotic", "patrolled", "patrolman", "patrolmen", "patronage", "patroness", "pattering", "patterned", "paunchier", "paunching", "pauperism", "pavements", "pavilions", "pawnshops", "paychecks", "paymaster", "payphones", "peaceable", "peaceably", "peacetime", "pearliest", "peasantry", "pebbliest", "peccaries", "pectorals", "pecuniary", "pedagogic", "pedagogue", "pederasts", "pederasty", "pedestals", "pedicured", "pedicures", "pedigreed", "pedigrees", "pediments", "pedometer", "peepholes", "peepshows", "peeresses", "peevishly", "pekineses", "pekingese", "pelleting", "penalties", "penancing", "penchants", "pendulous", "pendulums", "penetrate", "penfriend", "peninsula", "penitence", "penitents", "penknives", "penlights", "penniless", "pensioned", "pensioner", "pensively", "pentagons", "penthouse", "penumbras", "penurious", "peppering", "pepperoni", "perceived", "perceives", "perchance", "percolate", "perdition", "peregrine", "perennial", "perfected", "perfecter", "perfectly", "perfidies", "perforate", "performed", "performer", "perfumery", "perfuming", "perhapses", "perihelia", "perimeter", "perinatal", "periphery", "periscope", "perishers", "perishing", "perjurers", "perjuries", "perjuring", "perkiness", "permanent", "permeable", "permeated", "permeates", "permitted", "permuting", "peroxided", "peroxides", "perpetual", "perplexed", "perplexes", "persecute", "persevere", "persimmon", "persisted", "personage", "personals", "personify", "personnel", "perspired", "perspires", "persuaded", "persuades", "pertained", "pertinent", "perturbed", "pertussis", "pervading", "pervasive", "perverted", "pessaries", "pessimism", "pessimist", "pestering", "pesticide", "pestilent", "petitions", "petrified", "petrifies", "petroleum", "petrology", "petticoat", "pettifogs", "pettiness", "petulance", "phagocyte", "phalanges", "phalanxes", "phantasms", "pharynges", "pheasants", "phenomena", "phenotype", "pheromone", "phialling", "philander", "philately", "philippic", "philology", "phlebitis", "phoenixes", "phonecard", "phonemics", "phonetics", "phoniness", "phonology", "phosphate", "phosphors", "photocell", "photocopy", "photostat", "phrasings", "physicals", "physician", "physicist", "physicked", "physiques", "pickaxing", "pickerels", "picketers", "picketing", "picnicked", "picnicker", "pictorial", "picturing", "piecemeal", "piecework", "piercings", "pigeoning", "piggeries", "piggyback", "pigheaded", "pigmented", "pilasters", "pilchards", "pilferers", "pilfering", "pillaging", "pillboxes", "pillioned", "pilloried", "pillories", "pillowing", "pimientos", "pimpernel", "pimpliest", "pinafores", "pineapple", "pinewoods", "pinioning", "pinnacles", "pinpoints", "pinpricks", "pinstripe", "pinwheels", "pioneered", "piousness", "pipelines", "pipsqueak", "piquantly", "piratical", "pirouette", "pistachio", "pitchfork", "piteously", "pitifully", "pittances", "pituitary", "pityingly", "pizzerias", "pizzicati", "pizzicato", "placarded", "placating", "placation", "placatory", "placement", "placental", "placentas", "placidity", "plainness", "plainsong", "plaintiff", "plaintive", "planeload", "planetary", "plannings", "plantains", "plantings", "plastered", "plasterer", "plateaued", "platefuls", "platelets", "platforms", "platitude", "platooned", "plausible", "plausibly", "playacted", "playbacks", "playbills", "playfully", "playgoers", "playgroup", "playhouse", "playmates", "playrooms", "plaything", "pleadings", "pleasings", "pleasured", "pleasures", "plebeians", "plectrums", "plenaries", "plenitude", "plenteous", "plentiful", "plighting", "plimsolls", "ploddings", "plottered", "pluckiest", "plugholes", "plummeted", "plumpness", "plundered", "plunderer", "pluralism", "pluralist", "plurality", "plushiest", "plutocrat", "plutonium", "pneumatic", "pneumonia", "pocketful", "pocketing", "pockmarks", "poetesses", "pogroming", "poignancy", "pointedly", "pointiest", "pointless", "poisoners", "poisoning", "poisonous", "poleaxing", "polemical", "polestars", "policeman", "policemen", "polishers", "polishing", "politburo", "politesse", "political", "politicos", "pollinate", "polliwogs", "pollsters", "pollutant", "polluters", "polluting", "pollution", "polonaise", "poltroons", "polyandry", "polyester", "polyglots", "polygonal", "polygraph", "polymaths", "polymeric", "polyphony", "polythene", "pomanders", "pompadour", "pomposity", "pompously", "pondering", "ponderous", "pontooned", "ponytails", "poolsides", "poorhouse", "popinjays", "poppadoms", "poppycock", "populaces", "popularly", "populated", "populates", "populists", "porcelain", "porcupine", "porpoised", "porpoises", "porringer", "portables", "portaging", "portended", "portering", "portfolio", "portholes", "porticoes", "portioned", "portliest", "portraits", "portrayal", "portrayed", "positions", "positiver", "positives", "positrons", "possessed", "possesses", "possessor", "possibler", "possibles", "postboxes", "postcards", "postcodes", "postdated", "postdates", "posterior", "posterity", "posthaste", "postludes", "postmarks", "postnatal", "postponed", "postpones", "postulate", "posturing", "postwoman", "postwomen", "potassium", "potboiler", "potentate", "potential", "potholder", "potholers", "potholing", "potpourri", "potsherds", "potteries", "pottering", "pottiness", "poulticed", "poultices", "poundings", "powdering", "powerboat", "powerless", "powwowing", "practical", "pragmatic", "prankster", "pratfalls", "prattlers", "prattling", "preachers", "preachier", "preaching", "preambled", "preambles", "precedent", "preceding", "preceptor", "precincts", "precipice", "precisely", "precisest", "precision", "precluded", "precludes", "precocity", "precooked", "precursor", "predating", "predators", "predatory", "predicate", "predicted", "predictor", "predigest", "preempted", "preexists", "prefabbed", "prefacing", "prefatory", "preferred", "prefigure", "prefixing", "pregnancy", "preheated", "prejudged", "prejudges", "prejudice", "premature", "premiered", "premieres", "premising", "preoccupy", "preordain", "prepacked", "preparing", "prepaying", "preppiest", "prerecord", "presaging", "preschool", "prescient", "prescribe", "presences", "presented", "presenter", "presently", "preserved", "preserver", "preserves", "preshrank", "preshrink", "preshrunk", "president", "presiding", "presidium", "pressings", "pressured", "pressures", "presuming", "pretended", "pretender", "preterits", "pretexted", "prettiest", "prettying", "prevailed", "prevalent", "prevented", "previewed", "previewer", "priceless", "pricklier", "prickling", "priestess", "primaries", "primarily", "primitive", "primrosed", "primroses", "principal", "principle", "printable", "printings", "printouts", "prismatic", "prisoners", "prisoning", "prissiest", "privateer", "privately", "privatest", "privation", "privilege", "proactive", "probables", "probating", "probation", "probosces", "proboscis", "procedure", "proceeded", "processed", "processes", "processor", "proclaims", "procreate", "proctored", "procurers", "procuring", "prodigals", "prodigies", "producers", "producing", "profanely", "profaning", "profanity", "professed", "professes", "professor", "proffered", "profiling", "profiteer", "profiting", "profusely", "profusion", "prognoses", "prognosis", "prohibits", "projected", "projector", "prolapsed", "prolapses", "prolixity", "prologues", "prolonged", "promenade", "prominent", "promising", "promoters", "promoting", "promotion", "prompters", "promptest", "prompting", "proneness", "pronghorn", "pronounce", "proofread", "propagate", "propelled", "propeller", "properest", "prophetic", "proponent", "proposals", "proposers", "proposing", "propounds", "propriety", "prorating", "proscribe", "prosecute", "proselyte", "prosodies", "prospects", "prospered", "prostates", "prostrate", "protected", "protector", "protested", "protester", "protocols", "prototype", "protozoan", "protracts", "protruded", "protrudes", "provender", "provident", "providers", "providing", "provinces", "provision", "provoking", "proximate", "proximity", "prudently", "prudishly", "prurience", "psalmists", "pseudonym", "psoriasis", "psychical", "psychoses", "psychosis", "psychotic", "ptarmigan", "ptomaines", "pubescent", "publicans", "publicist", "publicity", "published", "publisher", "publishes", "puckering", "pudginess", "puerility", "puffballs", "puffiness", "pugilists", "pugnacity", "pullbacks", "pullovers", "pulmonary", "pulsating", "pulsation", "punchbags", "punchiest", "punchline", "punctuate", "punctured", "punctures", "pungently", "punishing", "puppeteer", "purchased", "purchaser", "purchases", "purebreds", "purgative", "purgatory", "purifiers", "purifying", "purloined", "purported", "purposely", "purposing", "pursuance", "purulence", "purveying", "purveyors", "pushbikes", "pushcarts", "pushchair", "pushiness", "pushovers", "pussycats", "pussyfoot", "putrefied", "putrefies", "puttering", "pyramidal", "pyramided", "pyromania", "quadrants", "quadratic", "quadrille", "quadruped", "quadruple", "quagmired", "quagmires", "quaintest", "qualified", "qualifier", "qualifies", "qualities", "quarrying", "quartered", "quarterly", "quatrains", "quavering", "quaysides", "queasiest", "queenlier", "queerness", "quenching", "querulous", "questions", "quibblers", "quibbling", "quickened", "quickfire", "quicklime", "quickness", "quicksand", "quickstep", "quiescent", "quietened", "quietness", "quietuses", "quintuple", "quirkiest", "quislings", "quivering", "quizzical", "quotation", "quotidian", "quotients", "rabbinate", "rabbiting", "racegoers", "racehorse", "racetrack", "racialism", "racialist", "racketeer", "racketing", "raconteur", "radiantly", "radiating", "radiation", "radiators", "radically", "radicchio", "radiogram", "radiology", "raggedest", "raggedier", "railcards", "railroads", "raincoats", "raindrops", "rainfalls", "rainmaker", "rainproof", "rainstorm", "rainwater", "ramblings", "ramifying", "rampaging", "rampantly", "ramrodded", "rancidity", "rancorous", "randiness", "ranginess", "ransacked", "ransoming", "rapacious", "rappelled", "rapturous", "rarefying", "raspberry", "ratcheted", "ratepayer", "ratifying", "rationale", "rationals", "rationing", "rattlings", "raucously", "raunchier", "raunchily", "ravishing", "reachable", "reactants", "reactions", "readdress", "readiness", "readjusts", "reaffirms", "realigned", "realistic", "realities", "reallying", "reanimate", "reappears", "reapplied", "reapplies", "reappoint", "rearguard", "rearrange", "rearwards", "reasoning", "reasserts", "reassigns", "reassured", "reassures", "reawakens", "rebelling", "rebellion", "rebinding", "rebooting", "rebounded", "rebuffing", "rebuttals", "rebutting", "recalling", "recanting", "recapping", "recapture", "recasting", "receipted", "receivers", "receiving", "recentest", "reception", "receptive", "receptors", "recessing", "recession", "recessive", "recharged", "recharges", "rechecked", "recipient", "reckoning", "reclaimed", "recliners", "reclining", "reclusive", "recoiling", "recollect", "recombine", "recommend", "recompile", "reconcile", "recondite", "reconnect", "reconquer", "reconvene", "recopying", "recorders", "recording", "recounted", "recouping", "recovered", "recreants", "recreated", "recreates", "recruited", "recruiter", "rectangle", "rectified", "rectifier", "rectifies", "rectitude", "rectories", "recumbent", "recurrent", "recurring", "recursion", "recursive", "recycling", "redbreast", "reddening", "redeemers", "redeeming", "redefined", "redefines", "redeploys", "redesigns", "redevelop", "redheaded", "redirects", "redolence", "redoubled", "redoubles", "redoubted", "redounded", "redrafted", "redrawing", "redressed", "redresses", "reducible", "reduction", "reductive", "redundant", "reeducate", "reelected", "reemerged", "reemerges", "reenacted", "reenlists", "reentered", "reentries", "reexamine", "refashion", "refectory", "referable", "reference", "referrals", "referring", "refilling", "refinance", "refitting", "reflating", "reflation", "reflected", "reflector", "reflexive", "refocused", "refocuses", "reforests", "reformers", "reforming", "reformist", "refracted", "refrained", "refreshed", "refresher", "refreshes", "refulgent", "refunding", "refurbish", "refurnish", "refutable", "regaining", "regarding", "regencies", "regicides", "regiments", "registers", "registrar", "regressed", "regresses", "regretful", "regretted", "regrouped", "regularly", "regulated", "regulates", "regulator", "rehabbing", "rehashing", "rehearsal", "rehearsed", "rehearses", "reheating", "rehousing", "reimburse", "reimposed", "reimposes", "reinforce", "reinserts", "reinstate", "reinvents", "reinvests", "reissuing", "reiterate", "rejecting", "rejection", "rejiggers", "rejigging", "rejoicing", "rejoinder", "rejoining", "rekindled", "rekindles", "relapsing", "relations", "relatives", "relaxants", "relearned", "releasing", "relegated", "relegates", "relenting", "relevance", "relevancy", "reliables", "relieving", "religions", "religious", "reliquary", "relishing", "reloading", "relocated", "relocates", "reluctant", "remainder", "remaining", "remanding", "remarking", "remarried", "remarries", "remasters", "rematches", "remedying", "remembers", "reminders", "reminding", "reminisce", "remission", "remitting", "remolding", "remoulded", "remounted", "removable", "renascent", "rendering", "rendition", "renegaded", "renegades", "renewable", "renounced", "renounces", "renovated", "renovates", "renovator", "renowning", "renumbers", "reopening", "reordered", "repackage", "repainted", "repairers", "repairing", "repairman", "repairmen", "reparteed", "repartees", "repasting", "repayable", "repayment", "repealing", "repeaters", "repeating", "repellent", "repelling", "repentant", "repenting", "repertory", "rephrased", "rephrases", "replacing", "replaying", "replenish", "repleting", "repletion", "replicate", "reportage", "reporters", "reporting", "reposeful", "repossess", "reprehend", "represent", "repressed", "represses", "reprieved", "reprieves", "reprimand", "reprinted", "reprisals", "reprising", "reprobate", "reprocess", "reproduce", "reproofed", "reproving", "reptilian", "republics", "republish", "repudiate", "repugnant", "repulsing", "repulsion", "repulsive", "reputable", "reputably", "reputedly", "requested", "requester", "requiring", "requisite", "requiting", "rereading", "rerouting", "rerunning", "rescinded", "reselling", "resembled", "resembles", "resentful", "resenting", "reserving", "reservist", "reservoir", "resetting", "resettled", "resettles", "reshaping", "reshuffle", "residence", "residency", "residents", "residuals", "resigning", "resilient", "resistant", "resisters", "resisting", "resistors", "resitting", "resoluter", "resolutes", "resolving", "resonance", "resonated", "resonates", "resonator", "resorting", "resounded", "resourced", "resources", "respected", "respecter", "respelled", "respiring", "responded", "responses", "restarted", "restating", "restfully", "restively", "restocked", "restorers", "restoring", "restrains", "restraint", "restricts", "restrooms", "restudied", "restudies", "resubmits", "resultant", "resulting", "resurface", "resurgent", "resurrect", "retailers", "retailing", "retainers", "retaining", "retaliate", "retardant", "retarding", "retelling", "retention", "retentive", "rethought", "reticence", "retooling", "retorting", "retouched", "retouches", "retracing", "retracted", "retrained", "retreaded", "retreated", "retrieval", "retrieved", "retriever", "retrieves", "retrodden", "retrofits", "returnees", "returners", "returning", "reunified", "reunifies", "reuniting", "revaluing", "revamping", "revealing", "revelries", "revenging", "reverence", "reverends", "reversals", "reversing", "reversion", "reverting", "reviewers", "reviewing", "revisions", "revisited", "revocable", "revolting", "revolvers", "revolving", "revulsion", "rewarding", "rewinding", "rewording", "reworking", "rewriting", "rewritten", "rhapsodic", "rheostats", "rheumatic", "rheumiest", "rhomboids", "rhombuses", "ricketier", "rickshaws", "ricochets", "ridgepole", "ridiculed", "ridicules", "righteous", "rightists", "rightmost", "rightness", "rightward", "rigidness", "rigmarole", "riotously", "riposting", "riskiness", "ritualism", "rivalries", "riverbeds", "riverside", "roadblock", "roadhouse", "roadshows", "roadsides", "roadsters", "roadworks", "robberies", "robustest", "rockeries", "rocketing", "rockfalls", "rockiness", "roentgens", "roguishly", "roistered", "roisterer", "rollbacks", "rollicked", "rollovers", "romancing", "romantics", "rookeries", "roominess", "roommates", "rosetting", "rosewater", "rosewoods", "rostering", "rotations", "rottenest", "rotunding", "rotundity", "roughcast", "roughened", "roughneck", "roughness", "roughshod", "roundelay", "roundness", "roundworm", "routinely", "rowdiness", "royalists", "royalties", "rubberier", "rubbished", "rubbishes", "rucksacks", "ruddiness", "rudiments", "ruffianed", "ruggedest", "ruination", "ruinously", "rumblings", "ruminants", "ruminated", "ruminates", "rummaging", "runabouts", "runaround", "rupturing", "rusticity", "rustiness", "rustlings", "rustproof", "rutabagas", "sabotaged", "sabotages", "saboteurs", "saccharin", "sackcloth", "sacrament", "sacrifice", "sacrilege", "sacristan", "saddening", "saddlebag", "safariing", "safeguard", "safetying", "safflower", "sagacious", "sagebrush", "sailboard", "sailboats", "sailcloth", "sainthood", "saintlier", "salaaming", "salacious", "salarying", "salerooms", "salesgirl", "salesroom", "salivated", "salivates", "sallowest", "saltboxes", "saltiness", "saltwater", "salvaging", "salvation", "sanctions", "sanctuary", "sandbanks", "sandblast", "sandboxes", "sandiness", "sandpaper", "sandpiper", "sandstone", "sandstorm", "sangfroid", "sanguined", "sanguines", "sapphires", "sapsucker", "sarcastic", "sardining", "sartorial", "sashaying", "sassafras", "satanists", "satellite", "satiating", "satinwood", "satirical", "satirists", "satisfied", "satisfies", "saturated", "saturates", "saturnine", "saucepans", "sauciness", "sauntered", "sawdusted", "sawhorses", "saxophone", "scabbards", "scabbiest", "scaffolds", "scalawags", "scaldings", "scaliness", "scallions", "scalloped", "scallywag", "scampered", "scantiest", "scapegoat", "scarecrow", "scarified", "scarifies", "scarleted", "scarpered", "scattered", "scavenged", "scavenger", "scavenges", "scenarios", "scheduled", "scheduler", "schedules", "schematic", "schemings", "schizoids", "schlemiel", "schlepped", "schmaltzy", "schmoozed", "schmoozer", "schmoozes", "schnauzer", "schnitzel", "scholarly", "schoolbag", "schoolboy", "schooling", "schoolkid", "schooners", "schussing", "scientist", "scimitars", "scintilla", "sclerosis", "sclerotic", "scofflaws", "scoldings", "scoliosis", "scorchers", "scorching", "scorecard", "scoreless", "scoreline", "scorpions", "scotching", "scoundrel", "scourging", "scrabbled", "scrabbles", "scraggier", "scrambled", "scrambler", "scrambles", "scramming", "scrapbook", "scrapheap", "scrapings", "scrappier", "scrapping", "scrapyard", "scratched", "scratches", "scrawling", "scrawnier", "screaming", "screeched", "screeches", "screening", "screwball", "screwiest", "scribbled", "scribbler", "scribbles", "scrimmage", "scrimping", "scrimshaw", "scripting", "scripture", "scrolling", "scrounged", "scrounger", "scrounges", "scrubbers", "scrubbier", "scrubbing", "scruffier", "scruffily", "scrumhalf", "scrummage", "scrumming", "scrumping", "scrunched", "scrunches", "scrupling", "scuffling", "scullions", "sculpting", "sculptors", "sculpture", "scummiest", "scuppered", "scurfiest", "scurrying", "scurviest", "scuttling", "scuzziest", "seaboards", "seacoasts", "seafarers", "seafaring", "seafronts", "seahorses", "seaplanes", "searchers", "searching", "searingly", "seascapes", "seashells", "seashores", "seasoning", "seaworthy", "sebaceous", "secateurs", "secession", "secluding", "seclusion", "seclusive", "secondary", "seconders", "seconding", "secretary", "secretest", "secreting", "secretion", "secretive", "sectarian", "sectional", "sectioned", "sedatives", "sedentary", "sediments", "seditious", "seduction", "seductive", "seediness", "seedlings", "seemingly", "seemliest", "seesawing", "seethings", "segmented", "segregate", "selecting", "selection", "selective", "selectman", "selectmen", "selectors", "selfishly", "sellotape", "selvaging", "semantics", "semaphore", "semblance", "semesters", "semibreve", "semicolon", "semifinal", "semiotics", "semitones", "semivowel", "senescent", "seniority", "sensation", "senseless", "sensibler", "sensibles", "sensitive", "sensually", "sentenced", "sentences", "sentience", "sentiment", "sentinels", "separable", "separated", "separates", "separator", "sequenced", "sequencer", "sequences", "sequester", "sequining", "seraglios", "serenaded", "serenades", "sergeants", "seriously", "sermoning", "serotonin", "serpented", "servanted", "serveries", "servicing", "serviette", "servility", "servitude", "setsquare", "seventeen", "seventies", "severally", "severance", "sextuplet", "sexuality", "shabbiest", "shackling", "shadiness", "shadowbox", "shadowier", "shadowing", "shaggiest", "shakedown", "shakeouts", "shakiness", "shallower", "shallowly", "shamanism", "shambling", "shambolic", "shameless", "shampooed", "shamrocks", "shanghais", "shapeless", "shapelier", "shareware", "sharkskin", "sharpened", "sharpener", "sharpness", "shattered", "sheathing", "sheepdogs", "sheepfold", "sheepskin", "sheikdoms", "shellfire", "shellfish", "sheltered", "shepherds", "shielding", "shiftiest", "shiftless", "shillings", "shimmered", "shimmying", "shinbones", "shingling", "shininess", "shinnying", "shipboard", "shiploads", "shipmates", "shipments", "shipowner", "shipshape", "shipwreck", "shipyards", "shirrings", "shirttail", "shitfaced", "shitheads", "shittiest", "shivering", "shoddiest", "shoehorns", "shoelaces", "shoemaker", "shoeshine", "shoetrees", "shootings", "shootouts", "shopfront", "shoplifts", "shoreline", "shortages", "shortcake", "shortcuts", "shortened", "shortfall", "shorthand", "shorthorn", "shortlist", "shortness", "shortstop", "shortwave", "shoulders", "shouldest", "shovelful", "showboats", "showcased", "showcases", "showdowns", "showerier", "showering", "showgirls", "showiness", "showpiece", "showplace", "showrooms", "shredders", "shredding", "shrewdest", "shrieking", "shrillest", "shrilling", "shrimpers", "shrimping", "shrinkage", "shrinking", "shrouding", "shrubbery", "shrubbier", "shrubbing", "shrugging", "shuddered", "shufflers", "shuffling", "shutdowns", "shuttered", "shuttling", "sibilants", "sickening", "sickliest", "sickrooms", "sideboard", "sideburns", "sidekicks", "sidelight", "sidelined", "sidelines", "sideshows", "sidesteps", "sideswipe", "sidetrack", "sidewalks", "sidewalls", "sightings", "sightless", "sightread", "sightseer", "signalman", "signalmen", "signatory", "signature", "signboard", "signified", "signifies", "signposts", "silencers", "silencing", "silentest", "silicates", "siliceous", "silicosis", "silkening", "silkiness", "silkworms", "silliness", "silverier", "silvering", "similarly", "simmering", "simpatico", "simpering", "simpleton", "simulacra", "simulated", "simulates", "simulator", "simulcast", "sincerely", "sincerest", "sincerity", "sinecures", "singalong", "singleton", "singsongs", "singulars", "sinkholes", "sinuously", "sinusitis", "sistering", "situating", "situation", "sixpences", "sixteenth", "sixtieths", "skedaddle", "skeletons", "sketchier", "sketchily", "sketching", "sketchpad", "skewbalds", "skewering", "skilfully", "skimpiest", "skinflint", "skinheads", "skinniest", "skintight", "skippered", "skittered", "skivvying", "skullcaps", "skydivers", "skydiving", "skyjacked", "skyjacker", "skylarked", "skylights", "skyrocket", "skywriter", "slackened", "slackness", "slagheaps", "slaloming", "slandered", "slanderer", "slangiest", "slantwise", "slaphappy", "slapstick", "slathered", "slatterns", "slaughter", "slavering", "slavishly", "sleazebag", "sleaziest", "sleekness", "sleepiest", "sleepless", "sleepover", "sleepwalk", "sleepwear", "sleetiest", "sleighing", "slenderer", "sleuthing", "slickness", "slightest", "slighting", "sliminess", "slingback", "slingshot", "slinkiest", "slipcases", "slipcover", "slipknots", "slippages", "slithered", "slivering", "slobbered", "sloppiest", "slouchier", "slouching", "sloughing", "slowcoach", "slowdowns", "slowpokes", "sluggards", "slumbered", "slumlords", "slushiest", "smallness", "smarmiest", "smartened", "smartness", "smelliest", "smilingly", "smirching", "smoggiest", "smokeless", "smokiness", "smoldered", "smooching", "smoothest", "smoothies", "smoothing", "smothered", "smudgiest", "smugglers", "smuggling", "smuttiest", "snaffling", "snakebite", "snakeskin", "snappiest", "snapshots", "snatchers", "snatching", "snazziest", "sneakiest", "snickered", "sniffiest", "sniffling", "sniftered", "snippiest", "snitching", "snobbiest", "snookered", "snoopiest", "snootiest", "snorkeled", "snorkeler", "snottiest", "snowballs", "snowboard", "snowbound", "snowdrift", "snowdrops", "snowfalls", "snowfield", "snowflake", "snowplows", "snowshoes", "snowstorm", "snowsuits", "snuffling", "snuggling", "soapboxed", "soapboxes", "soapiness", "soapstone", "soberness", "sobriquet", "sociables", "socialism", "socialist", "socialite", "societies", "sociology", "sociopath", "sodomites", "softballs", "softcover", "softeners", "softening", "softwoods", "sogginess", "sojourned", "soldering", "soldiered", "soldierly", "solecisms", "solemnest", "solemnity", "solenoids", "solicited", "solicitor", "solidness", "soliloquy", "solipsism", "solitaire", "solstices", "solutions", "sombreros", "someplace", "something", "sometimes", "somewhats", "somewhere", "somnolent", "songbirds", "songbooks", "songsters", "sonograms", "soothings", "sophistry", "sophomore", "soporific", "sorcerers", "sorceress", "soreheads", "sorrowful", "sorrowing", "sortieing", "soulfully", "soundbite", "soundings", "soundless", "soundness", "sourdough", "southeast", "southerly", "southerns", "southpaws", "southward", "southwest", "souvenirs", "sovereign", "spaceship", "spacesuit", "spacewalk", "spadefuls", "spadework", "spaghetti", "spangling", "spankings", "spareness", "spareribs", "sparingly", "sparkiest", "sparklers", "sparkling", "spasmodic", "spatially", "spattered", "speakeasy", "spearhead", "spearmint", "specialer", "specially", "specifics", "specified", "specifier", "specifies", "specimens", "speckling", "spectacle", "spectated", "spectates", "spectator", "speculate", "speechify", "speeching", "speedboat", "speediest", "speedster", "speedways", "spellbind", "spellings", "spelunker", "spherical", "spheroids", "sphincter", "spiciness", "spiderier", "spiderweb", "spiffiest", "spiffying", "spikiness", "spillages", "spillover", "spillways", "spindlier", "spindling", "spineless", "spinnaker", "spinsters", "spiriting", "spiritual", "spitballs", "spitfires", "spittoons", "splashier", "splashing", "splatters", "splatting", "splenetic", "splinters", "splinting", "splitting", "sploshing", "splotched", "splotches", "splurging", "splutters", "spokesman", "spokesmen", "spongiest", "sponsored", "spookiest", "spoonbill", "spoonfuls", "sportiest", "sportsman", "sportsmen", "spotlight", "spottiest", "spraining", "sprawling", "spreaders", "spreading", "sprightly", "springbok", "springier", "springing", "sprinkled", "sprinkler", "sprinkles", "sprinters", "sprinting", "spritzers", "spritzing", "sprockets", "sprouting", "spunkiest", "sputtered", "spymaster", "squabbing", "squabbled", "squabbles", "squaddies", "squadding", "squadrons", "squalider", "squalling", "squanders", "squashier", "squashing", "squatters", "squattest", "squatting", "squawking", "squeakier", "squeaking", "squealers", "squealing", "squeamish", "squeegeed", "squeegees", "squeezers", "squeezing", "squelched", "squelches", "squidding", "squiggled", "squiggles", "squintest", "squinting", "squirmier", "squirming", "squirrels", "squirting", "squishier", "squishing", "stabbings", "stability", "stableman", "stablemen", "staccatos", "stagehand", "staggered", "stagnated", "stagnates", "stainless", "staircase", "stairways", "stairwell", "stakeouts", "stalemate", "staleness", "stalkings", "stallions", "stalwarts", "stammered", "stammerer", "stampeded", "stampedes", "stanchest", "stanching", "stanchion", "standards", "standings", "standoffs", "standouts", "standpipe", "starboard", "starchier", "starchily", "starching", "starfruit", "stargazed", "stargazer", "stargazes", "starkness", "starlight", "starlings", "starriest", "startling", "starvings", "statehood", "stateless", "statelier", "statement", "stateroom", "stateside", "statesman", "statesmen", "statewide", "stationed", "stationer", "statistic", "statuette", "statutory", "staunched", "stauncher", "staunches", "staunchly", "steadfast", "steadiest", "steadying", "steamboat", "steamiest", "steamroll", "steamship", "steeliest", "steepened", "steepness", "stenching", "stepchild", "sterility", "sternness", "stevedore", "stewarded", "stickiest", "sticklers", "stickpins", "stickying", "stiffened", "stiffener", "stiffness", "stiflings", "stilettos", "stillborn", "stillness", "stiltedly", "stimulant", "stimulate", "stingiest", "stingrays", "stinkings", "stippling", "stipulate", "stirrings", "stitching", "stockaded", "stockades", "stockiest", "stockings", "stockists", "stockpile", "stockroom", "stockyard", "stodgiest", "stoically", "stolidest", "stolidity", "stomached", "stonewall", "stoneware", "stonework", "stonkered", "stopcocks", "stoplight", "stopovers", "stoppable", "stoppages", "stoppered", "stopwatch", "storeroom", "stormiest", "storybook", "stoutness", "stovepipe", "stowaways", "straddled", "straddles", "straggled", "straggler", "straggles", "straights", "strainers", "straining", "straitens", "straiting", "stranding", "strangely", "strangers", "strangest", "strangled", "strangler", "strangles", "strapless", "strapping", "stratagem", "strategic", "streakers", "streakier", "streaking", "streamers", "streaming", "streetcar", "strengths", "strenuous", "stressful", "stressing", "stretched", "stretcher", "stretches", "striation", "strictest", "stricture", "stridency", "strikeout", "strikings", "stringent", "stringers", "stringier", "stringing", "stripling", "strippers", "stripping", "strollers", "strolling", "strongbox", "strongest", "strongman", "strongmen", "strontium", "stroppier", "stroppily", "stropping", "structure", "struggled", "struggles", "strumming", "strumpets", "strutting", "stubbiest", "stubblier", "stubborns", "stuccoing", "studbooks", "stuffiest", "stumblers", "stumbling", "stumpiest", "stupefied", "stupefies", "stupidest", "stupidity", "sturdiest", "sturgeons", "stuttered", "stutterer", "stylishly", "stylistic", "stymieing", "subaltern", "subarctic", "subatomic", "subdivide", "subeditor", "subgroups", "subhumans", "subjected", "subjoined", "subjugate", "subleased", "subleases", "sublimate", "sublimely", "sublimest", "subliming", "sublimity", "submarine", "submerged", "submerges", "submersed", "submerses", "submitted", "submitter", "subnormal", "suborning", "subpoenas", "subscribe", "subscript", "subsidies", "subsiding", "subsisted", "subsoiled", "substance", "substrata", "substrate", "subsuming", "subsystem", "subtenant", "subtended", "subtitled", "subtitles", "subtotals", "subtracts", "suburbans", "subverted", "succeeded", "successes", "successor", "succotash", "succulent", "succumbed", "suckering", "sucklings", "suctioned", "sufferers", "suffering", "sufficing", "suffixing", "suffocate", "suffragan", "suffusing", "suffusion", "sugarcane", "sugarcoat", "sugariest", "sugarless", "suggested", "suggester", "suitcases", "sulkiness", "sullenest", "sulphates", "sulphides", "sultanate", "sultriest", "summaries", "summarily", "summation", "summerier", "summering", "summoners", "summoning", "summonsed", "summonses", "sumptuous", "sunbathed", "sunbather", "sunbathes", "sunblocks", "sunbonnet", "sunburned", "sundering", "sunfishes", "sunflower", "sunrising", "sunscreen", "sunshades", "sunstroke", "suntanned", "superbest", "superegos", "superglue", "superhero", "superiors", "supernova", "supersede", "superstar", "supervene", "supervise", "supplants", "suppliant", "suppliers", "supplying", "supported", "supporter", "supposing", "suppurate", "supremacy", "supremely", "supremest", "surceased", "surceases", "surcharge", "surfacing", "surfboard", "surfeited", "surgeries", "surliness", "surmising", "surmounts", "surpassed", "surpasses", "surplices", "surpluses", "surprised", "surprises", "surrender", "surrogacy", "surrogate", "surrounds", "surtaxing", "surtitles", "surveying", "surveyors", "survivals", "surviving", "survivors", "suspected", "suspended", "suspender", "suspicion", "sustained", "swaddling", "swaggered", "swaggerer", "swallowed", "swampiest", "swankiest", "swansongs", "swarthier", "swastikas", "swattered", "swearword", "sweatband", "sweatiest", "sweatshop", "sweatsuit", "sweepings", "sweetcorn", "sweetened", "sweetener", "sweetmeat", "sweetness", "swellhead", "swellings", "sweltered", "swiftness", "swimsuits", "swindlers", "swindling", "swingeing", "swirliest", "switching", "swooshing", "swordfish", "swordplay", "swordsman", "swordsmen", "sybarites", "sybaritic", "sycamores", "sycophant", "syllabify", "syllables", "syllabubs", "syllogism", "sylphlike", "symbioses", "symbiosis", "symbiotic", "symbolics", "symbolism", "symmetric", "symphonic", "symposium", "synagogue", "syncopate", "syndicate", "syndromes", "synergies", "synergism", "syntactic", "syntheses", "synthesis", "synthetic", "syringing", "systemics", "tableland", "tableware", "tabulated", "tabulates", "tabulator", "tacitness", "tackiness", "tactfully", "tactician", "tailbacks", "tailboard", "tailbones", "tailcoats", "tailgated", "tailgates", "taillight", "tailoring", "tailpiece", "tailpipes", "tailspins", "tailwinds", "takeaways", "takeovers", "talismans", "talkative", "tallyhoed", "tamarinds", "tamoxifen", "tampering", "tangerine", "tangibles", "tanneries", "tapeworms", "tarantula", "tardiness", "targeting", "tarmacked", "tarnished", "tarnishes", "tarpaulin", "tarragons", "tasteless", "tastiness", "tattering", "tattooing", "tattooist", "tautening", "tautology", "tawdriest", "taxidermy", "taxonomic", "taxpayers", "teachable", "teachings", "teakettle", "teammates", "teamsters", "tearaways", "teardrops", "tearfully", "teargases", "teasingly", "teaspoons", "technical", "technique", "tectonics", "tediously", "teenagers", "teetering", "telecasts", "telegenic", "telegrams", "telegraph", "telemeter", "telemetry", "teleology", "telepathy", "telephone", "telephony", "telephoto", "telesales", "telescope", "telethons", "teletypes", "televised", "televises", "tellering", "tellingly", "telltales", "temperate", "tempering", "templates", "temporary", "temptings", "temptress", "tenacious", "tenancies", "tenanting", "tenderest", "tendering", "tenements", "tenseness", "tentacles", "tentative", "tenuously", "termagant", "terminals", "terminate", "terracing", "terrapins", "terrarium", "terrified", "terrifies", "territory", "terrorism", "terrorist", "terseness", "testament", "testicles", "testified", "testifies", "testimony", "testiness", "tetchiest", "tethering", "textbooks", "textually", "thankless", "thatchers", "thatching", "thematics", "theocracy", "theoretic", "theorists", "theosophy", "therapies", "therapist", "therefore", "therefrom", "thereupon", "therewith", "thermally", "thermoses", "thesaurus", "thespians", "thickened", "thickener", "thickness", "thighbone", "thimbling", "thingummy", "thinkable", "thirstier", "thirstily", "thirsting", "thirteens", "thirtieth", "thorniest", "thousands", "thralldom", "thralling", "thrashers", "thrashing", "threading", "threatens", "threefold", "threesome", "threshers", "threshing", "threshold", "thriftier", "thriftily", "thrillers", "thrilling", "thrivings", "throatier", "throatily", "throbbing", "thronging", "throttled", "throttles", "throwaway", "throwback", "thrumming", "thrusting", "thumbnail", "thumbtack", "thundered", "thwacking", "thwarting", "ticketing", "tidemarks", "tidewater", "tiebreaks", "tightened", "tightness", "tightrope", "tightwads", "tigresses", "timeliest", "timepiece", "timescale", "timeshare", "timetable", "timpanist", "tinctured", "tinctures", "tinderbox", "tingliest", "tinkering", "tinsmiths", "tippexing", "tipsiness", "tiptoeing", "tiredness", "titillate", "titivated", "titivates", "tittering", "toadstool", "toastiest", "toboggans", "toileting", "tolerable", "tolerably", "tolerance", "tolerated", "tolerates", "tollbooth", "tollgates", "tomahawks", "tombstone", "tomorrows", "tonsorial", "tonsuring", "toolboxes", "toothache", "toothiest", "toothless", "toothpick", "toothsome", "topically", "toreadors", "tormented", "tormentor", "tornadoes", "torpedoed", "torpedoes", "torpidity", "torridest", "tortillas", "tortoises", "torturers", "torturing", "torturous", "tottering", "touchdown", "touchiest", "touchings", "touchline", "toughened", "toughness", "towelette", "towheaded", "townhouse", "townsfolk", "townships", "traceable", "traceries", "trackball", "tracksuit", "tractable", "trademark", "tradesman", "tradesmen", "tradition", "traducing", "tragedian", "tragedies", "trailered", "traipsing", "tramlines", "trampling", "transacts", "transcend", "transepts", "transfers", "transform", "transfuse", "transient", "transited", "translate", "transmits", "transmute", "transpire", "transport", "transpose", "transship", "trapdoors", "trapezing", "trapezium", "trapezoid", "trappable", "trappings", "trashcans", "trashiest", "traumatic", "travailed", "traversed", "traverses", "treachery", "treacling", "treadling", "treadmill", "treasured", "treasurer", "treasures", "treatable", "treatises", "treatment", "trellised", "trellises", "trembling", "tremulous", "trenchant", "trenchers", "trenching", "trendiest", "trialling", "triangles", "triathlon", "tribalism", "tribesman", "tribesmen", "tribunals", "tributary", "tricepses", "trickiest", "trickling", "trickster", "tricycled", "tricycles", "triennial", "trifocals", "triggered", "trillions", "trilogies", "trimarans", "trimester", "trimmings", "trinities", "triplying", "triptychs", "tripwires", "trisected", "triteness", "triumphal", "triumphed", "trivially", "trolloped", "trombones", "troopship", "trophying", "tropicals", "troubling", "trouncing", "trousseau", "truanting", "truckling", "truckload", "truculent", "trueloves", "trumpeted", "trumpeter", "truncated", "truncates", "truncheon", "trundling", "trustiest", "tubercles", "tuckering", "tumescent", "tumulting", "tunefully", "turbidity", "turbojets", "turboprop", "turbulent", "turgidity", "turmerics", "turmoiled", "turnabout", "turncoats", "turniping", "turnovers", "turnpikes", "turnround", "turnstile", "turntable", "turpitude", "turquoise", "tutorials", "twaddling", "tweediest", "twentieth", "twiddling", "twiggiest", "twinkling", "twitchier", "twitching", "twittered", "twopences", "tympanums", "typecasts", "typefaces", "typewrite", "typewrote", "typically", "typifying", "tyrannies", "tyrannous", "ulcerated", "ulcerates", "ultimated", "ultimates", "ultimatum", "ululating", "ululation", "umbilical", "umbilicus", "umbraging", "umbrellas", "umpteenth", "unabashed", "unadorned", "unadvised", "unalloyed", "unaltered", "unanimity", "unanimous", "unashamed", "unbalance", "unbarring", "unbeknown", "unbending", "unbinding", "unblocked", "unbolting", "unbosomed", "unbounded", "unbranded", "unbridled", "unbuckled", "unbuckles", "unburdens", "unbuttons", "uncannier", "uncannily", "unceasing", "uncertain", "unchanged", "uncharted", "unchecked", "unclaimed", "unclasped", "uncleaner", "uncleanly", "unclearer", "unclothed", "unclothes", "uncoiling", "unconcern", "uncorking", "uncounted", "uncoupled", "uncouples", "uncovered", "uncurling", "undamaged", "undaunted", "undeceive", "undecided", "undefined", "underacts", "underarms", "underbids", "undercoat", "undercuts", "underdogs", "underdone", "underfeed", "underflow", "underfoot", "undergoes", "undergone", "undergrad", "underhand", "underlain", "underlays", "underlies", "underline", "underling", "undermine", "undermost", "underpaid", "underpass", "underpays", "underpins", "underplay", "underrate", "underseas", "undersell", "undershot", "underside", "undersign", "undersold", "undertake", "undertone", "undertook", "undertows", "underused", "underwear", "underwent", "undiluted", "undivided", "undoubted", "undressed", "undresses", "undulated", "undulates", "unearthed", "unearthly", "uneasiest", "uneatable", "unequally", "unethical", "unevenest", "unfailing", "unfairest", "unfastens", "unfeeling", "unfeigned", "unfetters", "unfitting", "unfocused", "unfolding", "unfounded", "unfrocked", "unfurling", "ungodlier", "unguarded", "ungulates", "unhanding", "unhappier", "unhappily", "unhealthy", "unhelpful", "unhinging", "unhitched", "unhitches", "unholiest", "unhooking", "unhorsing", "unhurried", "unicycles", "uniformed", "uniformer", "uniformly", "unimpeded", "uninjured", "uninsured", "uninvited", "unionists", "universal", "universes", "unkindest", "unknowing", "unlatched", "unlatches", "unleashed", "unleashes", "unlimited", "unloading", "unlocking", "unloosing", "unluckier", "unluckily", "unmanlier", "unmanning", "unmarried", "unmasking", "unmatched", "unmindful", "unmusical", "unnatural", "unnerving", "unnoticed", "unopposed", "unpacking", "unpainted", "unpicking", "unpinning", "unplanned", "unplugged", "unplumbed", "unpopular", "unquoting", "unreadier", "unreality", "unrefined", "unrelated", "unresting", "unrolling", "unruffled", "unruliest", "unsaddled", "unsaddles", "unsalable", "unscathed", "unscrewed", "unsealing", "unseating", "unsecured", "unselfish", "unsettled", "unsettles", "unsheathe", "unsightly", "unskilled", "unsmiling", "unsnapped", "unsnarled", "unsounder", "unsparing", "unspoiled", "unstabler", "unstopped", "unstudied", "unsullied", "untainted", "untangled", "untangles", "untenable", "untidiest", "untouched", "untrained", "untreated", "untutored", "untwisted", "untypical", "unusually", "unvarying", "unveiling", "unwariest", "unwelcome", "unwilling", "unwinding", "unwitting", "unworldly", "unwrapped", "unwritten", "unzipping", "upbraided", "upchucked", "upcountry", "upgrading", "upheavals", "upholders", "upholding", "upholster", "uplifting", "uploading", "uppercase", "uppercuts", "uppermost", "upraising", "uprisings", "uprooting", "upsetting", "upstaging", "upstarted", "upstreams", "upsurging", "upturning", "urinating", "urination", "urologist", "uselessly", "usherette", "utilities", "utterance", "uttermost", "vacancies", "vacations", "vaccinate", "vacillate", "vacuously", "vacuuming", "vagabonds", "vagueness", "vainglory", "valancing", "valencies", "valentine", "valiantly", "validated", "validates", "validness", "valuables", "valuation", "valueless", "vamoosing", "vampiring", "vandalism", "vanguards", "vanishing", "vapidness", "vaporised", "vaporises", "variables", "variances", "variation", "varicoses", "variegate", "varieties", "variously", "varnished", "varnishes", "varsities", "vasectomy", "vassalage", "vassaling", "vectoring", "vegetable", "vegetated", "vegetates", "vehemence", "vehicular", "velodrome", "velveteen", "velvetier", "velveting", "vendettas", "veneering", "venerable", "venerated", "venerates", "vengeance", "ventilate", "ventricle", "venturing", "venturous", "veracious", "verballed", "verbosely", "verbosity", "verdigris", "verifying", "veritable", "veritably", "vermilion", "verminous", "versatile", "versified", "versifies", "vertebrae", "vertebral", "verticals", "vestibule", "vestigial", "vestments", "vexations", "vexatious", "viability", "vibrantly", "vibrating", "vibration", "vibrators", "viburnums", "vicarages", "vicarious", "viciously", "victories", "videodisc", "videotape", "viewpoint", "vigilance", "vigilante", "vignetted", "vignettes", "vilifying", "villagers", "vindicate", "vineyards", "violating", "violation", "violators", "violently", "violinist", "virginals", "virginity", "virtually", "virtuosos", "virulence", "viscosity", "viscounts", "visionary", "visioning", "vitiating", "vitiation", "vitriolic", "vivacious", "vividness", "vivifying", "vocalists", "vocations", "vocatives", "voiceless", "volcanics", "volcanoes", "volleying", "voltmeter", "voluntary", "volunteer", "voodooing", "voodooism", "voracious", "vouchsafe", "voyeurism", "vulgarest", "vulgarism", "vulgarity", "wackiness", "wainscots", "waistband", "waistcoat", "waistline", "walkabout", "walkaways", "walkovers", "wallabies", "wallboard", "walloping", "wallowing", "wallpaper", "wanderers", "wandering", "wannabees", "wantoning", "wardening", "wardering", "wardrobes", "wardrooms", "warehouse", "warhorses", "warmonger", "warplanes", "warranted", "washables", "washbasin", "washboard", "washbowls", "washcloth", "washering", "washrooms", "washstand", "waspishly", "wassailed", "wasteland", "wastering", "watchable", "watchband", "watchdogs", "watchword", "waterfall", "waterfowl", "waterhole", "wateriest", "waterline", "watermark", "watermill", "watershed", "waterside", "waterways", "wavebands", "wayfarers", "wayfaring", "waylaying", "waywardly", "weakening", "weakliest", "weaklings", "wealthier", "weariness", "wearisome", "weathered", "webmaster", "weekended", "weekender", "weeknight", "weightier", "weightily", "weighting", "weirdness", "welcoming", "weltering", "westbound", "westerner", "westwards", "whackings", "whalebone", "wheatgerm", "wheatmeal", "wheedling", "wheelbase", "wheeziest", "wherefore", "whereupon", "whetstone", "whichever", "whimpered", "whimsical", "whimsiest", "whingeing", "whinniest", "whinnying", "whippings", "whirligig", "whirlpool", "whirlwind", "whiskered", "whispered", "whistlers", "whistling", "whitebait", "whitecaps", "whitefish", "whiteners", "whiteness", "whitening", "whitewall", "whitewash", "whithered", "whittlers", "whittling", "whodunits", "wholefood", "wholemeal", "wholeness", "wholesale", "wholesome", "whooshing", "whoppings", "whosoever", "wickedest", "widowhood", "wifeliest", "wiggliest", "wigwagged", "wildfires", "willinger", "willingly", "willowier", "willpower", "windblown", "windbreak", "windburns", "windfalls", "windiness", "windmills", "windowing", "windpipes", "windsocks", "windstorm", "windsurfs", "windswept", "wineglass", "wingspans", "winnowing", "winsomely", "winsomest", "wintering", "wintriest", "wiseacres", "wisecrack", "wiseliest", "wishbones", "wishfully", "wisterias", "wistfully", "withdrawn", "withdraws", "withering", "withholds", "withstand", "withstood", "witlessly", "witnessed", "witnesses", "wittering", "witticism", "wittiness", "wittingly", "wobbliest", "woebegone", "woefuller", "wolfhound", "wolverine", "womanhood", "womankind", "womanlier", "womanlike", "womenfolk", "wonderful", "wondering", "woodblock", "woodchuck", "woodcocks", "woodcraft", "woodenest", "woodiness", "woodlands", "woodlouse", "woodpiles", "woodsheds", "woodsiest", "woodwinds", "woodworms", "wooliness", "woolliest", "wooziness", "wordiness", "wordsmith", "workbench", "workbooks", "workforce", "workhorse", "workhouse", "workloads", "workmates", "workplace", "workrooms", "worksheet", "workshops", "workweeks", "worldlier", "worldwide", "wormholes", "worriedly", "worrisome", "worryings", "worrywart", "worsening", "worthiest", "worthless", "wranglers", "wrangling", "wrappings", "wreathing", "wrenching", "wrestlers", "wrestling", "wrigglers", "wrigglier", "wriggling", "wrinklier", "wrinklies", "wrinkling", "wristband", "wrongdoer", "wrongness", "xenophobe", "xylophone", "yachtsman", "yachtsmen", "yammering", "yardstick", "yarmulkes", "yearbooks", "yearlings", "yearnings", "yeastiest", "yellowest", "yellowing", "yellowish", "yesterday", "yieldings", "youngster", "yuppified", "yuppifies", "zealously", "zeitgeist", "zeppelins", "zestfully", "zigzagged", "zippering", "zirconium", "zookeeper", "zoologist", "zucchinis" }; const char* w_10[] = { "abandoning", "abbreviate", "abdicating", "abdication", "abductions", "aberration", "abhorrence", "abjuration", "abnegating", "abnegation", "abnormally", "abolishing", "abominable", "abominably", "abominated", "abominates", "aboriginal", "aborigines", "aboveboard", "abrasively", "abrogating", "abrogation", "abruptness", "abscessing", "absconding", "absolutely", "absolutest", "absolution", "absolutism", "absolutist", "absorbency", "absorbents", "absorption", "abstainers", "abstaining", "abstemious", "abstention", "abstinence", "abstracted", "abstracter", "abstractly", "abstrusely", "abstrusest", "abundances", "abundantly", "academical", "acanthuses", "accelerate", "accentuate", "acceptable", "acceptably", "acceptance", "accessible", "accessibly", "accessions", "accidental", "acclaiming", "acclimated", "acclimates", "accolading", "accomplice", "accomplish", "accordance", "accordions", "accountant", "accounting", "accredited", "accretions", "accumulate", "accurately", "accusation", "accusative", "accusatory", "accusingly", "accustomed", "achievable", "achromatic", "acidifying", "acoustical", "acquainted", "acquiesced", "acquiesces", "acquirable", "acquittals", "acquitting", "acrobatics", "actionable", "activating", "activation", "activities", "adaptation", "addictions", "additional", "addressees", "addressing", "adequately", "adjacently", "adjectival", "adjectives", "adjourning", "adjudicate", "adjuration", "adjustable", "adjustment", "administer", "admiration", "admiringly", "admissible", "admissions", "admittance", "admittedly", "admixtures", "admonished", "admonishes", "admonition", "admonitory", "adolescent", "adornments", "adrenaline", "adroitness", "adulterant", "adulterate", "adulterers", "adulteress", "adulteries", "adulterous", "adumbrated", "adumbrates", "advantaged", "advantages", "adventured", "adventurer", "adventures", "adverbials", "advertised", "advertiser", "advertises", "advisement", "advisories", "advocating", "aerialists", "aerobatics", "aerodromes", "aerogramme", "aeronautic", "aesthetics", "affability", "affectedly", "affections", "affidavits", "affiliated", "affiliates", "affinities", "afflicting", "affliction", "affluently", "affordable", "afforested", "affronting", "aficionado", "afterbirth", "afterglows", "afterlives", "aftermaths", "afternoons", "aftershave", "aftershock", "aftertaste", "afterwords", "aggravated", "aggravates", "aggregated", "aggregates", "aggression", "aggressive", "aggressors", "aggrieving", "agitations", "agreements", "agronomist", "airbrushed", "airbrushes", "airdropped", "airletters", "airlifting", "airmailing", "alarmingly", "alchemists", "alcoholics", "alcoholism", "alderwoman", "alderwomen", "algorithms", "alienating", "alienation", "alignments", "alimentary", "alkalinity", "allegation", "allegiance", "allegories", "allergenic", "allergists", "alleviated", "alleviates", "alligators", "allocating", "allocation", "allotments", "allowances", "alluringly", "allusively", "almshouses", "alphabeted", "alphabetic", "altarpiece", "alteration", "alternated", "alternates", "alternator", "altimeters", "altogether", "altruistic", "amalgamate", "amanuenses", "amanuensis", "amateurish", "amateurism", "ambassador", "ambivalent", "ambulances", "ambulatory", "ameliorate", "amendments", "amiability", "ammunition", "amnestying", "ampersands", "amphibians", "amphibious", "amplifiers", "amplifying", "amplitudes", "amputating", "amputation", "amusements", "analgesics", "analytical", "anarchists", "anatomical", "anatomists", "ancestored", "ancestress", "ancestries", "anchorages", "anchorites", "ancientest", "anemometer", "angiosperm", "angleworms", "anglicisms", "anglophile", "anglophone", "anguishing", "angularity", "animatedly", "animations", "annexation", "annihilate", "annotating", "annotation", "announcers", "announcing", "annoyances", "annoyingly", "annulments", "anointment", "answerable", "antagonism", "antagonist", "antebellum", "antecedent", "antedating", "anthracite", "anthropoid", "antibiotic", "antibodies", "anticipate", "anticlimax", "antifreeze", "antiheroes", "antimatter", "antipastos", "antiphonal", "antiquated", "antiquates", "antiseptic", "antisocial", "antitheses", "antithesis", "antithetic", "antitoxins", "antivirals", "antonymous", "apartments", "aphoristic", "apocalypse", "apocryphal", "apolitical", "apologetic", "apologists", "apoplectic", "apoplexies", "apostasies", "apostrophe", "apothecary", "apotheoses", "apotheosis", "apparently", "apparition", "appearance", "appellants", "appendages", "appendices", "appendixes", "appertains", "applauding", "applesauce", "appliances", "applicable", "applicants", "applicator", "appointees", "appointing", "apportions", "appositely", "apposition", "appositive", "appraisals", "appraisers", "appraising", "appreciate", "apprehends", "apprentice", "approached", "approaches", "aquamarine", "aquaplaned", "aquaplanes", "arabesques", "arbitrager", "arbitrated", "arbitrates", "arbitrator", "arboretums", "arborvitae", "archangels", "archbishop", "archdeacon", "archetypal", "archetypes", "architects", "archivists", "aristocrat", "arithmetic", "armadillos", "armaturing", "armistices", "arraigning", "arrogantly", "arrogating", "arrowheads", "artfulness", "arthritics", "arthropods", "artichokes", "articulacy", "articulate", "artificers", "artificial", "ascendancy", "ascendants", "ascensions", "ascertains", "asceticism", "ascribable", "ascription", "asperities", "aspersions", "asphalting", "asphyxiate", "aspidistra", "aspirating", "aspiration", "assailable", "assailants", "assaulting", "assemblage", "assemblers", "assemblies", "assembling", "assertions", "assessment", "asseverate", "assignable", "assignment", "assimilate", "assistance", "assistants", "associated", "associates", "assortment", "assumption", "assurances", "asterisked", "asthmatics", "astigmatic", "astonished", "astonishes", "astounding", "astringent", "astrologer", "astronauts", "astronomer", "astronomic", "astuteness", "asymmetric", "asymptotic", "atmosphere", "atrocities", "atrophying", "attachment", "attainable", "attainment", "attempting", "attendance", "attendants", "attentions", "attenuated", "attenuates", "attracting", "attraction", "attractive", "attributed", "attributes", "atypically", "aubergines", "auctioneer", "auctioning", "audibility", "audiophile", "audiotapes", "auditioned", "auditorium", "augmenting", "auspicious", "authorship", "autocratic", "autographs", "autoimmune", "automakers", "automatics", "automating", "automation", "automatons", "automobile", "automotive", "autonomous", "autopilots", "autopsying", "autoworker", "avalanches", "avaricious", "aviatrices", "aviatrixes", "avocations", "awakenings", "awkwardest", "axiomatics", "ayatollahs", "babysitter", "bacchanals", "backbiters", "backbiting", "backbitten", "backboards", "backcloths", "backcombed", "backdating", "backfields", "backfiring", "backgammon", "background", "backhanded", "backhander", "backlashes", "backlogged", "backpacked", "backpacker", "backpedals", "backslider", "backslides", "backspaced", "backspaces", "backstairs", "backstreet", "backstroke", "backtracks", "backwaters", "badmouthed", "bafflement", "bagatelles", "bailiwicks", "balaclavas", "balalaikas", "balderdash", "balefuller", "balladeers", "ballasting", "ballerinas", "ballistics", "ballooning", "balloonist", "ballplayer", "ballpoints", "ballyhooed", "balustrade", "bamboozled", "bamboozles", "banalities", "bandleader", "bandmaster", "bandoleers", "bandstands", "bandwagons", "banefuller", "banishment", "bankrolled", "bankruptcy", "bankrupted", "banqueting", "banquettes", "baptistery", "barbarians", "barbarisms", "barbecuing", "barberries", "barbershop", "barefooted", "barehanded", "bareheaded", "bargaining", "barkeepers", "barnstorms", "barometers", "barometric", "baronesses", "barracking", "barracudas", "barrenness", "barricaded", "barricades", "barristers", "bartenders", "baseboards", "basketball", "basketwork", "bassoonist", "bathhouses", "battalions", "batterings", "battlement", "battleship", "bayberries", "bayoneting", "bazillions", "beachfront", "beachheads", "beanfeasts", "beansprout", "beastliest", "beatifying", "beatitudes", "beautician", "beautified", "beautifier", "beautifies", "becomingly", "becquerels", "bedazzling", "bedchamber", "bedclothes", "bedfellows", "bedraggled", "bedraggles", "bedsitters", "bedspreads", "beefburger", "beefsteaks", "beekeepers", "beekeeping", "beforehand", "befriended", "befuddling", "beginnings", "begrudging", "behindhand", "beleaguers", "believable", "belittling", "belladonna", "bellwether", "bellyached", "bellyaches", "belongings", "benchmarks", "benefactor", "beneficent", "beneficial", "benefiting", "benevolent", "bequeathed", "beseeching", "besmirched", "besmirches", "bespeaking", "bestiality", "bestiaries", "bestirring", "bestridden", "bestriding", "bestseller", "bethinking", "betokening", "betrothals", "betrothing", "betterment", "bewildered", "bewitching", "biannually", "bicyclists", "biennially", "bifurcated", "bifurcates", "bighearted", "bilberries", "bilinguals", "billboards", "billionths", "billowiest", "binoculars", "biochemist", "biodegrade", "biographer", "biological", "biologists", "biophysics", "biorhythms", "biospheres", "bipartisan", "birdbrains", "birdhouses", "birthmarks", "birthplace", "birthrates", "birthright", "birthstone", "bisections", "bishoprics", "bitchiness", "bitterness", "bituminous", "bivouacked", "biweeklies", "blabbering", "blackballs", "blackberry", "blackbirds", "blackboard", "blackening", "blackguard", "blackheads", "blackjacks", "blacklists", "blackmails", "blacksmith", "blackthorn", "blancmange", "blanketing", "blarneying", "blasphemed", "blasphemer", "blasphemes", "blathering", "blemishing", "blessedest", "blethering", "blindfolds", "blindingly", "blindsided", "blindsides", "blinkering", "blissfully", "blistering", "blitzkrieg", "blockading", "blockheads", "blockhouse", "bloodbaths", "bloodhound", "bloodlines", "bloodstain", "bloodstock", "blossoming", "blotchiest", "blubbering", "bludgeoned", "bluebottle", "bluefishes", "bluejacket", "blueprints", "blunderers", "blundering", "blustering", "boardrooms", "boardwalks", "boastfully", "boathouses", "boatswains", "bobsledded", "bobsleighs", "bodyguards", "boisterous", "bollocking", "bolstering", "bombardier", "bombarding", "bombshells", "bondholder", "boneshaker", "bookbinder", "bookending", "bookkeeper", "bookmakers", "bookmaking", "bookmarked", "bookmobile", "bookplates", "bookseller", "bookstalls", "bookstores", "boomerangs", "boondoggle", "bootblacks", "bootlegged", "bootlegger", "bootstraps", "borderland", "borderline", "borrowings", "bothersome", "bottleneck", "bottomless", "bouldering", "boulevards", "boundaries", "bowstrings", "boycotting", "boyfriends", "boyishness", "bracketing", "brainchild", "brainpower", "brainstorm", "brainwaves", "brandished", "brandishes", "brasseries", "brassieres", "brawniness", "brazenness", "breadboard", "breadboxes", "breadcrumb", "breadfruit", "breakables", "breakaways", "breakdowns", "breakfasts", "breakwater", "breastbone", "breastfeed", "breastwork", "breathable", "breathiest", "breathless", "breeziness", "breviaries", "bricklayer", "brickyards", "bridegroom", "bridesmaid", "bridgehead", "bridgework", "bridleways", "briefcases", "brigadiers", "brigandage", "brigantine", "brightened", "brightness", "brilliance", "brilliancy", "brilliants", "briquettes", "bristliest", "broadcasts", "broadcloth", "broadening", "broadsheet", "broadsided", "broadsides", "broadsword", "brokerages", "bronchitic", "bronchitis", "brontosaur", "broodiness", "broomstick", "brothering", "browbeaten", "brownfield", "brownstone", "buccaneers", "buckboards", "bucketfuls", "budgerigar", "buffaloing", "buffetings", "buffoonery", "bulldogged", "bulldozers", "bulldozing", "bulletined", "bullfights", "bullheaded", "bumblebees", "bunkhouses", "burdensome", "bureaucrat", "burgeoning", "burglaries", "burgundies", "burlesqued", "burlesques", "burnishing", "bushwhacks", "businesses", "busybodies", "butcheries", "butchering", "buttercups", "butteriest", "buttermilk", "butternuts", "buttocking", "buttonhole", "buttressed", "buttresses", "byproducts", "bystanders", "cabdrivers", "cablecasts", "cablegrams", "cadaverous", "cafeterias", "cafetieres", "calabashes", "calamining", "calamities", "calamitous", "calcifying", "calculable", "calculated", "calculates", "calculator", "calendared", "calibrated", "calibrates", "calibrator", "caliphates", "callousing", "calumniate", "camcorders", "camerawork", "camouflage", "campaigned", "campaigner", "campaniles", "campground", "candelabra", "candidates", "candidness", "candlewick", "candyfloss", "canistered", "cannabises", "cannelloni", "cannonaded", "cannonades", "cannonball", "canonicals", "canoodling", "cantaloupe", "cantilever", "cantonment", "canvasback", "canvassers", "canvassing", "capability", "capacities", "capacitors", "caparisons", "capitalism", "capitalist", "capitation", "capitulate", "cappuccino", "capricious", "captaining", "captioning", "captivated", "captivates", "carbonated", "carbonates", "carbuncles", "carburetor", "carcinogen", "carcinomas", "cardholder", "cardiogram", "cardiology", "cardsharps", "careerists", "carefuller", "caregivers", "carelessly", "caretakers", "caricature", "carjackers", "carjacking", "carnations", "carnelians", "carnivores", "carpenters", "carpetbags", "carpooling", "carthorses", "cartilages", "cartooning", "cartoonist", "cartridges", "cartwheels", "caseworker", "cashiering", "cashpoints", "casseroled", "casseroles", "castigated", "castigates", "castigator", "castrating", "castration", "casualness", "casualties", "cataclysms", "catafalque", "cataleptic", "catamarans", "catapulted", "catatonics", "catcalling", "catchments", "catchwords", "catechisms", "categories", "caterwauls", "cathartics", "cathedrals", "catnapping", "cautionary", "cautioning", "cautiously", "cavalcades", "cavalryman", "cavalrymen", "caveatting", "ceasefires", "celebrants", "celebrated", "celebrates", "cellophane", "cellphones", "cemeteries", "censorious", "censorship", "centennial", "centigrade", "centipedes", "centralest", "centralism", "centralist", "centrality", "centrifuge", "centurions", "cerebellum", "ceremonial", "ceremonies", "certainest", "certifying", "certitudes", "cessations", "chagrining", "chainsawed", "chairlifts", "chairwoman", "chairwomen", "chalkboard", "chalkiness", "challenged", "challenger", "challenges", "chameleons", "chamomiles", "champagnes", "championed", "chancellor", "chanceries", "chandelier", "changeable", "changeless", "changeling", "changeover", "chaparrals", "chaperoned", "chaplaincy", "charabancs", "characters", "charbroils", "chargeable", "charioteer", "charitable", "charitably", "charladies", "charlatans", "charminger", "charmingly", "chartering", "chartreuse", "chastening", "chastising", "chatterbox", "chatterers", "chattering", "chattiness", "chauffeurs", "chauvinism", "chauvinist", "cheapening", "cheapskate", "checklists", "checkmated", "checkmates", "checkpoint", "checkrooms", "cheekbones", "cheekiness", "cheerfully", "cheeriness", "cheesecake", "chemically", "cherishing", "chessboard", "chickadees", "chickening", "chickenpox", "chieftains", "chihuahuas", "chilblains", "childbirth", "childhoods", "childishly", "childproof", "chilliness", "chillingly", "chimerical", "chimpanzee", "chinchilla", "chinstraps", "chintziest", "chipolatas", "chirpiness", "chirruping", "chivalrous", "chlorinate", "chloroform", "chocoholic", "chocolates", "choppering", "choppiness", "chopsticks", "choristers", "chowdering", "christened", "chromatics", "chromosome", "chronicled", "chronicler", "chronicles", "chronology", "chubbiness", "chuckholes", "chumminess", "chundering", "chunkiness", "chuntering", "churchgoer", "churchyard", "churlishly", "cicatrices", "cigarettes", "cigarillos", "circuiting", "circuitous", "circulated", "circulates", "circumcise", "circumflex", "circumvent", "citronella", "civilities", "clambering", "clamminess", "clampdowns", "clanswoman", "clanswomen", "clapboards", "clappering", "clarifying", "clarioning", "classicism", "classicist", "classified", "classifies", "classiness", "classmates", "classrooms", "clattering", "clavichord", "cleanliest", "clearances", "clematises", "clementine", "clerestory", "cleverness", "clinically", "clinicians", "clipboards", "clitorises", "cloakrooms", "clobbering", "clockworks", "clodhopper", "cloistered", "clothespin", "cloudburst", "cloudiness", "cloverleaf", "clownishly", "clubhouses", "clumsiness", "clustering", "cluttering", "coachloads", "coagulants", "coagulated", "coagulates", "coalescing", "coalfields", "coalitions", "coarseness", "coarsening", "coastguard", "coastlines", "coauthored", "cockamamie", "cockchafer", "cockfights", "cockscombs", "cocksucker", "codswallop", "coexisting", "coffeecake", "coffeepots", "cofferdams", "cogitating", "cogitation", "cohabiting", "coherently", "cohesively", "coiffuring", "coincident", "coinciding", "collapsing", "collarbone", "collarless", "collateral", "collations", "colleagued", "colleagues", "collecting", "collection", "collective", "collectors", "collegians", "collegiate", "collieries", "collisions", "collocated", "collocates", "colloquial", "colloquies", "colloquium", "colonnaded", "colonnades", "colossally", "columbines", "columnists", "combatants", "combustion", "comedienne", "comeliness", "comestible", "comforters", "comforting", "commandant", "commandeer", "commanders", "commanding", "commencing", "commending", "commentary", "commentate", "commenting", "commercial", "commercing", "commingled", "commingles", "commissars", "commissary", "commission", "commitment", "committals", "committees", "committing", "commodious", "commodores", "commotions", "communally", "communions", "communique", "communists", "commutable", "compactest", "compacting", "compaction", "compactors", "companions", "comparable", "comparably", "comparison", "compassing", "compassion", "compatible", "compatibly", "compatriot", "compelling", "compendium", "compensate", "competence", "competency", "competitor", "complacent", "complained", "complainer", "complaints", "complected", "complement", "completely", "completest", "completing", "completion", "complexest", "complexion", "complexity", "compliance", "complicate", "complicity", "compliment", "components", "comporting", "composites", "compositor", "composting", "compounded", "comprehend", "compressed", "compresses", "compressor", "comprising", "compromise", "compulsion", "compulsive", "compulsory", "concealing", "conceiving", "concentric", "conception", "conceptual", "concerning", "concertina", "concerting", "concession", "concierges", "conciliate", "concluding", "conclusion", "conclusive", "concocting", "concoction", "concordant", "concordats", "concourses", "concretely", "concreting", "concubines", "concurrent", "concurring", "concussing", "concussion", "condemning", "condensers", "condensing", "condescend", "condiments", "conditions", "condolence", "conducting", "conduction", "conductive", "conductors", "confabbing", "confection", "conference", "conferment", "conferring", "confessing", "confession", "confessors", "confidante", "confidants", "confidence", "configured", "configures", "confirming", "confiscate", "conflating", "conflation", "conflicted", "confluence", "conforming", "conformist", "conformity", "confounded", "confronted", "confusedly", "confusions", "congealing", "congenital", "congesting", "congestion", "congestive", "congregant", "congregate", "congresses", "congruence", "coniferous", "conjecture", "conjoining", "conjugated", "conjugates", "connecting", "connection", "connective", "connectors", "connexions", "connivance", "conquering", "conquerors", "conscience", "conscripts", "consecrate", "consensual", "consenting", "consequent", "conserving", "considered", "consignees", "consigning", "consistent", "consisting", "consonance", "consonants", "consorting", "consortium", "conspiracy", "conspiring", "constables", "constantly", "constipate", "constitute", "constrains", "constraint", "constricts", "constructs", "construing", "consulates", "consultant", "consulting", "consumable", "consumings", "consummate", "contacting", "contagions", "contagious", "containers", "containing", "contenders", "contending", "contenting", "contention", "contestant", "contesting", "contextual", "contiguity", "contiguous", "continence", "continents", "contingent", "continuing", "continuity", "continuous", "contorting", "contortion", "contouring", "contraband", "contracted", "contractor", "contradict", "contraflow", "contraltos", "contraries", "contrarily", "contrasted", "contravene", "contribute", "contritely", "contrition", "contriving", "controlled", "controller", "controvert", "contusions", "conundrums", "convalesce", "convection", "convectors", "convenient", "conventing", "convention", "convergent", "converging", "conversant", "conversely", "conversing", "conversion", "converters", "converting", "conveyance", "convicting", "conviction", "convincing", "convoluted", "convulsing", "convulsion", "convulsive", "cookhouses", "cooperated", "cooperates", "coordinate", "copperhead", "copulating", "copulation", "copycatted", "copyrights", "copywriter", "coquetting", "coquettish", "cordiality", "corkscrews", "cormorants", "corncrakes", "cornfields", "cornflakes", "cornflower", "cornrowing", "cornstalks", "cornstarch", "cornucopia", "coronaries", "coronation", "corpulence", "corpuscles", "corralling", "correctest", "correcting", "correction", "corrective", "correlated", "correlates", "correspond", "corrosives", "corrugated", "corrugates", "corruptest", "corrupting", "corruption", "coruscated", "coruscates", "cosmically", "cosmonauts", "cosponsors", "cossetting", "costarring", "costliness", "costumiers", "cotillions", "cottonseed", "cottontail", "cottonwood", "cotyledons", "couchettes", "councilman", "councilmen", "countdowns", "counteract", "countering", "countesses", "countryman", "countrymen", "countywide", "courageous", "courgettes", "couriering", "coursebook", "coursework", "courtesans", "courtesies", "courthouse", "courtliest", "courtrooms", "courtships", "courtyards", "couturiers", "covenanted", "covetously", "cowcatcher", "cowpuncher", "coxswained", "crabbiness", "crackdowns", "crackliest", "cracklings", "craftiness", "crankcases", "crankiness", "crankshaft", "cravatting", "crawlspace", "crayfishes", "creakiness", "creameries", "creaminess", "creatively", "creativity", "credential", "creditable", "creditably", "creepiness", "cremations", "crematoria", "creosoting", "crescendos", "cricketers", "cricketing", "criminally", "crimsoning", "crinkliest", "crinolines", "crispbread", "crisscross", "critically", "criticisms", "critiquing", "crocheting", "crocodiles", "croissants", "crookedest", "croquettes", "crossbeams", "crossbones", "crossbreed", "crosscheck", "crossfires", "crossovers", "crosspatch", "crosspiece", "crossroads", "crosswalks", "crosswinds", "crosswords", "crucifixes", "cruciforms", "crucifying", "crumbliest", "crunchiest", "crushingly", "crustacean", "cryogenics", "cryptogram", "cubbyholes", "cuckolding", "culminated", "culminates", "cultivable", "cultivated", "cultivates", "cultivator", "culturally", "cumbersome", "cummerbund", "cumulative", "cunningest", "curiousest", "curlicuing", "curmudgeon", "currencies", "curricular", "curriculum", "currycombs", "curtailing", "curtaining", "curvaceous", "curvatures", "cushioning", "cussedness", "custodians", "cutthroats", "cuttlefish", "cybernetic", "cyberpunks", "cyberspace", "cyclically", "cyclotrons", "dachshunds", "daintiness", "dairymaids", "dalliances", "dalmatians", "dandelions", "dandifying", "daredevils", "dartboards", "dashboards", "databasing", "datelining", "dauntingly", "davenports", "daydreamed", "daydreamer", "dazzlingly", "deactivate", "deadheaded", "deadliness", "deadlining", "deadlocked", "deadpanned", "dealership", "deathblows", "deathliest", "deathtraps", "debasement", "debauchees", "debauchery", "debauching", "debentures", "debilitate", "debilities", "debonairly", "debriefing", "decadently", "decapitate", "decathlete", "decathlons", "decelerate", "deceptions", "decimating", "decimation", "deciphered", "decisively", "deckchairs", "declaiming", "declarable", "declassify", "declension", "decolletes", "decomposed", "decomposes", "decompress", "decontrols", "decorating", "decoration", "decorative", "decorators", "decorously", "decoupling", "decreasing", "decrements", "dedicating", "dedication", "deductible", "deductions", "deescalate", "defacement", "defamation", "defamatory", "defaulters", "defaulting", "defeatists", "defecating", "defecation", "defections", "defectives", "defendants", "defensible", "deferments", "deficiency", "defilement", "definitely", "definition", "definitive", "deflecting", "deflection", "deflectors", "deflowered", "defoliants", "defoliated", "defoliates", "deforested", "defrauding", "defrocking", "defrosters", "defrosting", "degeneracy", "degenerate", "degradable", "dehumidify", "dehydrated", "dehydrates", "dejectedly", "delectable", "delectably", "delegating", "delegation", "deliberate", "delicacies", "delicately", "delightful", "delighting", "delimiters", "delimiting", "delineated", "delineates", "delinquent", "deliverers", "deliveries", "delivering", "delphinium", "delusively", "demagogues", "demarcated", "demarcates", "dementedly", "demeriting", "demitasses", "democratic", "demography", "demolished", "demolishes", "demolition", "demoniacal", "demonology", "demotivate", "demureness", "denaturing", "denigrated", "denigrates", "denominate", "denotation", "denouement", "denouncing", "dentifrice", "deodorants", "department", "departures", "dependable", "dependably", "dependence", "dependency", "depictions", "depilatory", "deplorable", "deplorably", "deployment", "depopulate", "deportment", "depositing", "deposition", "depositors", "depository", "deprecated", "deprecates", "depreciate", "depressant", "depressing", "depression", "depressive", "deprograms", "deputation", "derailment", "deregulate", "derisively", "derivation", "derivative", "dermatitis", "derogating", "derogation", "derogatory", "derringers", "desalinate", "descanting", "descendant", "descending", "describing", "descriptor", "desecrated", "desecrates", "deselected", "desertions", "deservedly", "deservings", "desiccated", "desiccates", "desiderata", "designated", "designates", "deskilling", "desolately", "desolating", "desolation", "despairing", "despicable", "despicably", "despoiling", "despondent", "destroyers", "destroying", "destructed", "detachable", "detachment", "detainment", "detectable", "detectives", "detentions", "detergents", "determined", "determiner", "determines", "deterrence", "deterrents", "detestable", "detestably", "dethroning", "detonating", "detonation", "detonators", "detoxified", "detoxifies", "detracting", "detraction", "detractors", "detriments", "devastated", "devastates", "developers", "developing", "deviations", "devilishly", "deviltries", "devolution", "devotional", "devoutness", "dewberries", "diabolical", "diacritics", "diagnosing", "diagnostic", "diagonally", "diagrammed", "dialectics", "diaphanous", "diaphragms", "dickybirds", "dictations", "dictionary", "didgeridoo", "dietitians", "difference", "difficulty", "diffidence", "diffracted", "digestible", "digestions", "digestives", "dignifying", "digressing", "digression", "digressive", "dilettante", "diligently", "dillydally", "dimensions", "diminished", "diminishes", "diminuendo", "diminution", "diminutive", "dinnertime", "dinnerware", "diphtheria", "diphthongs", "diplomatic", "dipsomania", "directions", "directives", "directness", "dirigibles", "disability", "disabusing", "disaffects", "disallowed", "disappears", "disappoint", "disapprove", "disarrange", "disarrayed", "disastrous", "disavowals", "disavowing", "disbanding", "disbarment", "disbarring", "disbelieve", "disbursing", "discarding", "discerning", "discharged", "discharges", "discipline", "disclaimed", "disclaimer", "disclosing", "disclosure", "discomfits", "discomfort", "discommode", "discompose", "disconcert", "disconnect", "discontent", "discordant", "discording", "discounted", "discounter", "discourage", "discoursed", "discourses", "discovered", "discoverer", "discredits", "discreeter", "discreetly", "discretely", "discretion", "discursive", "discussant", "discussing", "discussion", "disdainful", "disdaining", "disembarks", "disembowel", "disenchant", "disengaged", "disengages", "disfigured", "disfigures", "disgorging", "disgracing", "disgruntle", "disguising", "disgusting", "disharmony", "dishcloths", "dishearten", "dishonesty", "dishtowels", "dishwasher", "disincline", "disinfects", "disinherit", "disjointed", "dislocated", "dislocates", "dislodging", "disloyally", "disloyalty", "dismantled", "dismantles", "dismembers", "dismissals", "dismissing", "dismissive", "dismounted", "disobeying", "disobliged", "disobliges", "disordered", "disorderly", "disorients", "disparaged", "disparages", "disparates", "dispatched", "dispatcher", "dispatches", "dispelling", "dispensary", "dispensers", "dispensing", "dispersing", "dispersion", "dispirited", "displacing", "displaying", "displeased", "displeases", "disporting", "disposable", "dispossess", "disproving", "disputable", "disputants", "disqualify", "disquieted", "disregards", "disrespect", "disrupting", "disruption", "disruptive", "dissatisfy", "dissecting", "dissection", "dissembled", "dissembles", "dissension", "dissenters", "dissenting", "disservice", "dissidence", "dissidents", "dissimilar", "dissipated", "dissipates", "dissociate", "dissolutes", "dissolving", "dissonance", "dissuading", "dissuasion", "distancing", "distending", "distension", "distention", "distillate", "distillers", "distillery", "distilling", "distincter", "distinctly", "distorting", "distortion", "distracted", "distraught", "distressed", "distresses", "distribute", "distrusted", "disturbing", "disuniting", "disyllabic", "divergence", "diversions", "divestment", "divination", "divinities", "divisional", "divisively", "dockworker", "doctorates", "docudramas", "documented", "dogcatcher", "doggedness", "dogmatists", "dogsbodies", "dogtrotted", "dolefuller", "dollhouses", "domiciling", "dominantly", "dominating", "domination", "dominatrix", "domineered", "doohickeys", "doomsayers", "doorkeeper", "dosshouses", "doubtfully", "doughtiest", "dovetailed", "downgraded", "downgrades", "downloaded", "downmarket", "downplayed", "downscaled", "downscales", "downshifts", "downsizing", "downspouts", "downstairs", "downstream", "downswings", "doxologies", "dragooning", "drainboard", "drainpipes", "dramatists", "drawbridge", "drawstring", "dreadfully", "dreadlocks", "dreamboats", "dreaminess", "dreariness", "dressiness", "dressmaker", "drizzliest", "drolleries", "drowsiness", "drugstores", "drumsticks", "drywalling", "duckboards", "dumbfounds", "dumbstruck", "dumbwaiter", "dunderhead", "dungeoning", "duplicated", "duplicates", "duplicator", "durability", "dustsheets", "dynamiting", "dyspeptics", "earmarking", "earthbound", "earthiness", "earthliest", "earthlings", "earthquake", "earthwards", "earthworks", "earthworms", "easterlies", "easterners", "eavesdrops", "ebullience", "eccentrics", "ecological", "ecologists", "economical", "economists", "ecosystems", "ecumenical", "editorials", "editorship", "educations", "effacement", "effectuate", "effeminacy", "effeminate", "effervesce", "efficiency", "efficients", "effortless", "effrontery", "effulgence", "effusively", "eggbeaters", "eglantines", "egocentric", "egomaniacs", "eiderdowns", "eigenvalue", "eighteenth", "eightieths", "eisteddfod", "ejaculated", "ejaculates", "elaborated", "elaborates", "elasticity", "elderberry", "electorate", "electrical", "electrodes", "electronic", "elementary", "elevations", "eliminated", "eliminates", "eliminator", "elliptical", "elongating", "elongation", "elopements", "eloquently", "elucidated", "elucidates", "emaciating", "emaciation", "emanations", "emancipate", "emasculate", "embankment", "embargoing", "embezzlers", "embezzling", "embittered", "emblazoned", "emblematic", "embodiment", "emboldened", "embroiders", "embroidery", "embroiling", "embryology", "emendation", "emigrating", "emigration", "emissaries", "emollients", "emoluments", "empathetic", "empiricism", "empiricist", "employable", "employment", "empowering", "emulations", "emulsified", "emulsifier", "emulsifies", "enactments", "encampment", "enchanters", "enchanting", "enchiladas", "encircling", "enclosures", "encounters", "encouraged", "encourages", "encroached", "encroaches", "encrusting", "encrypting", "encryption", "encumbered", "encyclical", "endangered", "endearment", "endocrines", "endowments", "energetics", "enervating", "enervation", "enfeebling", "engagement", "engagingly", "engendered", "engineered", "engravings", "engrossing", "enjoyments", "enlightens", "enlistment", "enlivening", "enormities", "enormously", "enraptured", "enraptures", "enrichment", "ensconcing", "enshrining", "enshrouded", "entangling", "enterprise", "entertains", "enthralled", "enthroning", "enthusiasm", "enthusiast", "enticement", "enticingly", "entombment", "entomology", "entourages", "entrancing", "entrapment", "entrapping", "entreaties", "entreating", "entrenched", "entrenches", "entrusting", "entryphone", "enumerable", "enumerated", "enumerates", "enunciated", "enunciates", "enveloping", "envisaging", "envisioned", "epicureans", "epiglottis", "epileptics", "epiloguing", "episcopacy", "episcopate", "epistolary", "equability", "equanimity", "equatorial", "equestrian", "equivalent", "equivocate", "eradicated", "eradicates", "ergonomics", "erotically", "escalating", "escalation", "escalators", "escapology", "escarpment", "escutcheon", "espadrille", "especially", "esplanades", "essentials", "estimating", "estimation", "estimators", "estranging", "eternities", "ethereally", "ethnically", "etiologies", "eucalyptus", "eulogistic", "euphemisms", "euphonious", "euthanasia", "evacuating", "evacuation", "evaluating", "evaluation", "evaluative", "evanescent", "evangelism", "evangelist", "evaporated", "evaporates", "evenhanded", "eventfully", "eventually", "eventuated", "eventuates", "everglades", "evergreens", "everyplace", "everything", "everywhere", "evidencing", "eviscerate", "evocations", "exacerbate", "exactingly", "exactitude", "exaggerate", "exaltation", "exasperate", "excavating", "excavation", "excavators", "excellence", "exceptions", "excerpting", "exchanging", "exchequers", "excitation", "excitement", "excitingly", "exclaiming", "exclusions", "exclusives", "excoriated", "excoriates", "excretions", "exculpated", "exculpates", "excursions", "execrating", "executable", "executions", "executives", "exemptions", "exercising", "exfoliated", "exfoliates", "exhalation", "exhausting", "exhaustion", "exhaustive", "exhibiting", "exhibition", "exhibitors", "exhilarate", "exhumation", "exigencies", "existences", "exonerated", "exonerates", "exorbitant", "exorcising", "exotically", "expandable", "expansions", "expatiated", "expatiates", "expatriate", "expectancy", "expedience", "expediency", "expedients", "expediters", "expediting", "expedition", "expendable", "experience", "experiment", "expertness", "expiration", "explaining", "expletives", "explicable", "explicated", "explicates", "explicitly", "exploiters", "exploiting", "explosions", "explosives", "exportable", "exposition", "expository", "expounding", "expressing", "expression", "expressive", "expressway", "expulsions", "expurgated", "expurgates", "extempores", "extensions", "extenuated", "extenuates", "externally", "extincting", "extinction", "extinguish", "extirpated", "extirpates", "extracting", "extraction", "extractors", "extradited", "extradites", "extramural", "extraneous", "extremists", "extricated", "extricates", "extroverts", "extrusions", "exuberance", "exultantly", "exultation", "eyeballing", "eyeglasses", "eyewitness", "fabricated", "fabricates", "fabulously", "facecloths", "facilitate", "facilities", "facsimiled", "facsimiles", "factitious", "fairground", "fairylands", "faithfully", "fallacious", "falsehoods", "falsifying", "falterings", "familiarly", "fanaticism", "fancifully", "fantasists", "fantasying", "farcically", "farmhouses", "farmsteads", "farsighted", "fascinated", "fascinates", "fashioning", "fastenings", "fastidious", "fastnesses", "fatalistic", "fatalities", "fatherhood", "fatherland", "fatherless", "fathomable", "fathomless", "fattenings", "faultiness", "fearfuller", "fearlessly", "featherier", "feathering", "federalism", "federalist", "federating", "federation", "feebleness", "felicities", "felicitous", "fellowship", "femaleness", "femininity", "fermenting", "ferryboats", "festooning", "fetchingly", "fetishists", "feverishly", "fickleness", "fictitious", "fiendishly", "fierceness", "fifteenths", "figurative", "figurehead", "filibuster", "filmmakers", "filmstrips", "filterable", "filthiness", "filtrating", "filtration", "financiers", "fingerings", "fingermark", "fingernail", "fingertips", "finickiest", "firebombed", "firebrands", "firebreaks", "firebricks", "firefights", "fireguards", "firehouses", "fireplaces", "fireproofs", "firescreen", "firestorms", "firewalled", "firmaments", "firstborns", "fishmonger", "fishtailed", "fisticuffs", "flabbiness", "flagellant", "flagellate", "flagrantly", "flagstaffs", "flagstones", "flamboyant", "flameproof", "flammables", "flashbacks", "flashbulbs", "flashcards", "flashiness", "flashlight", "flatfishes", "flatfooted", "flattening", "flatterers", "flattering", "flatulence", "flawlessly", "fledglings", "fleetingly", "fleshliest", "flickering", "flightiest", "flightless", "flimsiness", "flintlocks", "flippantly", "flirtation", "floatation", "floodgates", "floodlight", "floorboard", "flophouses", "floppiness", "flotations", "floundered", "flourished", "flourishes", "flowerbeds", "floweriest", "flowerings", "flowerpots", "fluctuated", "fluctuates", "fluffiness", "flummoxing", "fluoresced", "fluoresces", "fluoridate", "flustering", "fluttering", "flycatcher", "flyspecked", "flyswatter", "flyweights", "followings", "foodstuffs", "foolishest", "footballer", "footbridge", "footlights", "footlocker", "footnoting", "footplates", "footprints", "footstools", "forbearing", "forbidding", "forcefully", "forearming", "foreboding", "forecaster", "forecastle", "foreclosed", "forecloses", "forecourts", "foredoomed", "forefather", "forefinger", "forefronts", "foregoings", "foreground", "foreigners", "foreordain", "forerunner", "foreseeing", "foreshadow", "foreshores", "forestalls", "foretasted", "foretastes", "forewarned", "forfeiting", "forfeiture", "forgathers", "forgetting", "forgivable", "forlornest", "formalists", "formations", "formatting", "formidable", "formidably", "formlessly", "formulated", "formulates", "fornicated", "fornicates", "fornicator", "forsythias", "forthright", "fortifying", "fortissimo", "fortnights", "fortressed", "fortresses", "fortuitous", "forwardest", "forwarding", "foundation", "foundering", "foundlings", "fountained", "foursquare", "fourteenth", "foxhunting", "foxtrotted", "fractional", "fracturing", "fragmented", "fragrances", "fragrantly", "frameworks", "franchised", "franchisee", "franchiser", "franchises", "fraternity", "fratricide", "fraudsters", "fraudulent", "fraughting", "freakishly", "freebasing", "freebooter", "freeholder", "freelanced", "freelancer", "freelances", "freeloaded", "freeloader", "freestyles", "freewheels", "freighters", "freighting", "frenziedly", "frequented", "frequenter", "frequently", "freshening", "freshwater", "fricasseed", "fricassees", "fricatives", "friendless", "friendlier", "friendlies", "friendship", "frightened", "fripperies", "friskiness", "frittering", "frolicking", "frolicsome", "frontbench", "frostbites", "frostiness", "fructified", "fructifies", "fruitcakes", "fruiterers", "fruitfully", "frustrated", "frustrates", "fulfilling", "fulminated", "fulminates", "fumigating", "fumigation", "fumigators", "functional", "functioned", "funereally", "fungicidal", "fungicides", "funiculars", "furbishing", "furloughed", "furnishing", "furthering", "fusillades", "fussbudget", "futuristic", "futurities", "gabardines", "gainsaying", "gallerying", "gallivants", "gallstones", "galumphing", "gamekeeper", "gangplanks", "gangrening", "gangrenous", "gaolbreaks", "garbageman", "gargantuan", "garishness", "garlanding", "garlicking", "garnisheed", "garnishees", "garnishing", "garrisoned", "gasholders", "gasometers", "gastronome", "gastronomy", "gatehouses", "gatekeeper", "gatherings", "gaucheness", "gazetteers", "gazillions", "gearshifts", "gearwheels", "gelatinous", "generalist", "generality", "generating", "generation", "generative", "generators", "generosity", "generously", "geneticist", "genteelest", "gentlefolk", "gentleness", "gentrified", "gentrifies", "genuflects", "geocentric", "geographer", "geographic", "geological", "geologists", "geometries", "geophysics", "geothermal", "geriatrics", "germicidal", "germicides", "germinated", "germinates", "gesundheit", "ghastliest", "ghostliest", "ghostwrite", "ghostwrote", "giantesses", "gingersnap", "gingivitis", "girlfriend", "glaciation", "gladdening", "gladiators", "glasshouse", "glimmering", "glistening", "glitterati", "glittering", "gloatingly", "gloominess", "glorifying", "gloriously", "glossaries", "glossiness", "gluttonous", "goalkeeper", "goalmouths", "goalscorer", "goaltender", "gobsmacked", "gobstopper", "godfathers", "godmothers", "godparents", "goldbricks", "goldfields", "goldfishes", "goldsmiths", "gondoliers", "gooseberry", "goosesteps", "gorgeously", "governable", "governance", "government", "gracefully", "graciously", "gradations", "graduating", "graduation", "grammarian", "gramophone", "grandchild", "granddaddy", "grandstand", "granulated", "granulates", "grapefruit", "grapevines", "graphology", "grasslands", "grassroots", "gratefully", "gratifying", "gratuities", "gratuitous", "gravesides", "gravestone", "graveyards", "gravitated", "gravitates", "graybeards", "greasiness", "greatcoats", "greediness", "greenbacks", "greenfield", "greenflies", "greengages", "greenhorns", "greenhouse", "greensward", "gregarious", "grenadiers", "greyhounds", "gridlocked", "grievances", "grievously", "grindstone", "gristliest", "grizzliest", "grogginess", "grotesques", "grouchiest", "groundhogs", "groundings", "groundless", "groundnuts", "groundsman", "groundsmen", "groundwork", "grubbiness", "grudgingly", "gruesomely", "gruesomest", "grumblings", "grumpiness", "guaranteed", "guarantees", "guarantied", "guaranties", "guarantors", "guardhouse", "guardrails", "guardrooms", "guerrillas", "guesthouse", "guestrooms", "guidebooks", "guidelines", "guildhalls", "guillemots", "guillotine", "guiltiness", "guitarists", "gunfighter", "gunnysacks", "gunrunners", "gunrunning", "gunslinger", "gymnasiums", "gymnastics", "gymnosperm", "gyroscopes", "gyroscopic", "habitation", "habitually", "habituated", "habituates", "hackneying", "hacksawing", "hailstones", "hailstorms", "hairdryers", "hairpieces", "hairsprays", "hairspring", "hairstyles", "hallelujah", "hallmarked", "halterneck", "hamburgers", "hammerhead", "hammerings", "hamstrings", "handbagged", "handbrakes", "handcrafts", "handcuffed", "handedness", "handicraft", "handlebars", "handmaiden", "handpicked", "handshakes", "handsomely", "handsomest", "handspring", "handstands", "hankerings", "happenings", "haranguing", "harassment", "harbingers", "hardcovers", "hardheaded", "hardliners", "harlequins", "harmlessly", "harmonicas", "harmonious", "harnessing", "harpooning", "harrumphed", "harvesters", "harvesting", "hatchbacks", "hatcheries", "haughtiest", "hauntingly", "haversacks", "headbanger", "headboards", "headbutted", "headcheese", "headcounts", "headhunted", "headhunter", "headlights", "headliners", "headlining", "headmaster", "headphones", "headstones", "headstrong", "headwaiter", "headwaters", "healthiest", "hearkening", "heartaches", "heartbeats", "heartbreak", "heartbroke", "heartening", "hearthrugs", "heartiness", "heartlands", "heartthrob", "heathenish", "heatstroke", "heavenlier", "heavenward", "hectically", "hedonistic", "heedlessly", "heightened", "helicopter", "heliotrope", "helplessly", "hemisphere", "hemophilia", "hemorrhage", "hemorrhoid", "henceforth", "henpecking", "heptagonal", "heptathlon", "herbaceous", "herbalists", "herbicides", "herbivores", "hereabouts", "hereafters", "hereditary", "heretofore", "hermitages", "heroically", "hesitantly", "hesitating", "hesitation", "heterodoxy", "heuristics", "hexameters", "hibernated", "hibernates", "hibiscuses", "hieroglyph", "highchairs", "highlander", "highlights", "hightailed", "highwayman", "highwaymen", "hijackings", "hindrances", "hinterland", "hiphuggers", "histamines", "histograms", "historians", "historical", "histrionic", "hitchhiked", "hitchhiker", "hitchhikes", "hoarseness", "hobbyhorse", "hobgoblins", "hobnailing", "hobnobbing", "hodgepodge", "holidaying", "hollowness", "hollyhocks", "holocausts", "holographs", "holography", "holstering", "homebodies", "homecoming", "homeliness", "homemakers", "homeowners", "homesteads", "homeworker", "homoerotic", "homographs", "homophobia", "homophobic", "homophones", "homosexual", "honeycombs", "honeymoons", "honoraries", "honorarium", "honorifics", "hoodwinked", "hopelessly", "horizontal", "horoscopes", "horrendous", "horrifying", "horseboxes", "horseflies", "horsepower", "horseshoed", "horseshoes", "horsetails", "horsewhips", "horsewoman", "horsewomen", "hospitable", "hospitably", "hostelries", "hostessing", "hotchpotch", "hotfooting", "hothousing", "houseboats", "housebound", "housebreak", "housebroke", "houseclean", "housecoats", "houseflies", "households", "housemaids", "housemates", "houseplant", "houseproud", "housewares", "housewives", "hovercraft", "huckstered", "hullabaloo", "humaneness", "humanistic", "humanities", "humbleness", "humbugging", "humdingers", "humidified", "humidifier", "humidifies", "humiliated", "humiliates", "hummocking", "humorously", "humpbacked", "hunchbacks", "hundredths", "huntresses", "hurricanes", "husbanding", "hydrangeas", "hydraulics", "hydrofoils", "hydrolysis", "hydrometer", "hydroplane", "hydroponic", "hygienists", "hygrometer", "hyperbolas", "hyperbolic", "hyperlinks", "hyperspace", "hyphenated", "hyphenates", "hypnotists", "hypocrites", "hypodermic", "hypotenuse", "hypotheses", "hypothesis", "hysteresis", "hysterical", "icebreaker", "iconoclasm", "iconoclast", "idealistic", "identified", "identifier", "identifies", "identikits", "identities", "ideographs", "ideologies", "ideologist", "ideologues", "idolatrous", "ignominies", "ignorantly", "illegality", "illiteracy", "illiterate", "illuminate", "illumining", "illustrate", "imaginable", "imaginably", "imaginings", "imbalanced", "imbalances", "imbecility", "imbroglios", "imitations", "immaculate", "immaterial", "immaturely", "immaturity", "immemorial", "immersions", "immigrants", "immigrated", "immigrates", "imminently", "immobility", "immoderate", "immodestly", "immolating", "immolation", "immorality", "immortally", "immunology", "impairment", "impalement", "impalpable", "impassable", "impatience", "impeaching", "impeccable", "impeccably", "impediment", "impenitent", "imperative", "imperfects", "imperially", "impersonal", "impervious", "impishness", "implacable", "implacably", "implanting", "implements", "implicated", "implicates", "implicitly", "implosions", "impolitely", "importance", "importuned", "importunes", "imposingly", "imposition", "impossible", "impossibly", "impostures", "impotently", "impounding", "impoverish", "impregnate", "impresario", "impressing", "impression", "impressive", "imprimatur", "imprinting", "imprisoned", "improbable", "improbably", "impromptus", "improperly", "improvable", "improvised", "improvises", "imprudence", "impudently", "impurities", "imputation", "inaccuracy", "inaccurate", "inactivity", "inadequacy", "inadequate", "inamoratas", "inaugurals", "inaugurate", "inbounding", "inbreeding", "incapacity", "incarnated", "incarnates", "incautious", "incendiary", "incentives", "inceptions", "incestuous", "inchoating", "incidences", "incidental", "incinerate", "incisively", "incitement", "incivility", "inclemency", "inclusions", "incognitos", "incoherent", "incomplete", "inconstant", "increasing", "incredible", "incredibly", "increments", "incubating", "incubation", "incubators", "inculcated", "inculcates", "inculpated", "inculpates", "incumbency", "incumbents", "incurables", "incursions", "indecenter", "indecently", "indecision", "indecisive", "indecorous", "indefinite", "indelicacy", "indelicate", "indentured", "indentures", "indexation", "indicating", "indication", "indicative", "indicators", "indictable", "indictment", "indigenous", "indirectly", "indiscreet", "indisposed", "indistinct", "individual", "indolently", "inducement", "inductance", "inductions", "indulgence", "industrial", "industries", "inebriated", "inebriates", "ineducable", "inelegance", "ineligible", "ineptitude", "inequality", "inequities", "inevitable", "inevitably", "inexorable", "inexorably", "inexpertly", "infallible", "infallibly", "infamously", "infantries", "infarction", "infatuated", "infatuates", "infections", "infectious", "infelicity", "inferences", "infidelity", "infielders", "infighting", "infiltrate", "infinitely", "infinities", "infinitive", "infinitude", "inflatable", "inflecting", "inflection", "inflexible", "inflexibly", "inflexions", "inflicting", "infliction", "influenced", "influences", "informally", "informants", "infraction", "infrequent", "infringing", "infuriated", "infuriates", "inglenooks", "inglorious", "ingraining", "ingratiate", "ingredient", "inhabitant", "inhabiting", "inhalation", "inhalators", "inherently", "inheriting", "inheritors", "inhibiting", "inhibition", "inhumanely", "inhumanity", "inimically", "inimitable", "inimitably", "iniquities", "iniquitous", "initiating", "initiation", "initiative", "initiators", "injections", "injunction", "injustices", "innkeepers", "innocenter", "innocently", "innovating", "innovation", "innovative", "innovators", "innovatory", "innuendoed", "innumeracy", "innumerate", "inoculated", "inoculates", "inoperable", "inordinate", "inpatients", "inquietude", "inquisitor", "insanitary", "insatiable", "insatiably", "inscribing", "insecurely", "insecurity", "inseminate", "insensible", "insensibly", "insentient", "insertions", "insightful", "insinuated", "insinuates", "insipidity", "insistence", "insolently", "insolubles", "insolvable", "insolvency", "insolvents", "insomniacs", "insouciant", "inspecting", "inspection", "inspectors", "installing", "instancing", "instigated", "instigates", "instigator", "instilling", "instituted", "institutes", "instructed", "instructor", "instrument", "insularity", "insulating", "insulation", "insulators", "insurances", "insurgence", "insurgency", "insurgents", "intangible", "intangibly", "integrally", "integrated", "integrates", "integrator", "integument", "intellects", "intensives", "intentions", "intentness", "interacted", "interbreed", "interceded", "intercedes", "intercepts", "interdicts", "interested", "interfaced", "interfaces", "interfaith", "interfered", "interferes", "interferon", "interjects", "interlaced", "interlaces", "interlards", "interleave", "interlinks", "interlocks", "interloper", "interluded", "interludes", "intermarry", "interments", "intermezzi", "intermezzo", "internally", "internists", "internment", "internship", "interposed", "interposes", "interprets", "interrupts", "intersects", "interstate", "interstice", "intertwine", "interurban", "intervened", "intervenes", "interviews", "interweave", "interwoven", "intestinal", "intestines", "intimacies", "intimately", "intimating", "intimation", "intimidate", "intolerant", "intonation", "intoxicant", "intoxicate", "intramural", "intrepidly", "intriguing", "introduced", "introduces", "introverts", "intrusions", "intrusives", "intuitions", "inundating", "inundation", "invalidate", "invaliding", "invalidity", "invaluable", "invariable", "invariably", "inveighing", "inveigling", "inventions", "inversions", "investment", "inveterate", "invigilate", "invigorate", "invincible", "invincibly", "inviolable", "invitation", "invitingly", "invocation", "ionosphere", "iridescent", "ironically", "ironmonger", "irradiated", "irradiates", "irrational", "irregulars", "irrelevant", "irresolute", "irreverent", "irrigating", "irrigation", "irritating", "irritation", "irruptions", "isometrics", "isomorphic", "iterations", "itinerants", "jackbooted", "jackhammer", "jackknifed", "jackknifes", "jackknives", "jackrabbit", "jaggedness", "jailbreaks", "jailhouses", "janitorial", "jaundicing", "jauntiness", "jawbreaker", "jaywalkers", "jaywalking", "jealousies", "jellybeans", "jettisoned", "jingoistic", "jinrikisha", "jitterbugs", "jitteriest", "jobsworths", "jockstraps", "jocularity", "journalese", "journalism", "journalist", "journeying", "journeyman", "journeymen", "joyfullest", "joyfulness", "joyousness", "jubilantly", "jubilation", "judicature", "judicially", "juggernaut", "julienning", "justifying", "juxtaposed", "juxtaposes", "kangarooed", "keelhauled", "kerchiefed", "kerfuffles", "kettledrum", "keyboarded", "keyboarder", "keypunched", "keypunches", "keystroked", "keystrokes", "kickboxing", "kickstands", "kidnappers", "kidnapping", "kilocycles", "kindliness", "kindnesses", "kinematics", "kingfisher", "kingmakers", "kissograms", "kitchening", "knackering", "knackwurst", "kneecapped", "knickknack", "knighthood", "knockabout", "knowingest", "kohlrabies", "kookaburra", "laboratory", "labyrinths", "lacerating", "laceration", "lachrymose", "lacquering", "ladyfinger", "lagniappes", "lamaseries", "lambasting", "lamebrains", "lamentable", "lamentably", "laminating", "lamination", "lampooning", "lampshades", "landholder", "landladies", "landlocked", "landlubber", "landmasses", "landowners", "landowning", "landscaped", "landscaper", "landscapes", "landslides", "languished", "languishes", "languorous", "lapidaries", "laryngitis", "lascivious", "latecomers", "lateraling", "laughingly", "launderers", "laundering", "laundrette", "laundromat", "laundryman", "laundrymen", "laureating", "lavatorial", "lavatories", "lavendered", "lavishness", "lawbreaker", "lawfulness", "lawnmowers", "lawrencium", "laypersons", "leadership", "leafleting", "leasebacks", "leaseholds", "legalistic", "legalities", "legibility", "legislated", "legislates", "legislator", "legitimacy", "legitimate", "leguminous", "legwarmers", "leitmotifs", "leitmotivs", "lemongrass", "lengthened", "lengthiest", "lengthwise", "leprechaun", "lesbianism", "letterhead", "leukocytes", "leveraging", "leviathans", "levitating", "levitation", "liberalism", "liberality", "liberating", "liberation", "liberators", "libertines", "libidinous", "librarians", "librettist", "licentiate", "licentious", "lieutenant", "lifeguards", "lifesavers", "lifesaving", "lifestyles", "ligaturing", "lightening", "lighthouse", "lightnings", "lightships", "likelihood", "likenesses", "limelights", "limitation", "limousines", "lineaments", "linebacker", "lingerings", "linguistic", "lipreading", "lipsticked", "liquefying", "liqueuring", "liquidated", "liquidates", "liquidator", "liquorices", "listenable", "listlessly", "literature", "lithograph", "litigating", "litigation", "litigators", "litterbugs", "littleness", "liturgical", "livability", "livelihood", "liveliness", "liverwurst", "lobotomies", "lobstering", "localities", "locksmiths", "locomotion", "locomotive", "lodestones", "loganberry", "logarithms", "loggerhead", "logistical", "logrolling", "loincloths", "loneliness", "longhouses", "longitudes", "lookalikes", "lopsidedly", "loquacious", "lorgnettes", "loudhailer", "loudmouths", "loveliness", "lovemaking", "lowlanders", "lubricants", "lubricated", "lubricates", "lubricator", "lubricious", "lugubrious", "lumberjack", "lumberyard", "luminaries", "luminosity", "luminously", "lumpectomy", "lunchboxes", "luncheoned", "lunchrooms", "lunchtimes", "lusciously", "luxuriance", "luxuriated", "luxuriates", "lymphatics", "macadamias", "macerating", "maceration", "machinists", "mackintosh", "macrocosms", "maelstroms", "magistracy", "magistrate", "magnifiers", "magnifying", "magnitudes", "maharajahs", "maharishis", "mahoganies", "maidenhair", "maidenhead", "maidenhood", "mainframes", "mainlining", "mainspring", "mainstream", "maintained", "maintainer", "maisonette", "majordomos", "majorettes", "majorities", "makeshifts", "makeweight", "malcontent", "malefactor", "malevolent", "malignancy", "malignants", "malingered", "malingerer", "malodorous", "maltreated", "mammalians", "mammograms", "manageable", "management", "manageress", "managerial", "mangetouts", "manhandled", "manhandles", "maniacally", "manicuring", "manicurist", "manifested", "manifestly", "manifestos", "manifolded", "manipulate", "mannequins", "mannerisms", "manservant", "manumitted", "manuscript", "maraschino", "marathoner", "margaritas", "marginalia", "marginally", "marinading", "marinating", "marionette", "marketable", "marketeers", "marquesses", "marshaling", "marshlands", "marsupials", "mascaraing", "masculines", "masochists", "masquerade", "massacring", "mastectomy", "mastermind", "masterwork", "masticated", "masticates", "masturbate", "matchbooks", "matchboxes", "matchmaker", "matchstick", "materially", "maternally", "matriarchs", "matriarchy", "matricides", "mattresses", "maturation", "maturities", "maundering", "mausoleums", "mavericked", "mayflowers", "mayonnaise", "mayoresses", "meadowlark", "meagerness", "meandering", "meaningful", "measurable", "measurably", "meatloaves", "mechanical", "mechanisms", "medallions", "meddlesome", "medicating", "medication", "medicinals", "mediocrity", "meditating", "meditation", "meditative", "megacycles", "megalithic", "megaphoned", "megaphones", "melancholy", "mellowness", "melodramas", "membership", "membranous", "memorandum", "menacingly", "menageries", "mendacious", "mendicants", "meningitis", "menopausal", "menstruate", "mentioning", "mercantile", "merchanted", "mercifully", "mergansers", "merrymaker", "messengers", "metabolism", "metacarpal", "metacarpus", "metallurgy", "metastases", "metastasis", "metatarsal", "meteorites", "meteoroids", "methodical", "meticulous", "metrically", "metronomes", "metropolis", "mettlesome", "mezzanines", "microchips", "microcosms", "microfiche", "microfilms", "microlight", "microphone", "microscope", "microscopy", "microwaved", "microwaves", "middlebrow", "midfielder", "midsection", "midshipman", "midshipmen", "mightiness", "migrations", "mileometer", "milestones", "militantly", "militarily", "militarism", "militarist", "militating", "militiaman", "militiamen", "milkshakes", "millennial", "millennium", "millionths", "millipedes", "millstones", "milometers", "mimeograph", "mindedness", "mindlessly", "minefields", "mineralogy", "minestrone", "miniatured", "miniatures", "minimalism", "minimalist", "miniseries", "miniskirts", "ministered", "ministrant", "ministries", "minorities", "minuscules", "minuteness", "miraculous", "mirthfully", "misapplied", "misapplies", "misbehaved", "misbehaves", "miscalling", "miscarried", "miscarries", "miscasting", "miscellany", "mischanced", "mischances", "mischiefed", "misconduct", "miscounted", "miscreants", "misdealing", "misdirects", "miserables", "misfitting", "misfortune", "misgivings", "misgoverns", "misguiding", "mishandled", "mishandles", "mishapping", "mishearing", "mishitting", "mishmashes", "misinforms", "misjudging", "misleading", "mismanaged", "mismanages", "mismatched", "mismatches", "misnomered", "misogynist", "misplacing", "misplaying", "misprinted", "misquoting", "misreading", "misreports", "missionary", "missioning", "misspelled", "misstating", "misstepped", "mistakenly", "mistreated", "mistresses", "mistrusted", "mitigating", "mitigation", "mizzenmast", "moderately", "moderating", "moderation", "moderators", "modernists", "modifiable", "modulating", "modulation", "modulators", "moistening", "mollifying", "molybdenum", "monarchies", "monarchism", "monarchist", "monetarily", "monetarism", "monetarist", "moneyboxes", "moneymaker", "monitoring", "monochrome", "monogamous", "monographs", "monolithic", "monologued", "monologues", "monomaniac", "monophonic", "monoplanes", "monopolies", "monopolist", "monotheism", "monotheist", "monotoning", "monotonous", "monsignors", "monstrance", "monumental", "moonlights", "moonscapes", "moonshines", "moonstones", "moonstruck", "moralistic", "moralities", "moratorium", "moroseness", "morpheming", "morphology", "mortgagees", "mortgaging", "mortgagors", "morticians", "mortifying", "mortuaries", "mosquitoes", "mothballed", "motherhood", "motherland", "motherless", "motionless", "motivating", "motivation", "motivators", "motiveless", "motorbiked", "motorbikes", "motorboats", "motorcades", "motorcycle", "motormouth", "mouldering", "mountebank", "mournfully", "mousetraps", "mouthpiece", "moviegoers", "mozzarella", "muckrakers", "muckraking", "mudslinger", "mujaheddin", "mulberries", "mulishness", "multimedia", "multiparty", "multiplied", "multiplier", "multiplies", "multitudes", "mummifying", "municipals", "munificent", "murmurings", "mushroomed", "musicality", "musicology", "musketeers", "muskmelons", "mutability", "mutilating", "mutilation", "mutineered", "mutinously", "mutterings", "myopically", "mysterious", "mysterying", "mystically", "mystifying", "nameplates", "nanosecond", "narcissism", "narcissist", "narcolepsy", "narrations", "narratives", "narrowness", "nasturtium", "nationally", "nationhood", "nationwide", "nativities", "naturalism", "naturalist", "naughtiest", "nauseating", "nauseously", "nautically", "nautiluses", "navigating", "navigation", "navigators", "necklacing", "necromancy", "necropolis", "nectarines", "needlessly", "needlework", "negatively", "negativing", "negativity", "neglectful", "neglecting", "negligence", "negligible", "negligibly", "negotiable", "negotiated", "negotiates", "negotiator", "neoclassic", "neologisms", "nepotistic", "nethermost", "nettlesome", "networking", "neutralist", "neutrality", "newfangled", "newsagents", "newscaster", "newsgroups", "newshounds", "newsletter", "newspapers", "newsreader", "newsstands", "newsworthy", "nicknaming", "niggarding", "nightclubs", "nightdress", "nightgowns", "nighthawks", "nightlight", "nightmares", "nightshade", "nightshirt", "nightspots", "nightstand", "nightstick", "nihilistic", "nimbleness", "nincompoop", "nineteenth", "ninetieths", "nitpickers", "nitpicking", "noblewoman", "noblewomen", "noisemaker", "nominating", "nomination", "nominative", "nonaligned", "nonchalant", "nondrinker", "nonesuches", "nonfiction", "nonmembers", "nonpareils", "nonpayment", "nonplussed", "nonprofits", "nonsmokers", "nonsmoking", "nonstarter", "nonsupport", "nontaxable", "nontrivial", "nonviolent", "northbound", "northerner", "northwards", "nosebleeds", "nosediving", "nostalgics", "noteworthy", "noticeable", "noticeably", "notifiable", "notionally", "nourishing", "novelettes", "novitiates", "nullifying", "numberless", "numerating", "numeration", "numerators", "numerology", "numismatic", "nursemaids", "nurseryman", "nurserymen", "nutcracker", "nuthatches", "nutmegging", "nutriments", "nutritious", "oafishness", "obdurately", "obdurating", "obediently", "obeisances", "obfuscated", "obfuscates", "obituaries", "objections", "objectives", "obligating", "obligation", "obligatory", "obligingly", "obliterate", "obsequious", "observable", "observably", "observance", "obsessions", "obsessives", "obsoleting", "obstetrics", "obstructed", "obtainable", "obtuseness", "occasional", "occasioned", "occidental", "occlusions", "occultists", "occupation", "occurrence", "oceanfront", "oceangoing", "offensives", "officially", "officiated", "officiates", "offloading", "offsetting", "oftentimes", "oleaginous", "oligarchic", "omnipotent", "omniscient", "omnivorous", "oncologist", "onslaughts", "opalescent", "opaqueness", "openhanded", "operations", "operatives", "ophthalmic", "opposition", "oppressing", "oppression", "oppressive", "oppressors", "opprobrium", "optimistic", "optionally", "orangeades", "orangeness", "orangeries", "orangutans", "oratorical", "orchestral", "orchestras", "ordinances", "ordinarier", "ordinaries", "ordinarily", "ordination", "organelles", "orientated", "orientates", "originally", "originated", "originates", "originator", "ornamental", "ornamented", "ornateness", "orphanages", "orthodoxes", "orthogonal", "oscillated", "oscillates", "oscillator", "ostensible", "ostensibly", "osteopaths", "osteopathy", "outbalance", "outbidding", "outcasting", "outclassed", "outclasses", "outcropped", "outfielder", "outfitters", "outfitting", "outflanked", "outgrowing", "outgrowths", "outguessed", "outguesses", "outgunning", "outlandish", "outlasting", "outlooking", "outnumbers", "outpatient", "outperform", "outplaying", "outpointed", "outpouring", "outputting", "outrageous", "outranking", "outreached", "outreaches", "outriggers", "outrunning", "outselling", "outsetting", "outshining", "outsmarted", "outsourced", "outsources", "outspreads", "outstation", "outstaying", "outstretch", "outwearing", "outweighed", "outwitting", "outworkers", "overacting", "overactive", "overbooked", "overburden", "overcharge", "overcoming", "overcooked", "overcrowds", "overdosing", "overdrafts", "overdrives", "overeating", "overexcite", "overexpose", "overextend", "overflight", "overflowed", "overflying", "overground", "overgrowth", "overhauled", "overheated", "overjoying", "overkilled", "overlapped", "overlaying", "overloaded", "overlooked", "overmanned", "overmuches", "overnights", "overpasses", "overpaying", "overplayed", "overpowers", "overpriced", "overprices", "overprints", "overrating", "overreacts", "overridden", "overriding", "overruling", "overseeing", "overshadow", "overshoots", "oversights", "oversizing", "oversleeps", "overspends", "overspread", "overstated", "overstates", "overstayed", "overstocks", "oversupply", "overtaking", "overtaxing", "overthrown", "overthrows", "overtiring", "overturned", "overvalued", "overvalues", "overweight", "overwhelms", "overwinter", "overworked", "overwrites", "oxygenated", "oxygenates", "pacemakers", "pacesetter", "pachyderms", "paddocking", "padlocking", "paederasts", "paginating", "pagination", "painfuller", "painkiller", "painlessly", "paintboxes", "paintbrush", "palavering", "palimpsest", "palindrome", "pallbearer", "palliating", "palliation", "palliative", "palpitated", "palpitates", "paltriness", "panatellas", "pancreases", "pancreatic", "panegyrics", "panellists", "panhandled", "panhandler", "panhandles", "panickiest", "pantaloons", "pantheists", "pantomimed", "pantomimes", "paperbacks", "paperbarks", "paperclips", "papergirls", "parachuted", "parachutes", "paragraphs", "paralegals", "parallaxes", "paralytics", "paramecium", "paramedics", "parameters", "paranoiacs", "paranormal", "paraphrase", "paraplegia", "paraplegic", "paratroops", "parboiling", "parchments", "pardonable", "pardonably", "parenthood", "parliament", "parqueting", "parricides", "parsonages", "partiality", "participle", "particular", "partitions", "partitives", "partnering", "partridges", "passageway", "passengers", "passionate", "passioning", "passivised", "passivises", "passivized", "passivizes", "pasteboard", "pastorates", "patchiness", "patchworks", "paternally", "pathfinder", "pathogenic", "patientest", "patisserie", "patriarchs", "patriarchy", "patricians", "patricides", "patriotism", "patrolling", "patronages", "patronymic", "patterning", "paunchiest", "pavemented", "pawnbroker", "paymasters", "peacefully", "peacemaker", "peashooter", "peccadillo", "peculiarly", "pedagogics", "pedagogued", "pedagogues", "pedestrian", "pediatrics", "pedicuring", "pedometers", "pejorative", "pekingeses", "penetrable", "penetrated", "penetrates", "penfriends", "penicillin", "peninsular", "peninsulas", "penitently", "penmanship", "pennyworth", "penologist", "pensioners", "pensioning", "pentagonal", "pentameter", "pentathlon", "penthoused", "penthouses", "peppercorn", "peppermint", "pepperonis", "perceiving", "percentage", "percentile", "perception", "perceptive", "perceptual", "percipient", "percolated", "percolates", "percolator", "percussion", "percussive", "peregrines", "peremptory", "perennials", "perfectest", "perfecting", "perfection", "perfidious", "perforated", "perforates", "performers", "performing", "pericardia", "perihelion", "perilously", "perimeters", "periodical", "peripheral", "periscoped", "periscopes", "perishable", "peritoneum", "periwigged", "periwinkle", "permafrost", "permanence", "permanency", "permanents", "permeating", "permeation", "permission", "permissive", "permitting", "pernicious", "peroration", "peroxiding", "perpetrate", "perpetuals", "perpetuate", "perpetuity", "perplexing", "perplexity", "perquisite", "persecuted", "persecutes", "persecutor", "persevered", "perseveres", "persiflage", "persimmons", "persistent", "persisting", "personable", "personages", "personally", "perspiring", "persuading", "persuasion", "persuasive", "pertaining", "pertinence", "pertinents", "perturbing", "perversely", "perversion", "perversity", "perverting", "pessimists", "pesticides", "pestilence", "petitioned", "petitioner", "petrifying", "petrolatum", "petticoats", "petulantly", "phagocytes", "pharmacies", "pharmacist", "pharyngeal", "phenomenal", "phenomenas", "phenomenon", "pheromones", "philanders", "philatelic", "philippics", "philistine", "philosophy", "phlegmatic", "phonecards", "phonically", "phonograph", "phosphates", "phosphoric", "phosphorus", "photocells", "photogenic", "photograph", "photostats", "phrasebook", "phrenology", "physically", "physicians", "physicists", "physicking", "physiology", "pianissimo", "pianoforte", "picaresque", "piccalilli", "pickpocket", "picnickers", "picnicking", "pictograph", "pictorials", "piercingly", "pigeonhole", "piggybacks", "pilgrimage", "pillioning", "pillorying", "pillowcase", "pillowslip", "pilothouse", "pimpernels", "pincushion", "pineapples", "pinfeather", "pinpointed", "pinpricked", "pinstriped", "pinstripes", "pinwheeled", "pioneering", "pipsqueaks", "pirouetted", "pirouettes", "pistachios", "pistillate", "pitchforks", "pitifuller", "pitilessly", "placarding", "placements", "placentals", "plagiarism", "plagiarist", "plainchant", "plaintiffs", "planeloads", "plantation", "plasterers", "plastering", "plasticity", "plateauing", "platformed", "platitudes", "platooning", "platypuses", "playacting", "playground", "playgroups", "playhouses", "playschool", "playthings", "playwright", "pleadingly", "pleasanter", "pleasantly", "pleasantry", "pleasingly", "pleasuring", "plebiscite", "plenitudes", "pliability", "plottering", "pluckiness", "plummeting", "plunderers", "plundering", "pluperfect", "pluralists", "plutocracy", "plutocrats", "pocketbook", "pocketfuls", "pockmarked", "podiatrist", "poetically", "poignantly", "poinsettia", "poisonings", "polarities", "polemicist", "politburos", "politeness", "politician", "politicked", "pollinated", "pollinates", "pollutants", "polonaises", "polyesters", "polygamist", "polygamous", "polygraphs", "polyhedron", "polynomial", "polyphonic", "polysemous", "polytheism", "polytheist", "pompadours", "pontifical", "pontooning", "poorhouses", "popularity", "populating", "population", "porcelains", "porcupines", "porpoising", "porringers", "portcullis", "portending", "portentous", "portfolios", "portioning", "portliness", "portrayals", "portraying", "positional", "positioned", "positively", "positivest", "positivism", "positivist", "possessing", "possession", "possessive", "possessors", "possiblest", "postdating", "posteriors", "posthumous", "postmarked", "postmaster", "postmodern", "postmortem", "postpartum", "postponing", "postscript", "postseason", "postulated", "postulates", "potbellied", "potbellies", "potboilers", "potentates", "potentials", "potholders", "potpourris", "poulticing", "powerboats", "powerfully", "powerhouse", "practicals", "pragmatics", "pragmatism", "pragmatist", "pranksters", "preachiest", "preambling", "prearrange", "precarious", "precaution", "precedence", "precedents", "preceptors", "preciosity", "preciously", "precipices", "precluding", "preclusion", "precocious", "precooking", "precursors", "predecease", "predefined", "predestine", "predicated", "predicates", "predicting", "prediction", "predictive", "predictors", "predigests", "predispose", "preeminent", "preempting", "preemption", "preemptive", "preexisted", "prefabbing", "prefecture", "preferable", "preferably", "preference", "preferment", "preferring", "prefigured", "prefigures", "preheating", "prehensile", "prehistory", "prejudging", "prejudiced", "prejudices", "premarital", "premiering", "preordains", "prepackage", "prepayment", "prepossess", "prerecords", "presbytery", "preschools", "prescience", "prescribed", "prescribes", "presenters", "presenting", "preservers", "preserving", "presetting", "preshrinks", "presidency", "presidents", "pressuring", "presumable", "presumably", "presuppose", "pretenders", "pretending", "pretexting", "prettified", "prettifies", "prettiness", "prevailing", "prevalence", "prevalents", "preventing", "prevention", "preventive", "previewers", "previewing", "previously", "prickliest", "priesthood", "priestlier", "primitives", "primordial", "primrosing", "princelier", "princesses", "principals", "principled", "principles", "prioresses", "priorities", "prissiness", "privateers", "privations", "privileged", "privileges", "prizefight", "procedural", "procedures", "proceeding", "processing", "procession", "processors", "proclaimed", "proclivity", "procreated", "procreates", "proctoring", "procurator", "prodigally", "prodigious", "production", "productive", "professing", "profession", "professors", "proffering", "proficient", "profitable", "profitably", "profiteers", "profligacy", "profligate", "profounder", "profoundly", "profundity", "profusions", "progenitor", "prognostic", "programmer", "progressed", "progresses", "prohibited", "projectile", "projecting", "projection", "projectors", "prolapsing", "prolonging", "promenaded", "promenades", "prominence", "promissory", "promontory", "promotions", "promptings", "promptness", "promulgate", "pronghorns", "pronominal", "pronounced", "pronounces", "proofreads", "propaganda", "propagated", "propagates", "propagator", "propellant", "propellers", "propelling", "propensity", "propertied", "properties", "prophecies", "prophesied", "prophesies", "prophetess", "propitiate", "propitious", "proponents", "proportion", "propounded", "proprietor", "propulsion", "propulsive", "proscenium", "prosciutto", "proscribed", "proscribes", "prosecuted", "prosecutes", "prosecutor", "proselyted", "proselytes", "prospected", "prospector", "prospectus", "prospering", "prosperity", "prosperous", "prostheses", "prosthesis", "prosthetic", "prostitute", "prostrated", "prostrates", "protecting", "protection", "protective", "protectors", "protestant", "protesters", "protesting", "protoplasm", "prototypes", "protozoans", "protracted", "protractor", "protruding", "protrusion", "provenance", "provenders", "proverbial", "providence", "provincial", "provisions", "prudential", "pruriently", "psephology", "pseudonyms", "psychiatry", "psychology", "psychopath", "psychotics", "ptarmigans", "pubescence", "publicists", "publishers", "publishing", "pugilistic", "pugnacious", "pulsations", "punchlines", "punctually", "punctuated", "punctuates", "puncturing", "punishable", "punishment", "punitively", "puppeteers", "purchasers", "purchasing", "purgatives", "puritanism", "purloining", "purporting", "purposeful", "pushchairs", "pussyfoots", "putrefying", "putrescent", "puzzlement", "pyramiding", "pyromaniac", "quadrangle", "quadrature", "quadriceps", "quadrilled", "quadrilles", "quadrupeds", "quadrupled", "quadruples", "quadruplet", "quagmiring", "quaintness", "qualifiers", "qualifying", "quandaries", "quantified", "quantifier", "quantifies", "quantities", "quarantine", "quartering", "queasiness", "queenliest", "questioned", "questioner", "quickening", "quicksands", "quicksteps", "quiescence", "quietening", "quintupled", "quintuples", "quintuplet", "quotations", "rabbinical", "racecourse", "racehorses", "racetracks", "racialists", "racketeers", "raconteurs", "radiations", "radicalism", "radiograms", "ragamuffin", "raggediest", "raggedness", "railleries", "railroaded", "railwayman", "railwaymen", "rainmakers", "rainstorms", "rakishness", "ramrodding", "ramshackle", "randomness", "ransacking", "rappelling", "rapporteur", "ratcheting", "ratepayers", "rationales", "rationally", "rattletrap", "raunchiest", "ravenously", "ravishment", "razzmatazz", "reactivate", "readership", "readjusted", "readmitted", "reaffirmed", "realigning", "reallocate", "reanimated", "reanimates", "reappeared", "reapplying", "reappoints", "reappraise", "rearmament", "rearranged", "rearranges", "reasonable", "reasonably", "reassemble", "reasserted", "reassessed", "reassesses", "reassigned", "reassuring", "reawakened", "rebellions", "rebellious", "rebounding", "rebuilding", "recaptured", "recaptures", "receipting", "receivable", "receptacle", "receptions", "recessions", "recessives", "recharging", "rechecking", "recidivism", "recidivist", "recipients", "reciprocal", "recitation", "recitative", "recklessly", "reckonings", "reclaiming", "reclassify", "recollects", "recombined", "recombines", "recommence", "recommends", "recompense", "recompiled", "reconciled", "reconciles", "reconnects", "reconquers", "reconsider", "reconvened", "reconvenes", "recordings", "recounting", "recoveries", "recovering", "recreating", "recreation", "recruiters", "recruiting", "rectangles", "rectifiers", "rectifying", "recuperate", "recurrence", "recyclable", "redbreasts", "redcurrant", "redecorate", "rededicate", "redeemable", "redefining", "redemption", "redemptive", "redeployed", "redesigned", "redevelops", "redirected", "rediscover", "redistrict", "redoubling", "redoubting", "redounding", "redrafting", "redressing", "reductions", "redundancy", "reeducated", "reeducates", "reelecting", "reelection", "reemerging", "reenacting", "reenlisted", "reentering", "reevaluate", "reexamined", "reexamines", "refashions", "refereeing", "referenced", "references", "referendum", "refillable", "refinanced", "refinances", "refinement", "refineries", "refinished", "refinishes", "reflations", "reflecting", "reflection", "reflective", "reflectors", "reflexives", "refocusing", "reforested", "reformists", "refracting", "refraction", "refractory", "refraining", "refreshers", "refreshing", "refulgence", "refundable", "refutation", "regardless", "regenerate", "regimental", "regimented", "regionally", "registered", "registrant", "registrars", "registries", "regressing", "regression", "regressive", "regretting", "regrouping", "regularity", "regulating", "regulation", "regulators", "regulatory", "rehearsals", "rehearsing", "reimbursed", "reimburses", "reimposing", "reinforced", "reinforces", "reinserted", "reinstated", "reinstates", "reinvented", "reinvested", "reiterated", "reiterates", "rejections", "rejiggered", "rejoicings", "rejoinders", "rejuvenate", "rekindling", "relational", "relatively", "relativism", "relativist", "relativity", "relaunched", "relaunches", "relaxation", "relearning", "releasable", "relegating", "relegation", "relentless", "relevantly", "relinquish", "relocating", "relocation", "reluctance", "remainders", "remarkable", "remarkably", "remarriage", "remarrying", "remastered", "remediable", "remembered", "reminisced", "reminisces", "remissions", "remissness", "remittance", "remorseful", "remortgage", "remoteness", "remoulding", "remounting", "removables", "remunerate", "renascence", "renderings", "rendezvous", "renditions", "renegading", "renouncing", "renovating", "renovation", "renovators", "renumbered", "reoccupied", "reoccupies", "reoccurred", "reordering", "repackaged", "repackages", "repainting", "repairable", "reparation", "repatriate", "repayments", "repeatable", "repeatably", "repeatedly", "repellents", "repentance", "repentants", "repertoire", "repetition", "repetitive", "rephrasing", "replicated", "replicates", "reportedly", "repository", "reprehends", "represents", "repressing", "repression", "repressive", "reprieving", "reprimands", "reprinting", "reproached", "reproaches", "reprobates", "reproduced", "reproduces", "reproofing", "reptilians", "republican", "repudiated", "repudiates", "repugnance", "reputation", "requesting", "requisites", "reschedule", "rescinding", "rescission", "researched", "researcher", "researches", "resembling", "resentment", "reservedly", "reservists", "reservoirs", "resettling", "reshuffled", "reshuffles", "residences", "resignedly", "resilience", "resiliency", "resistance", "resolutely", "resolutest", "resolution", "resonances", "resonantly", "resonating", "resonators", "resounding", "resourcing", "respecters", "respectful", "respecting", "respective", "respelling", "respirator", "respondent", "responding", "responsive", "restarting", "restaurant", "restfuller", "restlessly", "restocking", "restrained", "restraints", "restricted", "restudying", "resultants", "resumption", "resupplied", "resupplies", "resurfaced", "resurfaces", "resurgence", "resurrects", "retaliated", "retaliates", "retardants", "rethinking", "reticently", "retirement", "retouching", "retracting", "retraction", "retraining", "retreading", "retreating", "retrenched", "retrenches", "retrievals", "retrievers", "retrieving", "retrograde", "retrogress", "retrospect", "returnable", "reunifying", "revealings", "revelation", "revengeful", "reverenced", "reverences", "reverently", "reversible", "reversions", "revilement", "revisiting", "revivalism", "revivalist", "revivified", "revivifies", "revocation", "revolution", "rewindable", "reworkings", "rhapsodies", "rhetorical", "rheumatics", "rheumatism", "rhinestone", "rhinoceros", "rhythmical", "riboflavin", "ricketiest", "ricocheted", "ridgepoles", "ridiculing", "ridiculous", "rightfully", "rightwards", "rigmaroles", "rigorously", "ringleader", "ringmaster", "riverfront", "riversides", "roadblocks", "roadhouses", "roadrunner", "roadworthy", "robustness", "rockabilly", "roisterers", "roistering", "rollicking", "rosebushes", "rotational", "rotisserie", "rottenness", "rottweiler", "rotundness", "roughening", "roughhouse", "roughnecks", "roundabout", "roundelays", "roundhouse", "roundworms", "roustabout", "rubberiest", "rubberneck", "rubbishing", "rudderless", "ruffianing", "ruggedness", "ruminating", "rumination", "ruminative", "runarounds", "russetting", "rustically", "rustproofs", "ruthlessly", "sabbatical", "sabotaging", "saccharine", "sacerdotal", "sacraments", "sacredness", "sacrificed", "sacrifices", "sacrileges", "sacristans", "sacristies", "sacrosanct", "saddlebags", "safeguards", "safflowers", "sailboards", "sailfishes", "saintliest", "salamander", "salesclerk", "salesgirls", "salesrooms", "saleswoman", "saleswomen", "salivating", "salivation", "sallowness", "salmonella", "saltcellar", "saltshaker", "salubrious", "salutation", "sanatorium", "sanctified", "sanctifies", "sanctioned", "sandalwood", "sandbagged", "sandblasts", "sandcastle", "sandpapers", "sandpipers", "sandstorms", "sandwiched", "sandwiches", "sanguinary", "sanguining", "sanitaries", "sanitarium", "sanitation", "saprophyte", "sapsuckers", "sarcophagi", "satellited", "satellites", "satinwoods", "satisfying", "saturating", "saturation", "sauerkraut", "sauntering", "savageness", "savageries", "sawdusting", "saxophones", "scalloping", "scallywags", "scampering", "scandalous", "scantiness", "scapegoats", "scarceness", "scarcities", "scarecrows", "scarifying", "scarlatina", "scarleting", "scarpering", "scathingly", "scattering", "scavengers", "scavenging", "scenically", "schedulers", "scheduling", "schematics", "schismatic", "schlemiels", "schlepping", "schlockier", "schmoozers", "schmoozing", "schnauzers", "schnitzels", "scholastic", "schoolbags", "schoolbook", "schoolboys", "schooldays", "schoolgirl", "schoolkids", "schoolmarm", "schoolmate", "schoolroom", "schoolwork", "schoolyard", "scientific", "scientists", "scintillas", "sclerotics", "scoreboard", "scorecards", "scorelines", "scornfully", "scoundrels", "scrabbling", "scraggiest", "scragglier", "scramblers", "scrambling", "scrapbooks", "scrapheaps", "scrappiest", "scrapyards", "scratchier", "scratching", "scratchpad", "scrawniest", "screechier", "screeching", "screenings", "screenplay", "screwballs", "scribblers", "scribbling", "scrimmaged", "scrimmages", "scrimshaws", "scriptural", "scriptures", "scroungers", "scrounging", "scrubbiest", "scruffiest", "scrummages", "scrunchies", "scrunching", "scrupulous", "scrutineer", "sculleries", "sculptural", "sculptured", "sculptures", "scuppering", "scurrilous", "seamanship", "seamlessly", "seamstress", "seasonable", "seasonally", "seasonings", "secondhand", "secondment", "secretions", "sectarians", "sectionals", "sectioning", "secularism", "secularist", "securities", "seductions", "seductress", "seemliness", "seersucker", "segmenting", "segregated", "segregates", "seismology", "selections", "selflessly", "sellotaped", "sellotapes", "semaphored", "semaphores", "semblances", "semiannual", "semibreves", "semicircle", "semicolons", "semifinals", "seminarian", "seminaries", "semiquaver", "semivowels", "semiweekly", "senatorial", "senescence", "sensations", "sensiblest", "sensitives", "sensuality", "sensuously", "sentencing", "sentiments", "separately", "separating", "separation", "separatism", "separatist", "separators", "sepulchral", "sequencers", "sequencing", "sequential", "sequesters", "serenading", "sereneness", "serpentine", "serpenting", "servanting", "serviceman", "servicemen", "serviettes", "setsquares", "settlement", "seventeens", "seventieth", "severances", "sexologist", "sextuplets", "shabbiness", "shadowiest", "shagginess", "shakedowns", "shallowest", "shamefaced", "shamefully", "shampooing", "shanghaied", "shantytown", "shapeliest", "sharpeners", "sharpening", "shattering", "sheathings", "sheepfolds", "sheepishly", "sheepskins", "shellacked", "sheltering", "shenanigan", "shepherded", "shibboleth", "shiftiness", "shillelagh", "shimmering", "shipboards", "shipowners", "shipwrecks", "shipwright", "shirttails", "shirtwaist", "shockingly", "shockproof", "shoddiness", "shoehorned", "shoemakers", "shoeshines", "shoestring", "shopaholic", "shopfitter", "shopfronts", "shopkeeper", "shoplifted", "shoplifter", "shorelines", "shortbread", "shortcakes", "shortcrust", "shortening", "shortfalls", "shorthorns", "shortlists", "shortstops", "shortwaves", "shotgunned", "shouldered", "shovelfuls", "showboated", "showcasing", "showeriest", "showground", "showpieces", "showplaces", "shrewdness", "shrillness", "shrinkable", "shrubbiest", "shuddering", "shutterbug", "shuttering", "sickenings", "sicknesses", "sideboards", "sidelights", "sidelining", "sidesaddle", "sidestroke", "sideswiped", "sideswipes", "sidetracks", "sightseers", "signatures", "signboards", "signifying", "signposted", "silhouette", "silverfish", "silveriest", "silverware", "similarity", "simpleness", "simpletons", "simplicity", "simplified", "simplifies", "simplistic", "simulacrum", "simulating", "simulation", "simulators", "simulcasts", "sinfulness", "singalongs", "singleness", "singletons", "singsonged", "singularly", "sinusoidal", "sisterhood", "situations", "sixteenths", "skateboard", "skedaddled", "skedaddles", "sketchbook", "sketchiest", "sketchpads", "skillfully", "skimpiness", "skinflints", "skinniness", "skippering", "skirmished", "skirmisher", "skirmishes", "skittering", "skittishly", "skyjackers", "skyjacking", "skylarking", "skyrockets", "skyscraper", "skywriters", "skywriting", "slackening", "slanderers", "slandering", "slanderous", "slapdashes", "slathering", "slatternly", "slaughters", "sleazebags", "sleazeball", "sleaziness", "sleepiness", "sleepovers", "sleepwalks", "sleepyhead", "sleeveless", "slenderest", "slightness", "slingbacks", "slingshots", "slipcovers", "slipperier", "slipstream", "slithering", "slobbering", "sloppiness", "slouchiest", "slovenlier", "sluggishly", "slumbering", "slumberous", "smartening", "smattering", "smokehouse", "smokestack", "smoothness", "smothering", "smuttiness", "snakebites", "snapdragon", "snappiness", "snappishly", "sneeringly", "snickering", "sniftering", "snobbishly", "snookering", "snootiness", "snorkelers", "snorkeling", "snowballed", "snowboards", "snowdrifts", "snowfields", "snowflakes", "snowmobile", "snowplough", "snowplowed", "snowstorms", "snuffboxes", "soapboxing", "sobriquets", "socialists", "socialites", "sociopaths", "sojourning", "soldiering", "solemnness", "soliciting", "solicitors", "solicitous", "solicitude", "solidarity", "solidified", "solidifies", "solitaires", "solitaries", "solubility", "somebodies", "somersault", "somethings", "somewheres", "somnolence", "songstress", "songwriter", "sonorously", "soothingly", "soothsayer", "sophomores", "sophomoric", "soporifics", "sordidness", "sororities", "soullessly", "soundbites", "soundproof", "soundtrack", "sourdoughs", "sourpusses", "sousaphone", "southbound", "southerner", "southwards", "sovereigns", "spacecraft", "spaceships", "spacesuits", "spacewalks", "spacewoman", "spacewomen", "spaciously", "spanielled", "sparseness", "spattering", "spearheads", "specialism", "specialist", "specifiers", "specifying", "speciously", "spectacles", "spectating", "spectators", "speculated", "speculates", "speculator", "speechless", "speedboats", "speediness", "speedsters", "speleology", "spellbinds", "spellbound", "spelunkers", "spelunking", "spermicide", "spheroidal", "sphincters", "spideriest", "spiderwebs", "spillovers", "spindliest", "spinnakers", "spiritedly", "spiritless", "spirituals", "spirituous", "spitefully", "splashdown", "splashiest", "splattered", "splendider", "splendidly", "splintered", "splittings", "splotchier", "splotching", "spluttered", "spoilsport", "spoliation", "sponginess", "sponsoring", "spoonbills", "spoonerism", "sportingly", "sportscast", "sportswear", "spotlessly", "spotlights", "spottiness", "springboks", "springiest", "springtime", "sprinklers", "sprinkling", "spuriously", "sputtering", "spyglasses", "spymasters", "squabbling", "squalidest", "squandered", "squareness", "squashiest", "squattered", "squeakiest", "squeezebox", "squelching", "squigglier", "squiggling", "squirmiest", "squishiest", "stablemate", "stagecoach", "stagecraft", "stagehands", "staggering", "stagnating", "stagnation", "staircases", "stairwells", "stalactite", "stalagmite", "stalemated", "stalemates", "stalwartly", "stammerers", "stammering", "stampeding", "stanchions", "standpipes", "standpoint", "standstill", "starchiest", "starfishes", "stargazers", "stargazing", "starstruck", "starvation", "statehouse", "stateliest", "statements", "staterooms", "statically", "stationary", "stationers", "stationery", "stationing", "statistics", "statuesque", "statuettes", "staunchest", "staunching", "steadiness", "steakhouse", "stealthier", "stealthily", "steamboats", "steamrolls", "steamships", "steelmaker", "steelworks", "steepening", "stentorian", "stepfather", "stepladder", "stepmother", "stepparent", "stepsister", "stereotype", "stevedores", "stewardess", "stewarding", "stickiness", "stiffeners", "stiffening", "stiflingly", "stillbirth", "stillborns", "stimulants", "stimulated", "stimulates", "stinginess", "stipulated", "stipulates", "stirringly", "stochastic", "stockading", "stockiness", "stockpiled", "stockpiles", "stockrooms", "stockyards", "stodginess", "stomaching", "stonemason", "stonewalls", "stoplights", "stoppering", "storefront", "storehouse", "storerooms", "storminess", "storyboard", "storybooks", "stovepipes", "straddling", "stragglers", "stragglier", "straggling", "straighted", "straighten", "straighter", "straitened", "strangered", "stranglers", "strangling", "stratagems", "strategics", "strategies", "strategist", "stratified", "stratifies", "strawberry", "streakiest", "streamline", "streetcars", "streetlamp", "streetwise", "strengthen", "stretchers", "stretchier", "stretching", "striations", "strictness", "strictures", "stridently", "strikeouts", "strikingly", "stringency", "stringiest", "striplings", "striptease", "stronghold", "strongroom", "stroppiest", "structural", "structured", "structures", "struggling", "strumpeted", "strychnine", "stubbliest", "stubborned", "stubborner", "stubbornly", "studiously", "stuffiness", "stultified", "stultifies", "stunningly", "stupefying", "stupendous", "sturdiness", "stutterers", "stuttering", "stylistics", "subalterns", "subatomics", "subcompact", "subculture", "subdivided", "subdivides", "subeditors", "subheading", "subjecting", "subjection", "subjective", "subjoining", "subjugated", "subjugates", "subleasing", "subletting", "sublimated", "sublimates", "subliminal", "submariner", "submarines", "submerging", "submersing", "submersion", "submission", "submissive", "submitting", "suborbital", "subpoenaed", "subprogram", "subroutine", "subscribed", "subscriber", "subscribes", "subscripts", "subsection", "subsequent", "subsidence", "subsidiary", "subsisting", "subsoiling", "subspecies", "substances", "substation", "substitute", "substratum", "subsystems", "subtenants", "subtending", "subterfuge", "subtitling", "subtleties", "subtracted", "subtrahend", "subvention", "subversion", "subversive", "subverting", "succeeding", "successful", "succession", "successive", "successors", "succincter", "succinctly", "succulence", "succulents", "succumbing", "suctioning", "suddenness", "sufferance", "sufferings", "sufficient", "suffocated", "suffocates", "suffragans", "suffragist", "sugarcoats", "suggesting", "suggestion", "suggestive", "sullenness", "sultanates", "sultriness", "summations", "summeriest", "summertime", "summonsing", "sunbathers", "sunbathing", "sunbonnets", "sunburning", "sundresses", "sunflowers", "sunglasses", "sunscreens", "sunsetting", "suntanning", "supergrass", "superhuman", "supermodel", "supernovae", "supernovas", "superpower", "superseded", "supersedes", "supersonic", "superstars", "superstate", "superstore", "supervened", "supervenes", "supervised", "supervises", "supervisor", "superwoman", "superwomen", "suppertime", "supplanted", "supplement", "suppleness", "suppliants", "supplicant", "supplicate", "supporters", "supporting", "supportive", "supposedly", "supposings", "suppressed", "suppresses", "suppressor", "suppurated", "suppurates", "surceasing", "surcharged", "surcharges", "surefooted", "surfboards", "surfeiting", "surgically", "surmounted", "surpassing", "surplussed", "surprising", "surrealism", "surrealist", "surrenders", "surrogates", "surrounded", "survivable", "suspecting", "suspenders", "suspending", "suspension", "suspicions", "suspicious", "sustaining", "sustenance", "suzerainty", "swaggering", "swallowing", "swarthiest", "swattering", "swaybacked", "swearwords", "sweatbands", "sweatpants", "sweatshirt", "sweatshops", "sweatsuits", "sweetbread", "sweetbrier", "sweeteners", "sweetening", "sweetheart", "sweetmeats", "swellheads", "sweltering", "swimmingly", "switchable", "switchback", "sycophancy", "sycophants", "syllabuses", "syllogisms", "symbolical", "symmetries", "sympathies", "symphonies", "symposiums", "synagogues", "syncopated", "syncopates", "syndicated", "syndicates", "synonymous", "syntactics", "synthetics", "syphilises", "syphilitic", "systematic", "tabernacle", "tablecloth", "tablelands", "tablespoon", "tabulating", "tabulation", "tabulators", "tachograph", "tachometer", "tactically", "tacticians", "tactlessly", "tailboards", "tailgating", "taillights", "tailpieces", "tallyhoing", "tambourine", "tangential", "tangerines", "tantamount", "tapestries", "tarantulas", "tarmacadam", "tarmacking", "tarnishing", "tarpaulins", "taskmaster", "tastefully", "tattletale", "tattooists", "tawdriness", "taxonomies", "teakettles", "teargassed", "tearjerker", "technicals", "technician", "techniques", "technocrat", "technology", "telecaster", "telegraphs", "telegraphy", "telemeters", "telepathic", "telephoned", "telephones", "telephonic", "telephotos", "telescoped", "telescopes", "telescopic", "televising", "television", "teleworker", "temperance", "temperated", "temperates", "temporally", "temptation", "temptingly", "tenability", "tendencies", "tenderfoot", "tenderloin", "tenderness", "tendinitis", "tentatives", "termagants", "terminable", "terminally", "terminated", "terminates", "terminator", "terracotta", "terrariums", "terrifying", "terrorists", "tessellate", "testaments", "testicular", "testifying", "tetchiness", "thankfully", "theatrical", "themselves", "theocratic", "theodolite", "theologian", "theologies", "therapists", "thereabout", "thereafter", "thermionic", "thermostat", "thickeners", "thickening", "thighbones", "thimbleful", "thirstiest", "thirteenth", "thirtieths", "thorougher", "thoroughly", "thoughtful", "thousandth", "thrashings", "threadbare", "threatened", "threepence", "threescore", "threesomes", "threnodies", "thresholds", "thriftiest", "throatiest", "thromboses", "thrombosis", "throttling", "throughout", "throughput", "throwaways", "throwbacks", "thumbnails", "thumbprint", "thumbscrew", "thumbtacks", "thundering", "thunderous", "tiddlywink", "tidewaters", "tiebreaker", "tightening", "tightropes", "timberland", "timberline", "timekeeper", "timelessly", "timeliness", "timepieces", "timescales", "timeserver", "timeshares", "timetabled", "timetables", "timorously", "timpanists", "tincturing", "tirelessly", "tiresomely", "titillated", "titillates", "titivating", "toadstools", "tobogganed", "toiletries", "tolerances", "tolerantly", "tolerating", "toleration", "tollbooths", "tomahawked", "tombstones", "tomfoolery", "tonalities", "tonelessly", "toothaches", "toothbrush", "toothpaste", "toothpicks", "topicality", "topography", "torchlight", "tormenting", "tormentors", "torpedoing", "torrential", "tortuously", "totalities", "touchdowns", "touchiness", "touchingly", "touchlines", "touchpaper", "touchstone", "toughening", "tourmaline", "tournament", "tourniquet", "towelettes", "townhouses", "toxicities", "toxicology", "trackballs", "tracksuits", "trademarks", "traditions", "trafficked", "trafficker", "tragedians", "tragically", "tragicomic", "trailering", "traitorous", "trajectory", "trampoline", "tranquiler", "tranquilly", "transacted", "transcends", "transcribe", "transcript", "transducer", "transferal", "transfixed", "transfixes", "transforms", "transfused", "transfuses", "transgenic", "transgress", "transience", "transiency", "transients", "transistor", "transiting", "transition", "transitive", "transitory", "translated", "translates", "translator", "transmuted", "transmutes", "transpired", "transpires", "transplant", "transports", "transposed", "transposes", "transships", "transverse", "trapeziums", "trapezoids", "travailing", "travelogue", "traversing", "travestied", "travesties", "treadmills", "treasonous", "treasurers", "treasuries", "treasuring", "treatments", "trellising", "tremendous", "trenchancy", "trendiness", "trespassed", "trespasser", "trespasses", "triangular", "triathlete", "triathlons", "trickiness", "tricksters", "tricycling", "triennials", "triggering", "trilateral", "trillionth", "trimesters", "tripartite", "triplicate", "trisecting", "triumphant", "triumphing", "triviality", "troglodyte", "trolleybus", "trolloping", "trombonist", "troopships", "troubadour", "trousseaux", "truckloads", "truculence", "trumpeters", "trumpeting", "truncating", "truncation", "truncheons", "trustfully", "truthfully", "tubercular", "tumbledown", "tumbleweed", "tumescence", "tumultuous", "tunelessly", "turboprops", "turbulence", "turmoiling", "turnabouts", "turnaround", "turnrounds", "turnstiles", "turntables", "turpentine", "turquoises", "turtledove", "turtleneck", "twentieths", "twitchiest", "twittering", "typescript", "typesetter", "typewriter", "typewrites", "typography", "typologies", "tyrannical", "ubiquitous", "ulcerating", "ulceration", "ultimately", "ultimating", "ultimatums", "ultrasonic", "ultrasound", "ululations", "umbrellaed", "unabridged", "unaccented", "unaccepted", "unaffected", "unanswered", "unarguable", "unarguably", "unassigned", "unassisted", "unassuming", "unattached", "unattended", "unavailing", "unbalanced", "unbalances", "unbearable", "unbearably", "unbeatable", "unbecoming", "unbeliever", "unbleached", "unblinking", "unblocking", "unblushing", "unbosoming", "unbuckling", "unburdened", "unbuttoned", "uncanniest", "uncensored", "unchanging", "unclasping", "uncleanest", "unclearest", "unclothing", "uncommoner", "uncommonly", "unconcerns", "uncoupling", "uncovering", "uncritical", "unctuously", "uncultured", "undeceived", "undeceives", "undecideds", "undeclared", "undefeated", "undefended", "undeniable", "undeniably", "underacted", "underarmed", "underbelly", "underbrush", "underclass", "undercoats", "undercover", "underfeeds", "underfloor", "undergoing", "undergrads", "underlains", "underlined", "underlines", "underlings", "underlying", "undermined", "undermines", "underneath", "underpants", "underplays", "underrated", "underrates", "underscore", "undersells", "undershirt", "undershoot", "undersides", "undersigns", "undersized", "underskirt", "understand", "understate", "understood", "understudy", "undertaken", "undertaker", "undertakes", "undertones", "undervalue", "underwater", "underwhelm", "underworld", "underwrite", "underwrote", "undeserved", "undetected", "undeterred", "undismayed", "undisputed", "undressing", "undulating", "undulation", "unearthing", "uneasiness", "uneconomic", "unedifying", "uneducated", "unemployed", "unenviable", "unerringly", "unevenness", "uneventful", "unexampled", "unexciting", "unexpected", "unexplored", "unfairness", "unfaithful", "unfamiliar", "unfastened", "unfeasible", "unfettered", "unfinished", "unflagging", "unforeseen", "unfriendly", "unfrocking", "ungainlier", "ungodliest", "ungracious", "ungrateful", "ungrudging", "unhappiest", "unheralded", "unhindered", "unhitching", "unhygienic", "unicameral", "uniformest", "uniforming", "uniformity", "unilateral", "unimpaired", "uninformed", "uninspired", "unintended", "uninviting", "uniqueness", "universals", "university", "unkindlier", "unkindness", "unknowable", "unknowings", "unlatching", "unlawfully", "unlearning", "unleashing", "unleavened", "unlettered", "unlicensed", "unlikelier", "unluckiest", "unmanliest", "unmannerly", "unmerciful", "unmissable", "unmodified", "unmolested", "unnumbered", "unobserved", "unoccupied", "unofficial", "unoriginal", "unorthodox", "unplayable", "unpleasant", "unplugging", "unpolluted", "unprepared", "unprompted", "unprovoked", "unpunished", "unreadable", "unreadiest", "unrecorded", "unreleased", "unreliable", "unrelieved", "unremarked", "unrequited", "unreserved", "unresolved", "unrewarded", "unromantic", "unruliness", "unsaddling", "unsaleable", "unsanitary", "unschooled", "unscramble", "unscrewing", "unscripted", "unseasoned", "unseeingly", "unseemlier", "unsettling", "unshakable", "unsheathed", "unsheathes", "unskillful", "unsnapping", "unsnarling", "unsociable", "unsoundest", "unspecific", "unsporting", "unstablest", "unsteadier", "unsteadily", "unstinting", "unstopping", "unstressed", "unsuitable", "unsuitably", "unswerving", "untangling", "unthinking", "untidiness", "untimelier", "untiringly", "untroubled", "untruthful", "untwisting", "unverified", "unwariness", "unwavering", "unwieldier", "unworkable", "unworthier", "unwrapping", "unyielding", "upbraiding", "upbringing", "upchucking", "upholsters", "upholstery", "upliftings", "uproarious", "upstanding", "upstarting", "upstreamed", "urinalyses", "urinalysis", "urological", "urologists", "usefulness", "usherettes", "usurpation", "utterances", "vacationed", "vacationer", "vaccinated", "vaccinates", "vacillated", "vacillates", "vagabonded", "valentines", "validating", "validation", "valuations", "vanishings", "vanquished", "vanquishes", "vaporising", "variations", "variegated", "variegates", "varnishing", "vaudeville", "vegeburger", "vegetables", "vegetarian", "vegetating", "vegetation", "vegetative", "vehemently", "velocities", "velodromes", "velvetiest", "venerating", "veneration", "vengefully", "venomously", "ventilated", "ventilates", "ventilator", "ventricles", "verballing", "verifiable", "vermicelli", "vernacular", "versifying", "vertebrate", "vertically", "vestibules", "veterinary", "vibraphone", "vibrations", "victorious", "videodiscs", "videophone", "videotaped", "videotapes", "viewfinder", "viewpoints", "vigilantes", "vigilantly", "vignetting", "vigorously", "villainies", "villainous", "vindicated", "vindicates", "vindicator", "vindictive", "violations", "violinists", "virtuosity", "virtuously", "virulently", "viscountcy", "visibility", "visitation", "vitreouses", "vituperate", "viviparous", "vocabulary", "vocational", "vociferate", "vociferous", "volatility", "volleyball", "voltmeters", "volubility", "voluminous", "volunteers", "voluptuary", "voluptuous", "vouchsafed", "vouchsafes", "vulgarisms", "vulnerable", "vulnerably", "wainscoted", "waistbands", "waistcoats", "waistlines", "waitresses", "walkabouts", "wallflower", "wallopings", "wallpapers", "wanderings", "wanderlust", "wantonness", "wardresses", "warehoused", "warehouses", "warmongers", "warrantied", "warranties", "warranting", "washbasins", "washboards", "washcloths", "washstands", "wassailing", "wastefully", "wastelands", "wastepaper", "watchbands", "watchfully", "watchmaker", "watchstrap", "watchtower", "watchwords", "waterborne", "watercraft", "watercress", "waterfalls", "waterfowls", "waterfront", "waterholes", "waterlines", "watermarks", "watermelon", "watermills", "waterproof", "watersheds", "watersides", "waterspout", "watertight", "waterwheel", "waterworks", "wavelength", "wayfarings", "weakfishes", "weaknesses", "wealthiest", "weaponless", "weathering", "weatherman", "weathermen", "webmasters", "weedkiller", "weekenders", "weekending", "weeknights", "weightiest", "weightings", "weightless", "wellington", "wellspring", "werewolves", "westerlies", "westerners", "whatsoever", "wheelbases", "wheelchair", "wheelhouse", "wheeziness", "wherefores", "whetstones", "whimpering", "whiplashes", "whirligigs", "whirlpools", "whirlwinds", "whirlybird", "whispering", "whiteboard", "whitewalls", "whithering", "wholefoods", "wholegrain", "wholesaled", "wholesaler", "wholesales", "wholewheat", "whomsoever", "whorehouse", "wickedness", "wickerwork", "widespread", "wigwagging", "wildcatted", "wildcatter", "wildebeest", "wilderness", "wildflower", "willingest", "willowiest", "windbreaks", "windburned", "windjammer", "windlasses", "windmilled", "windowpane", "windowsill", "windscreen", "windshield", "windstorms", "windsurfed", "windsurfer", "wingspread", "wintertime", "wirelesses", "wiretapped", "wisecracks", "witchcraft", "withdrawal", "withstands", "witnessing", "witticisms", "woefullest", "wolfhounds", "wolverines", "womanliest", "womenfolks", "wonderland", "wonderment", "wondrously", "woodblocks", "woodchucks", "woodcutter", "woodenness", "woodpecker", "woolliness", "wordlessly", "wordsmiths", "workaholic", "workbasket", "workhorses", "workhouses", "workingman", "workingmen", "workplaces", "worksheets", "worldliest", "worryingly", "worrywarts", "worshipful", "worthiness", "worthwhile", "wranglings", "wraparound", "wrathfully", "wretcheder", "wretchedly", "wriggliest", "wrinkliest", "wristbands", "wristwatch", "wrongdoers", "wrongdoing", "wrongfully", "wunderkind", "xenophobes", "xenophobia", "xenophobic", "xerography", "xylophones", "yardsticks", "yellowness", "yesterdays", "yesteryear", "youngsters", "yourselves", "youthfully", "yuppifying", "zigzagging", "zookeepers", "zoological", "zoologists" }; const char* w_11[] = { "abandonment", "abbreviated", "abbreviates", "abdications", "aberrations", "abjurations", "abnormality", "abominating", "abomination", "aboriginals", "abortionist", "abracadabra", "abrogations", "absenteeism", "absolutists", "abstentions", "abstractest", "abstracting", "abstraction", "absurdities", "abusiveness", "academician", "accelerated", "accelerates", "accelerator", "accentuated", "accentuates", "acceptances", "accessioned", "accessories", "accidentals", "acclamation", "acclimating", "acclimation", "acclimatise", "acclimatize", "accommodate", "accompanied", "accompanies", "accompanist", "accomplices", "accordingly", "accountable", "accountancy", "accountants", "accrediting", "accumulated", "accumulates", "accumulator", "accusations", "accusatives", "accustoming", "achievement", "acknowledge", "acquainting", "acquiescent", "acquiescing", "acquirement", "acquisition", "acquisitive", "acrimonious", "actualities", "acupressure", "acupuncture", "adaptations", "addressable", "adjournment", "adjudicated", "adjudicates", "adjudicator", "adjurations", "adjustments", "administers", "admonishing", "admonitions", "adolescence", "adolescents", "adulterants", "adulterated", "adulterates", "adumbrating", "adumbration", "advancement", "advantaging", "adventurers", "adventuress", "adventuring", "adventurism", "adventurist", "adventurous", "adversarial", "adversaries", "adversities", "advertisers", "advertising", "advertorial", "aerodynamic", "aerogrammes", "aeronautics", "affectation", "affectioned", "affiliating", "affiliation", "affirmation", "affirmative", "afflictions", "afforesting", "aficionados", "afterbirths", "afterburner", "aftereffect", "aftershaves", "aftershocks", "aftertastes", "agglomerate", "agglutinate", "aggravating", "aggravation", "aggregating", "aggregation", "agnosticism", "agoraphobia", "agoraphobic", "agriculture", "agronomists", "aimlessness", "airbrushing", "aircraftman", "aircraftmen", "airdropping", "airsickness", "airworthier", "albatrosses", "algorithmic", "allegations", "allegiances", "allegorical", "alleviating", "alleviation", "allocations", "alphabeting", "altarpieces", "alterations", "altercation", "alternately", "alternating", "alternation", "alternative", "alternators", "amalgamated", "amalgamates", "amaryllises", "ambassadors", "ambiguities", "ambiguously", "ambitiously", "ambivalence", "ameliorated", "ameliorates", "amicability", "amorousness", "amorphously", "amphetamine", "amputations", "anachronism", "analogously", "anarchistic", "ancestoring", "anchorwoman", "anchorwomen", "ancillaries", "androgynous", "anemometers", "angelically", "angioplasty", "angiosperms", "anglophiles", "anglophones", "animosities", "annexations", "annihilated", "annihilates", "annihilator", "anniversary", "annotations", "anomalously", "anonymously", "answerphone", "antagonisms", "antagonists", "antecedents", "antechamber", "anthologies", "anthologist", "anthropoids", "antibiotics", "anticipated", "anticipates", "anticyclone", "antipathies", "antiphonals", "antiquarian", "antiquaries", "antiquating", "antiquities", "antirrhinum", "antiseptics", "antislavery", "aphrodisiac", "apocalypses", "apocalyptic", "apologetics", "apostrophes", "appallingly", "apparatchik", "apparatuses", "apparitions", "appealingly", "appearances", "appeasement", "appellation", "appertained", "application", "applicators", "appointment", "apportioned", "appositives", "appreciable", "appreciably", "appreciated", "appreciates", "apprehended", "apprenticed", "apprentices", "approaching", "approbation", "appropriate", "approvingly", "approximate", "aquaculture", "aquamarines", "aquaplaning", "aquatically", "arbitragers", "arbitrageur", "arbitrarily", "arbitrating", "arbitration", "arbitrators", "arborvitaes", "archaically", "archbishops", "archdeacons", "archdiocese", "archduchess", "archenemies", "archipelago", "arduousness", "aristocracy", "aristocrats", "arraignment", "arrangement", "articulated", "articulates", "artlessness", "ascertained", "ascetically", "asphyxiated", "asphyxiates", "aspidistras", "aspirations", "assassinate", "assemblages", "assemblyman", "assemblymen", "assertively", "assessments", "asseverated", "asseverates", "assiduously", "assignation", "assignments", "assimilated", "assimilates", "associating", "association", "associative", "assortments", "assumptions", "asterisking", "astigmatism", "astonishing", "astringency", "astringents", "astrologers", "astronomers", "asymmetries", "athleticism", "atmospheres", "atmospheric", "atrociously", "attachments", "attainments", "attendances", "attentively", "attenuating", "attenuation", "attestation", "attitudinal", "attractions", "attributing", "attribution", "attributive", "auctioneers", "audaciously", "audiophiles", "audiovisual", "auditioning", "auditoriums", "austerities", "authoresses", "authorities", "autocracies", "autographed", "automobiled", "automobiles", "autoworkers", "auxiliaries", "avoirdupois", "avuncularly", "awkwardness", "babysitters", "babysitting", "backbencher", "backbenches", "backbitings", "backcombing", "backgrounds", "backhanders", "backhanding", "backlogging", "backpackers", "backpacking", "backslapper", "backslashes", "backsliders", "backsliding", "backspacing", "backstopped", "backstreets", "backstretch", "backstroked", "backstrokes", "backtracked", "badmouthing", "balefullest", "balloonists", "ballplayers", "ballyhooing", "balustrades", "bamboozling", "bandleaders", "bandmasters", "banefullest", "bankrolling", "bankrupting", "barbarities", "barbarously", "barbershops", "barbiturate", "barnstormed", "baronetcies", "barricading", "bashfulness", "basketballs", "bassoonists", "battledress", "battlefield", "battlements", "battleships", "beachcomber", "beansprouts", "beastliness", "beauteously", "beauticians", "beautifiers", "beautifuler", "beautifully", "beautifying", "bedchambers", "bedevilment", "bedraggling", "beefburgers", "befriending", "beguilingly", "beleaguered", "bellicosity", "belligerent", "bellwethers", "bellyaching", "bellybutton", "benedictine", "benediction", "benefaction", "benefactors", "beneficence", "beneficiary", "benevolence", "bequeathing", "bereavement", "besmirching", "bestsellers", "bestselling", "bewildering", "bibliophile", "bicarbonate", "bicentenary", "bifurcating", "bifurcation", "bilaterally", "billionaire", "bimonthlies", "biochemical", "biochemists", "biodegraded", "biodegrades", "biofeedback", "biographers", "biographies", "birdbrained", "birdwatcher", "birthplaces", "birthrights", "birthstones", "bisexuality", "bittersweet", "bivouacking", "blackballed", "blackboards", "blackguards", "blackjacked", "blacklisted", "blackmailed", "blackmailer", "blacksmiths", "blackthorns", "blacktopped", "blamelessly", "blameworthy", "blancmanges", "blasphemers", "blasphemies", "blaspheming", "blasphemous", "blessedness", "blindfolded", "blindsiding", "blitzkriegs", "blockbuster", "blockhouses", "bloodhounds", "bloodlessly", "bloodmobile", "bloodstains", "bloodstream", "bloodsucker", "blowtorches", "bludgeoning", "blueberries", "bluebottles", "bluejackets", "blueprinted", "blunderbuss", "bobsledding", "boilerplate", "bollockings", "bombardiers", "bombardment", "bondholders", "boneshakers", "bookbinders", "bookbinding", "bookkeepers", "bookkeeping", "bookmarking", "bookmobiles", "booksellers", "bookshelves", "boomeranged", "boondoggled", "boondoggles", "bootleggers", "bootlegging", "borderlands", "borderlines", "botheration", "bottlenecks", "bountifully", "bourgeoisie", "boysenberry", "brainstorms", "brainteaser", "brainwashed", "brainwashes", "brandishing", "breadbasket", "breadboards", "breadcrumbs", "breadfruits", "breadwinner", "breakfasted", "breakpoints", "breakwaters", "breastbones", "breastfeeds", "breastplate", "breastworks", "bricklayers", "bricklaying", "bridegrooms", "bridesmaids", "bridgeheads", "brigantines", "brightening", "brilliantly", "brittleness", "broadcaster", "broadminded", "broadsheets", "broadsiding", "broadswords", "brontosaurs", "broomsticks", "brotherhood", "browbeating", "brownstones", "brushstroke", "brusqueness", "brutalities", "brutishness", "buccaneered", "bucktoothed", "budgerigars", "bulldogging", "bulletining", "bulletproof", "bullfighter", "bullfinches", "bullshitted", "bullshitter", "bureaucracy", "bureaucrats", "burlesquing", "bushwhacked", "bushwhacker", "businessman", "businessmen", "butterflied", "butterflies", "buttonholed", "buttonholes", "buttressing", "cacophonies", "cacophonous", "calculating", "calculation", "calculators", "calendaring", "calibrating", "calibration", "calibrators", "calisthenic", "calligraphy", "callousness", "calumniated", "calumniates", "camaraderie", "camerawoman", "camerawomen", "camouflaged", "camouflages", "campaigners", "campaigning", "campanology", "campgrounds", "candelabras", "candelabrum", "candidacies", "candidature", "candlelight", "candlestick", "canistering", "cannibalism", "cannonading", "cannonballs", "cantaloupes", "cantilevers", "cantonments", "canvasbacks", "capaciously", "capacitance", "caparisoned", "capillaries", "capitalists", "capitations", "capitulated", "capitulates", "cappuccinos", "captaincies", "captivating", "captivation", "captivities", "carbonating", "carbonation", "carburetors", "carburettor", "carcinogens", "cardholders", "cardiograms", "carefullest", "carefulness", "caricatured", "caricatures", "carillonned", "carjackings", "carnivorous", "carpentered", "carriageway", "carsickness", "cartography", "cartoonists", "cartwheeled", "caseworkers", "casseroling", "castellated", "castigating", "castigation", "castigators", "castrations", "cataclysmic", "catafalques", "cataleptics", "catapulting", "catastrophe", "catchphrase", "categorical", "caterpillar", "caterwauled", "catholicity", "cauliflower", "causalities", "caustically", "ceaselessly", "celebrating", "celebration", "celebratory", "celebrities", "centenarian", "centenaries", "centennials", "centrifugal", "centrifuged", "centrifuges", "centripetal", "cerebellums", "cerebration", "ceremonials", "ceremonious", "certainties", "certifiable", "certificate", "chaffinches", "chainsawing", "chairperson", "chalkboards", "challengers", "challenging", "chamberlain", "chambermaid", "championing", "chancellery", "chancellors", "chandeliers", "changelings", "changeovers", "chanticleer", "chaotically", "chaperoning", "charbroiled", "charioteers", "charismatic", "charmingest", "chauffeured", "chauvinists", "cheapskates", "checkmating", "checkpoints", "cheerfuller", "cheerleader", "cheerlessly", "cheeseboard", "cheesecakes", "cheesecloth", "chessboards", "chiaroscuro", "chicaneries", "chickenfeed", "chickenshit", "childbirths", "childminder", "childproofs", "chimpanzees", "chinchillas", "chiropodist", "chitchatted", "chlorinated", "chlorinates", "chloroforms", "chlorophyll", "chocoholics", "choirmaster", "cholesterol", "choreograph", "christening", "chromosomal", "chromosomes", "chronically", "chroniclers", "chronicling", "chronograph", "chronometer", "chrysalises", "churchgoers", "churchgoing", "churchwoman", "churchwomen", "churchyards", "circularity", "circulating", "circulation", "circulatory", "circumcised", "circumcises", "circumspect", "circumvents", "citizenship", "clairvoyant", "clandestine", "clapboarded", "clarinetist", "classically", "classicists", "classifieds", "classifying", "clavichords", "cleanliness", "clementines", "clergywoman", "clergywomen", "cliffhanger", "climatology", "clodhoppers", "cloistering", "closefisted", "clothesline", "clothespins", "cloudbursts", "cloverleafs", "coagulating", "coagulation", "coalescence", "coastguards", "coauthoring", "cobblestone", "cockchafers", "cockleshell", "cockroaches", "cocksuckers", "codependent", "coeducation", "coefficient", "coexistence", "coffeecakes", "coffeehouse", "cogitations", "cognoscente", "cognoscenti", "coincidence", "collaborate", "collapsible", "collarbones", "colleaguing", "collectible", "collections", "collectives", "collocating", "collocation", "colloquials", "colloquiums", "colonialism", "colonialist", "combination", "combustible", "comediennes", "comestibles", "comeuppance", "comfortable", "comfortably", "comfortless", "commandants", "commandeers", "commandment", "commemorate", "commendable", "commendably", "commentated", "commentates", "commentator", "commercials", "commingling", "commiserate", "commissions", "commitments", "commodities", "commonality", "commonplace", "communicant", "communicate", "communiques", "communistic", "communities", "commutation", "commutative", "compactness", "comparative", "comparisons", "compartment", "compatibles", "compatriots", "compendiums", "compensated", "compensates", "competences", "competently", "competition", "competitive", "competitors", "compilation", "complacence", "complacency", "complainant", "complainers", "complaining", "complaisant", "complements", "completions", "complexions", "complicated", "complicates", "compliments", "comportment", "composition", "compositors", "compounding", "comprehends", "compressing", "compression", "compressors", "compromised", "compromises", "comptroller", "compulsions", "compunction", "computation", "computerate", "comradeship", "concatenate", "concavities", "concealment", "conceitedly", "conceivable", "conceivably", "concentrate", "conceptions", "concernedly", "concertgoer", "concertinas", "concessions", "conciliated", "conciliates", "conciliator", "conciseness", "conclusions", "concoctions", "concomitant", "concordance", "concurrence", "concurrency", "concussions", "condescends", "conditional", "conditioned", "conditioner", "condolences", "condominium", "conductress", "confections", "confederacy", "confederate", "conferences", "conferments", "confessedly", "confessions", "confidantes", "confidences", "confidently", "confidingly", "configuring", "confinement", "confiscated", "confiscates", "conflations", "conflicting", "confluences", "conformance", "conformists", "confounding", "confronting", "confusingly", "congenially", "congregants", "congregated", "congregates", "congressman", "congressmen", "congruities", "conjectural", "conjectured", "conjectures", "conjugating", "conjugation", "conjunction", "conjunctive", "conjuncture", "connections", "connectives", "connoisseur", "connotation", "connotative", "consciences", "consciouses", "consciously", "conscripted", "consecrated", "consecrates", "consecutive", "consensuses", "consequence", "conservancy", "conservator", "considerate", "considering", "consignment", "consistency", "consolation", "consolatory", "consolidate", "consonances", "conspicuous", "conspirator", "constipated", "constipates", "constituent", "constituted", "constitutes", "constrained", "constraints", "constricted", "constrictor", "constructed", "constructor", "consultancy", "consultants", "consumables", "consumerism", "consumerist", "consummated", "consummates", "consumption", "consumptive", "contactable", "containment", "contaminant", "contaminate", "contemplate", "contentedly", "contentions", "contentious", "contentment", "contestants", "continental", "contingency", "contingents", "continually", "continuance", "contortions", "contractile", "contracting", "contraction", "contractors", "contractual", "contradicts", "contraflows", "contraption", "contrasting", "contravened", "contravenes", "contretemps", "contributed", "contributes", "contributor", "contrivance", "controllers", "controlling", "controversy", "controverts", "contumelies", "conurbation", "convalesced", "convalesces", "convenience", "conventions", "convergence", "conversions", "convertible", "conveyances", "convictions", "convivially", "convocation", "convolution", "convulsions", "cooperating", "cooperation", "cooperative", "coordinated", "coordinates", "coordinator", "copperheads", "copperplate", "copycatting", "copyrighted", "copywriters", "corkscrewed", "cornerstone", "cornflowers", "cornucopias", "corollaries", "coronations", "corporation", "corporatism", "correctable", "corrections", "correctives", "correctness", "correlating", "correlation", "correlative", "corresponds", "corroborate", "corrugating", "corrugation", "corruptible", "corruptions", "corruptness", "coruscating", "cosignatory", "cosmetology", "cosmogonies", "cosmologies", "cosmologist", "cosponsored", "coterminous", "cottonmouth", "cottonseeds", "cottontails", "cottonwoods", "counselings", "countenance", "counteracts", "counterfeit", "counterfoil", "countermand", "counterpane", "counterpart", "countersign", "countersink", "countersunk", "countervail", "countrified", "countryside", "countrywide", "coursebooks", "courteously", "courthouses", "courtliness", "covenanting", "cowcatchers", "cowpunchers", "coxswaining", "crackerjack", "craftswoman", "craftswomen", "cranberries", "crankshafts", "crawlspaces", "creationism", "creationist", "credentials", "credibility", "credulously", "crematories", "crematorium", "crepuscular", "crestfallen", "criminality", "criminology", "cripplingly", "crispbreads", "crookedness", "crossbarred", "crossbreeds", "crosschecks", "crosspieces", "crucifixion", "crustaceans", "cryptically", "cryptograms", "crystalline", "culminating", "culmination", "culpability", "cultivating", "cultivation", "cultivators", "cummerbunds", "cunnilingus", "curiosities", "curmudgeons", "currycombed", "curtailment", "customarily", "cybernetics", "cylindrical", "dangerously", "dauntlessly", "daydreamers", "daydreaming", "deaconesses", "deactivated", "deactivates", "deadheading", "deadlocking", "deadpanning", "dealerships", "debarkation", "debasements", "debilitated", "debilitates", "debriefings", "decapitated", "decapitates", "decathletes", "deceitfully", "decelerated", "decelerates", "deceptively", "deciphering", "declamation", "declamatory", "declaration", "declarative", "declensions", "declination", "declivities", "decomposing", "deconstruct", "decorations", "decremented", "decrepitude", "decrescendo", "dedications", "deductibles", "deerstalker", "deescalated", "deescalates", "defectively", "defensively", "deferential", "definitions", "deflections", "deflowering", "defoliating", "defoliation", "deforesting", "deformation", "deformities", "degenerated", "degenerates", "degradation", "dehydrating", "dehydration", "deification", "delectation", "delegations", "deleterious", "deliberated", "deliberates", "deliciously", "delightedly", "delineating", "delineation", "delinquency", "delinquents", "deliriously", "deliverable", "deliverance", "deliveryman", "deliverymen", "delphiniums", "demagoguery", "demarcating", "demarcation", "demigoddess", "democracies", "demographer", "demographic", "demolishing", "demolitions", "demonically", "demonstrate", "demotivated", "demotivates", "demystified", "demystifies", "denigrating", "denigration", "denominated", "denominates", "denominator", "denotations", "denouements", "dentifrices", "departments", "deployments", "depopulated", "depopulates", "deportation", "depositions", "depravities", "deprecating", "deprecation", "deprecatory", "depreciated", "depreciates", "depredation", "depressants", "depressions", "depressives", "deprivation", "deputations", "derailments", "derangement", "deregulated", "deregulates", "dereliction", "derivations", "derivatives", "dermatology", "desalinated", "desalinates", "descendants", "describable", "description", "descriptive", "descriptors", "desecrating", "desecration", "desegregate", "deselecting", "deselection", "desiccating", "desiccation", "desideratum", "designating", "designation", "desperadoes", "desperately", "desperation", "despondency", "destination", "destitution", "destructing", "destruction", "destructive", "desultorily", "detachments", "deteriorate", "determinant", "determinate", "determiners", "determining", "determinism", "detestation", "detonations", "detoxifying", "detrimental", "devaluation", "devastating", "devastation", "development", "deviousness", "devotionals", "dexterously", "diacritical", "diagnostics", "diagramming", "dialectical", "diametrical", "dichotomies", "dictatorial", "diddlysquat", "didgeridoos", "differences", "differently", "diffidently", "diffracting", "diffraction", "diffuseness", "dignitaries", "digressions", "dilapidated", "dilettantes", "dimensional", "diminishing", "diminuendos", "diminutions", "diminutives", "diplomatics", "diplomatist", "dipsomaniac", "directional", "directorate", "directorial", "directories", "disablement", "disaffected", "disafforest", "disagreeing", "disallowing", "disappeared", "disappoints", "disapproval", "disapproved", "disapproves", "disarmament", "disarmingly", "disarranged", "disarranges", "disarraying", "disassemble", "disbelieved", "disbelieves", "discernible", "discernibly", "discernment", "discharging", "disciplined", "disciplines", "disclaimers", "disclaiming", "disclosures", "discography", "discomfited", "discomforts", "discommoded", "discommodes", "discomposed", "discomposes", "disconcerts", "disconnects", "discontents", "discontinue", "discotheque", "discounters", "discounting", "discouraged", "discourages", "discoursing", "discourtesy", "discoverers", "discoveries", "discovering", "discredited", "discreetest", "discrepancy", "discussants", "discussions", "disembarked", "disembodied", "disembodies", "disembowels", "disenchants", "disencumber", "disengaging", "disentangle", "disfiguring", "disgraceful", "disgruntled", "disgruntles", "disgustedly", "disheartens", "dishonestly", "dishwashers", "disillusion", "disinclined", "disinclines", "disinfected", "disinherits", "disinterest", "disinterred", "disjointing", "disjuncture", "dislocating", "dislocation", "dismantling", "dismembered", "dismounting", "disobedient", "disobliging", "disordering", "disoriented", "disparaging", "disparities", "dispatchers", "dispatching", "dispensable", "dispiriting", "displayable", "displeasing", "displeasure", "disposables", "disposition", "disputation", "disquieting", "disregarded", "disrespects", "disruptions", "dissections", "dissembling", "disseminate", "dissensions", "disservices", "dissimilars", "dissimulate", "dissipating", "dissipation", "dissociated", "dissociates", "dissolutely", "dissolution", "dissonances", "distasteful", "distensions", "distentions", "distillates", "distinctest", "distinction", "distinctive", "distinguish", "distortions", "distracting", "distraction", "distressful", "distressing", "distributed", "distributes", "distributor", "distrustful", "distrusting", "disturbance", "divergences", "diversified", "diversifies", "diversities", "divestiture", "dockworkers", "doctrinaire", "documentary", "documenting", "dogcatchers", "dogfighting", "dogtrotting", "dolefullest", "domesticate", "domesticity", "domiciliary", "domineering", "doorkeepers", "doorknocker", "doorstepped", "dormitories", "doublespeak", "doubtlessly", "dovetailing", "downgrading", "downhearted", "downloading", "downplaying", "downscaling", "downshifted", "downtrodden", "draftswoman", "draftswomen", "dragonflies", "drainboards", "drastically", "drawbridges", "drawstrings", "dreadnought", "dressmakers", "dressmaking", "dromedaries", "drunkenness", "dubiousness", "dumbfounded", "dumbwaiters", "dunderheads", "duplicating", "duplication", "duplicators", "duplicitous", "dynamically", "dysfunction", "earnestness", "earthenware", "earthquaked", "earthquakes", "easternmost", "eclecticism", "econometric", "edification", "editorially", "educational", "edutainment", "effectively", "effectually", "effectuated", "effectuates", "effervesced", "effervesces", "efficacious", "efficiently", "egalitarian", "egocentrics", "egotistical", "egregiously", "eigenvalues", "eighteenths", "eisteddfods", "ejaculating", "ejaculation", "elaborately", "elaborating", "elaboration", "elasticated", "electioneer", "electorally", "electorates", "electrician", "electricity", "electrified", "electrifies", "electrocute", "electrolyte", "electronics", "elephantine", "eligibility", "eliminating", "elimination", "eliminators", "elongations", "elucidating", "elucidation", "elusiveness", "emancipated", "emancipates", "emancipator", "emasculated", "emasculates", "embankments", "embarkation", "embarrassed", "embarrasses", "embellished", "embellishes", "embittering", "emblazoning", "emboldening", "embrocation", "embroidered", "emendations", "emergencies", "emigrations", "emotionally", "emotionless", "empirically", "empiricists", "emplacement", "employables", "employments", "empowerment", "emulsifiers", "emulsifying", "encampments", "encapsulate", "enchantment", "enchantress", "encompassed", "encompasses", "encountered", "encouraging", "encroaching", "encumbering", "encumbrance", "encyclicals", "endangering", "endearingly", "endearments", "endlessness", "endorsement", "enforceable", "enforcement", "enfranchise", "engagements", "engendering", "engineering", "engorgement", "enhancement", "enlargement", "enlightened", "enlistments", "ennoblement", "enquiringly", "enrapturing", "enshrouding", "enslavement", "enterprises", "entertained", "entertainer", "enthralling", "enthusiasms", "enthusiasts", "enticements", "entitlement", "entrenching", "entryphones", "enumerating", "enumeration", "enunciating", "enunciation", "envelopment", "enviousness", "environment", "envisioning", "epidermises", "equestrians", "equidistant", "equilateral", "equilibrium", "equinoctial", "equivalence", "equivalents", "equivocally", "equivocated", "equivocates", "eradicating", "eradication", "erratically", "erroneously", "erythrocyte", "escalations", "escarpments", "eschatology", "escutcheons", "espadrilles", "essentially", "established", "establishes", "estimations", "ethnography", "ethnologist", "etymologies", "etymologist", "euphemistic", "evacuations", "evaluations", "evangelical", "evangelists", "evaporating", "evaporation", "evasiveness", "eventuality", "eventuating", "everlasting", "eviscerated", "eviscerates", "evocatively", "exacerbated", "exacerbates", "exaggerated", "exaggerates", "examination", "exasperated", "exasperates", "excavations", "exceedingly", "excellently", "exceptional", "excessively", "excitements", "exclamation", "exclamatory", "exclusively", "exclusivity", "excoriating", "excoriation", "excrescence", "excretories", "exculpating", "exculpation", "exculpatory", "executioner", "executrices", "exemplified", "exemplifies", "exfoliating", "exfoliation", "exhalations", "exhaustible", "exhibitions", "exhilarated", "exhilarates", "exhortation", "exhumations", "existential", "exonerating", "exoneration", "exorbitance", "expansively", "expatiating", "expatriated", "expatriates", "expectantly", "expectation", "expectorant", "expectorate", "expediences", "expediently", "expeditions", "expeditious", "expendables", "expenditure", "expensively", "experienced", "experiences", "experiments", "explanation", "explanatory", "explicating", "explication", "exploitable", "exploration", "exploratory", "explosively", "exponential", "exportation", "expositions", "expostulate", "expressible", "expressions", "expressways", "expropriate", "expurgating", "expurgation", "exquisitely", "extensional", "extensively", "extenuating", "extenuation", "exterminate", "extinctions", "extirpating", "extirpation", "extortioner", "extractions", "extraditing", "extradition", "extrapolate", "extravagant", "extremities", "extricating", "extrication", "extroverted", "exuberantly", "fabricating", "fabrication", "facetiously", "facilitated", "facilitates", "facilitator", "faddishness", "fairgrounds", "faithlessly", "fallibility", "falsifiable", "falteringly", "familiarity", "fanatically", "fantastical", "farinaceous", "fascinating", "fascination", "fashionable", "fashionably", "fatherlands", "fatuousness", "faultlessly", "fearfullest", "fearfulness", "feasibility", "featheriest", "featureless", "federalists", "federations", "fellowships", "ferociously", "festivities", "fetishistic", "feudalistic", "fiduciaries", "fieldworker", "figureheads", "filamentous", "filibusters", "filigreeing", "financially", "fingerboard", "fingermarks", "fingernails", "fingerprint", "firebombing", "firecracker", "firefighter", "firelighter", "fireproofed", "firescreens", "firewalling", "fishmongers", "fishtailing", "flabbergast", "flagellants", "flagellated", "flagellates", "flamboyance", "flashlights", "flatfooting", "fledgelings", "flexibility", "flightiness", "flimflammed", "flirtations", "flirtatious", "floodlights", "floorboards", "floundering", "flourishing", "floweriness", "fluctuating", "fluctuation", "fluorescent", "fluorescing", "fluoridated", "fluoridates", "fluoroscope", "flycatchers", "flyspecking", "flyswatters", "fomentation", "foolhardier", "foolishness", "footballers", "footballing", "footbridges", "footlockers", "forbearance", "forbiddings", "forebodings", "forecasters", "forecasting", "forecastles", "foreclosing", "foreclosure", "foredooming", "forefathers", "forefingers", "foregrounds", "foreordains", "forerunners", "foreseeable", "foreshadows", "foreshorten", "forestalled", "forestation", "foretasting", "foretelling", "forethought", "forevermore", "forewarning", "forfeitures", "forgathered", "forgetfully", "forgettable", "forgiveness", "formalities", "formulating", "formulation", "fornicating", "fornication", "fornicators", "forswearing", "forthcoming", "fortnightly", "fortressing", "fortunately", "forwardness", "foundations", "fountaining", "fourteenths", "foxtrotting", "fractiously", "fragmentary", "fragmenting", "franchisees", "franchisers", "franchising", "francophone", "frankfurter", "frantically", "fraternally", "fratricidal", "fratricides", "fraudulence", "freebooters", "freeholders", "freelancers", "freelancing", "freeloaders", "freeloading", "freemasonry", "freethinker", "freewheeled", "frequencies", "frequentest", "frequenting", "fretfulness", "friendliest", "friendships", "frightening", "frightfully", "frivolities", "frivolously", "frogmarched", "frogmarches", "frostbiting", "frostbitten", "fructifying", "fruitfuller", "fruitlessly", "frustrating", "frustration", "fulminating", "fulmination", "fulsomeness", "functionary", "functioning", "fundamental", "furloughing", "furnishings", "furtherance", "furthermore", "furthermost", "furtiveness", "fussbudgets", "futuristics", "gallbladder", "gallivanted", "gamekeepers", "garrisoning", "garrulously", "gastronomes", "gastronomic", "gatecrashed", "gatecrasher", "gatecrashes", "gatekeepers", "gazetteered", "genealogies", "genealogist", "generalists", "generations", "generically", "genetically", "geneticists", "gentlemanly", "gentlewoman", "gentlewomen", "gentrifying", "genuflected", "genuineness", "geographers", "geographies", "geometrical", "geophysical", "geopolitics", "germinating", "germination", "gerontology", "gerrymander", "gesticulate", "ghastliness", "ghostliness", "ghostwriter", "ghostwrites", "gingerbread", "gingersnaps", "girlfriends", "glamorously", "glasshouses", "glimmerings", "glitterings", "goalkeepers", "goalscorers", "goaltenders", "gobstoppers", "godchildren", "goddaughter", "godforsaken", "godlessness", "goldbricked", "goldfinches", "governesses", "governments", "gracefuller", "gracelessly", "graduations", "grammarians", "grammatical", "gramophones", "grandaddies", "grandfather", "grandmother", "grandparent", "grandstands", "granularity", "granulating", "granulation", "grapefruits", "graphically", "grasshopper", "gratefuller", "gravedigger", "gravestones", "gravitating", "gravitation", "greasepaint", "greengrocer", "greenhouses", "griddlecake", "gridlocking", "grindstones", "grotesquely", "grouchiness", "groundcloth", "groundsheet", "groundswell", "groundwater", "guarantying", "guardhouses", "guesstimate", "guesthouses", "guilelessly", "guillotined", "guillotines", "gullibility", "gunfighters", "gunfighting", "gunslingers", "guttersnipe", "gymnosperms", "haberdasher", "habitations", "habituating", "habituation", "hagiography", "hairbreadth", "hairbrushes", "haircutting", "hairdresser", "hairsprings", "hairstylist", "halfhearted", "halfpennies", "hallelujahs", "hallmarking", "hallucinate", "halternecks", "hammerheads", "handbagging", "handcrafted", "handcuffing", "handicapped", "handicapper", "handicrafts", "handmaidens", "handpicking", "handshaking", "handsprings", "handwriting", "handwritten", "haphazardly", "hardhearted", "harebrained", "harmfulness", "harpsichord", "harrumphing", "hatefulness", "haughtiness", "hawkishness", "headbangers", "headbanging", "headbutting", "headdresses", "headhunters", "headhunting", "headmasters", "headquarter", "headscarves", "headteacher", "headwaiters", "healthfully", "healthiness", "heartbreaks", "heartbroken", "heartlessly", "heartthrobs", "heavenliest", "heavenwards", "heavyweight", "heightening", "heinousness", "helicopters", "heliotropes", "helpfulness", "hemispheres", "hemispheric", "hemorrhaged", "hemorrhages", "hemorrhoids", "hemstitched", "hemstitches", "heptathlons", "herbivorous", "hereinafter", "herringbone", "hesitations", "hexadecimal", "hibernating", "hibernation", "hideousness", "hierarchies", "hieroglyphs", "highfalutin", "highlanders", "highlighted", "highlighter", "hightailing", "hilariously", "hillbillies", "hindquarter", "hinterlands", "histrionics", "hitchhikers", "hitchhiking", "hobbyhorses", "hodgepodges", "holographic", "homecomings", "homesteaded", "homesteader", "homestretch", "homeworkers", "homeworking", "homogeneity", "homogeneous", "homosexuals", "honeycombed", "honeymooned", "honeymooner", "honeysuckle", "honorariums", "hoodwinking", "hooliganism", "hopefulness", "hopscotched", "hopscotches", "horizontals", "horseradish", "hospitality", "hostilities", "hotheadedly", "hourglasses", "housebreaks", "housebroken", "housecleans", "householder", "housekeeper", "housemaster", "housemother", "houseplants", "housewifely", "hovercrafts", "huckleberry", "huckstering", "hullabaloos", "humidifiers", "humidifying", "humiliating", "humiliation", "hummingbird", "hunchbacked", "hundredfold", "hurtfulness", "hydrocarbon", "hydrogenate", "hydrometers", "hydrophobia", "hydroplaned", "hydroplanes", "hydroponics", "hydrosphere", "hygrometers", "hyperactive", "hypermarket", "hyphenating", "hyphenation", "hypocrisies", "hypodermics", "hypotenuses", "hypothalami", "hypothermia", "icebreakers", "iconoclasts", "iconography", "identically", "identifiers", "identifying", "ideological", "ideologists", "idiotically", "idyllically", "ignominious", "ignoramuses", "illicitness", "illiterates", "illogically", "illuminated", "illuminates", "illusionist", "illustrated", "illustrates", "illustrator", "illustrious", "imagination", "imaginative", "immediately", "immensities", "immigrating", "immigration", "immortality", "impairments", "impartially", "impassioned", "impassively", "impassivity", "impatiences", "impatiently", "impeachable", "impeachment", "impeccables", "impecunious", "impedimenta", "impediments", "impenitence", "impenitents", "imperatives", "imperfectly", "imperialism", "imperialist", "imperiously", "impermanent", "impermeable", "impersonate", "impertinent", "impetuosity", "impetuously", "impingement", "impiousness", "implausible", "implausibly", "implemented", "implementer", "implicating", "implication", "imploringly", "importantly", "importation", "importunate", "importuning", "importunity", "impositions", "impossibles", "impractical", "imprecation", "imprecisely", "imprecision", "impregnable", "impregnably", "impregnated", "impregnates", "impresarios", "impressions", "imprimaturs", "imprisoning", "impropriety", "improvement", "improvident", "improvising", "imprudently", "impulsively", "imputations", "inabilities", "inadequates", "inadvertent", "inadvisable", "inalienable", "inattention", "inattentive", "inaugurated", "inaugurates", "incantation", "incarcerate", "incarnating", "incarnation", "incessantly", "incidentals", "incinerated", "incinerates", "incinerator", "incitements", "inclination", "inclusively", "incoherence", "incompetent", "incongruity", "incongruous", "inconstancy", "incontinent", "incorporate", "incorporeal", "incorrectly", "increasings", "incredulity", "incredulous", "incremental", "incremented", "incriminate", "inculcating", "inculcation", "inculpating", "indecencies", "indecentest", "indefinable", "indefinably", "indefinites", "indemnified", "indemnifies", "indemnities", "indentation", "indenturing", "independent", "indexations", "indications", "indicatives", "indictments", "indifferent", "indigestion", "indignantly", "indignation", "indignities", "indirection", "individuals", "indivisible", "indivisibly", "indomitable", "indomitably", "indubitable", "indubitably", "inducements", "inductively", "indulgences", "indulgently", "industrious", "inebriating", "inebriation", "ineffective", "ineffectual", "inefficient", "inelegantly", "ineligibles", "ineluctable", "ineluctably", "inequitable", "inescapable", "inescapably", "inessential", "inestimable", "inestimably", "inexcusable", "inexcusably", "inexpedient", "inexpensive", "infanticide", "infantryman", "infantrymen", "infatuating", "infatuation", "inferential", "inferiority", "infertility", "infestation", "infiltrated", "infiltrates", "infiltrator", "infinitives", "infirmaries", "infirmities", "inflammable", "inflatables", "inflections", "influencing", "influential", "infomercial", "informality", "information", "informative", "infractions", "infrequency", "infuriating", "ingeniously", "ingenuously", "ingratiated", "ingratiates", "ingratitude", "ingredients", "inhabitable", "inhabitants", "inhalations", "inheritance", "inhibitions", "initiations", "initiatives", "injudicious", "injunctions", "innocentest", "innocuously", "innovations", "innuendoing", "innumerable", "inoculating", "inoculation", "inoffensive", "inoperative", "inopportune", "inquiringly", "inquisition", "inquisitive", "inquisitors", "inscription", "inscrutable", "inscrutably", "insecticide", "insectivore", "inseminated", "inseminates", "insensitive", "insentience", "inseparable", "inseparably", "insidiously", "insincerely", "insincerity", "insinuating", "insinuation", "insipidness", "insistently", "insouciance", "inspections", "inspiration", "instability", "instigating", "instigation", "instigators", "instinctive", "instinctual", "instituting", "institution", "instructing", "instruction", "instructive", "instructors", "instruments", "insultingly", "insuperable", "insuperably", "insurgences", "intangibles", "integrating", "integration", "integuments", "intelligent", "intemperate", "intensified", "intensifier", "intensifies", "intensities", "intensively", "intentional", "interacting", "interaction", "interactive", "interbreeds", "interceding", "intercepted", "interceptor", "intercessor", "interchange", "intercourse", "interdicted", "interesting", "interfacing", "interfering", "interjected", "interlacing", "interlarded", "interleaved", "interleaves", "interleukin", "interlinked", "interlocked", "interlopers", "interluding", "intermezzos", "intermingle", "internecine", "internships", "interoffice", "interpolate", "interposing", "interpreted", "interpreter", "interracial", "interregnum", "interrelate", "interrogate", "interrupted", "intersected", "intersperse", "interstates", "interstices", "intertwined", "intertwines", "intervening", "interviewed", "interviewee", "interviewer", "interweaves", "intimations", "intimidated", "intimidates", "intolerable", "intolerably", "intolerance", "intonations", "intoxicants", "intoxicated", "intoxicates", "intractable", "intractably", "intravenous", "intricacies", "intricately", "introducing", "introverted", "intuitively", "inundations", "invalidated", "invalidates", "invariables", "inventively", "inventoried", "inventories", "investigate", "investiture", "investments", "invidiously", "invigilated", "invigilates", "invigilator", "invigorated", "invigorates", "invitations", "invocations", "involuntary", "involvement", "ionospheres", "iridescence", "ironmongers", "ironmongery", "irradiating", "irradiation", "irrationals", "irreducible", "irreducibly", "irrefutable", "irrefutably", "irregularly", "irrelevance", "irrelevancy", "irreligious", "irreparable", "irreparably", "irreverence", "irrevocable", "irrevocably", "irritations", "itineraries", "jackhammers", "jackknifing", "jackrabbits", "jawbreakers", "jellyfishes", "jettisoning", "jinrikishas", "joblessness", "journalists", "joylessness", "judiciaries", "judiciously", "juggernauts", "justifiable", "justifiably", "juxtaposing", "kangarooing", "keelhauling", "kerchiefing", "kettledrums", "keyboarders", "keyboarding", "keyboardist", "keypunching", "keystroking", "kidnappings", "kindhearted", "kingfishers", "kitchenette", "kitchenware", "kleptomania", "knackwursts", "kneecapping", "knickknacks", "knighthoods", "knucklehead", "kookaburras", "laboriously", "lacerations", "laconically", "laddishness", "ladyfingers", "lamentation", "landholders", "landholding", "landlubbers", "landscapers", "landscaping", "landsliding", "languishing", "latitudinal", "latticework", "launderette", "laundresses", "laundrettes", "laundromats", "lavendering", "lawbreakers", "lawlessness", "leaderships", "leapfrogged", "leaseholder", "leatherette", "leatherneck", "lecherously", "lectureship", "legerdemain", "legionaries", "legionnaire", "legislating", "legislation", "legislative", "legislators", "legislature", "legitimated", "legitimates", "leisurewear", "lengthening", "leprechauns", "letterboxes", "letterheads", "leucotomies", "levelheaded", "liabilities", "libertarian", "librettists", "licentiates", "lieutenancy", "lieutenants", "lightheaded", "lighthouses", "lightninged", "lightweight", "likableness", "likelihoods", "lilliputian", "limelighted", "limitations", "linebackers", "lingeringly", "linguistics", "lionhearted", "liposuction", "lipsticking", "liquidating", "liquidation", "liquidators", "literalness", "lithographs", "lithography", "lithosphere", "livelihoods", "locomotives", "logarithmic", "loggerheads", "loudhailers", "loudmouthed", "loudspeaker", "loutishness", "lubricating", "lubrication", "lubricators", "lucratively", "ludicrously", "lumberjacks", "lumberyards", "luminescent", "luncheoning", "luxuriantly", "luxuriating", "luxuriously", "machination", "macrobiotic", "macroscopic", "maddeningly", "magisterial", "magistrates", "magnanimity", "magnanimous", "magnificent", "maidenheads", "maidservant", "mainsprings", "mainstreams", "maintainers", "maintaining", "maintenance", "maisonettes", "makeweights", "maladjusted", "maladroitly", "malapropism", "malcontents", "malediction", "malefactors", "malevolence", "malfeasance", "malfunction", "maliciously", "malignantly", "malingerers", "malingering", "malpractice", "maltreating", "mammography", "managements", "manhandling", "manicurists", "manifesting", "manifestoed", "manifolding", "manipulated", "manipulates", "manipulator", "mannishness", "mantelpiece", "mantelshelf", "manufacture", "manumitting", "manuscripts", "marathoners", "marchioness", "marionettes", "marketplace", "marshmallow", "masculinity", "masochistic", "masqueraded", "masquerader", "masquerades", "massiveness", "masterclass", "masterfully", "masterminds", "masterpiece", "masterworks", "masticating", "mastication", "masturbated", "masturbates", "matchmakers", "matchmaking", "matchsticks", "materialism", "materialist", "mathematics", "matriarchal", "matriculate", "matrimonial", "mavericking", "mawkishness", "meadowlarks", "meanderings", "meaningless", "measureless", "measurement", "mechanistic", "medications", "medicinally", "meditations", "megalomania", "megalopolis", "megaphoning", "melancholia", "melancholic", "mellifluous", "melodically", "melodiously", "memberships", "memorabilia", "memorandums", "menservants", "menstruated", "menstruates", "mentalities", "mentholated", "mercenaries", "merchandise", "merchanting", "merchantman", "merchantmen", "mercilessly", "meritocracy", "meritorious", "merrymakers", "merrymaking", "metabolisms", "metacarpals", "metamorphic", "metaphysics", "metatarsals", "meteorology", "methodology", "metrication", "microfilmed", "microlights", "microphones", "microscopes", "microscopic", "microsecond", "microwaving", "middlebrows", "midfielders", "midsections", "midwiferies", "mileometers", "militarists", "millenniums", "millionaire", "millisecond", "milquetoast", "mimeographs", "mindfulness", "minesweeper", "miniaturing", "miniaturist", "minimalists", "ministerial", "ministering", "ministrants", "mirthlessly", "misalliance", "misanthrope", "misanthropy", "misapplying", "misbegotten", "misbehaving", "miscarriage", "miscarrying", "mischancing", "mischiefing", "mischievous", "misconceive", "misconducts", "misconstrue", "miscounting", "misdiagnose", "misdirected", "miserliness", "misfeasance", "misfortunes", "misgoverned", "misguidedly", "mishandling", "misidentify", "misinformed", "mismanaging", "mismatching", "misnomering", "misogynists", "misprinting", "misreadings", "misreported", "misspelling", "misspending", "misstepping", "mistreating", "mistrustful", "mistrusting", "mizzenmasts", "mockingbird", "modernistic", "modulations", "molestation", "mollycoddle", "momentarily", "monarchical", "monarchists", "monasteries", "monasticism", "monetarists", "moneylender", "moneymakers", "moneymaking", "monkeyshine", "monochromes", "monogrammed", "monolingual", "monologuing", "monomaniacs", "monopolists", "monotheists", "monstrances", "monstrosity", "monstrously", "moonlighted", "moonlighter", "moratoriums", "mortarboard", "mothballing", "motherboard", "motherlands", "motivations", "motocrosses", "motorbiking", "motorcycled", "motorcycles", "motormouths", "mountaineer", "mountainous", "mountaintop", "mountebanks", "mournfuller", "mouthpieces", "mouthwashes", "mudslingers", "mudslinging", "multiplexed", "multiplexer", "multiplexes", "multipliers", "multiplying", "multiracial", "municipally", "munificence", "murderesses", "murderously", "muscularity", "musculature", "mushrooming", "muskellunge", "mustachioed", "mutilations", "mutineering", "mythologies", "mythologist", "myxomatosis", "nailbrushes", "nanoseconds", "naphthalene", "narcissists", "narcoleptic", "nasturtiums", "nationalism", "nationalist", "nationality", "naturalists", "naturalness", "naughtiness", "neanderthal", "nearsighted", "necessaries", "necessarily", "necessitate", "necessities", "neckerchief", "necklacings", "necromancer", "necrophilia", "needlepoint", "needlewoman", "needlewomen", "nefariously", "negligently", "negotiating", "negotiation", "negotiators", "nervelessly", "nervousness", "netherworld", "neurologist", "neutralists", "newscasters", "newscasting", "newsflashes", "newsletters", "newspapered", "newsreaders", "nickelodeon", "nightingale", "nightlights", "nightmarish", "nightshades", "nightshirts", "nightstands", "nightsticks", "nincompoops", "nineteenths", "nitrogenous", "nocturnally", "noiselessly", "noisemakers", "nominations", "nominatives", "nonabrasive", "nonbeliever", "nonchalance", "nondescript", "nondrinkers", "nonentities", "nonetheless", "nonexistent", "nonpartisan", "nonpayments", "nonphysical", "nonplussing", "nonresident", "nonseasonal", "nonsensical", "nonspecific", "nonstandard", "nonstarters", "nonviolence", "northeaster", "northerlies", "northerners", "nothingness", "noticeboard", "notoriously", "nourishment", "numerations", "numerically", "numismatics", "numismatist", "nutcrackers", "nutritional", "nymphomania", "obfuscating", "obfuscation", "objectively", "objectivity", "obligations", "obliqueness", "obliterated", "obliterates", "obliviously", "obnoxiously", "obscenities", "obscurities", "observances", "observantly", "observation", "observatory", "obsessional", "obsessively", "obsolescent", "obstetrical", "obstinately", "obstructing", "obstruction", "obstructive", "obtrusively", "obviousness", "occasioning", "occidentals", "occupations", "occurrences", "odoriferous", "offensively", "offertories", "offhandedly", "officialdom", "officialese", "officiating", "officiously", "oligarchies", "omnipotence", "omnipresent", "omniscience", "oncologists", "onerousness", "ontological", "opalescence", "operational", "opinionated", "opportunely", "opportunism", "opportunist", "opportunity", "oppositions", "opprobrious", "optometrist", "orchestrate", "orderliness", "ordinariest", "ordinations", "organically", "orientalist", "orientating", "orientation", "originality", "originating", "origination", "originators", "ornamenting", "ornithology", "orthodontia", "orthodontic", "orthodoxies", "orthography", "oscillating", "oscillation", "oscillators", "ostentation", "outbalanced", "outbalances", "outbreaking", "outbuilding", "outbursting", "outclassing", "outcropping", "outdistance", "outfielders", "outflanking", "outguessing", "outnumbered", "outpatients", "outperforms", "outpointing", "outpourings", "outreaching", "outsmarting", "outsourcing", "outspokenly", "outstanding", "outstations", "outstripped", "outweighing", "overachieve", "overanxious", "overarching", "overbalance", "overbearing", "overbidding", "overbooking", "overburdens", "overcasting", "overcharged", "overcharges", "overcooking", "overcrowded", "overdevelop", "overdrawing", "overdressed", "overdresses", "overexcited", "overexcites", "overexposed", "overexposes", "overextends", "overflights", "overflowing", "overgrowing", "overhanging", "overhauling", "overhearing", "overheating", "overindulge", "overkilling", "overlapping", "overloading", "overlooking", "overmanning", "overplaying", "overpowered", "overpricing", "overprinted", "overproduce", "overreached", "overreaches", "overreacted", "overrunning", "overselling", "overshadows", "overspreads", "overstaffed", "overstating", "overstaying", "overstepped", "overstocked", "overstretch", "overstuffed", "overturning", "overvaluing", "overweening", "overwhelmed", "overwinters", "overworking", "overwriting", "overwritten", "overwrought", "overzealous", "oxygenating", "oxygenation", "pacesetters", "pacifically", "paediatrics", "painfullest", "painkillers", "painkilling", "painstaking", "paleolithic", "palimpsests", "palindromes", "palindromic", "pallbearers", "palliatives", "palpitating", "palpitation", "pamphleteer", "pandemonium", "panhandlers", "panhandling", "pantheistic", "pantomiming", "paperbacked", "paperhanger", "paperweight", "paracetamol", "parachuting", "parachutist", "paradoxical", "paragliding", "paragraphed", "parallelism", "paramedical", "paramountcy", "paraphrased", "paraphrases", "paraplegics", "parasitical", "paratrooper", "parentheses", "parenthesis", "parenthetic", "parishioner", "parliaments", "parochially", "participant", "participate", "participial", "participles", "particulars", "particulate", "partitioned", "partnership", "parturition", "passageways", "passionated", "passionates", "passionless", "passivising", "passivizing", "pastureland", "paternalism", "paternalist", "pathfinders", "pathologist", "patisseries", "patriarchal", "patrimonial", "patrimonies", "patrolwoman", "patrolwomen", "patronesses", "patronymics", "pavementing", "pawnbrokers", "peacefuller", "peacekeeper", "peacemakers", "peashooters", "peculiarity", "pedagogical", "pedagoguing", "pedestrians", "peevishness", "pejoratives", "penetrating", "penetration", "penetrative", "penitential", "pennyweight", "penologists", "pensionable", "pensiveness", "pentagonals", "pentameters", "pentathlons", "penthousing", "penultimate", "peppercorns", "peppermints", "perambulate", "perceivable", "percentages", "percentiles", "perceptible", "perceptibly", "perceptions", "percolating", "percolation", "percolators", "perennially", "perestroika", "perfectible", "perfections", "perforating", "perforation", "performance", "perfumeries", "perfunctory", "pericardium", "periodicals", "periodicity", "periodontal", "peripatetic", "peripherals", "peripheries", "periphrases", "periphrasis", "periscoping", "perishables", "peritoneums", "peritonitis", "periwigging", "periwinkles", "permanently", "permissible", "permissibly", "permissions", "permutation", "perorations", "perpetrated", "perpetrates", "perpetrator", "perpetually", "perpetuated", "perpetuates", "perplexedly", "perquisites", "persecuting", "persecution", "persecutors", "persevering", "persistence", "persnickety", "personality", "personified", "personifies", "perspective", "perspicuity", "perspicuous", "persuasions", "pertinacity", "pertinently", "pervasively", "perversions", "pessimistic", "pestilences", "petitioners", "petitioning", "petrodollar", "pettifogged", "pettifogger", "pharmacists", "phenomenons", "philandered", "philanderer", "philatelist", "philistines", "philologist", "philosopher", "philosophic", "phonetician", "phonographs", "phonologist", "photocopied", "photocopier", "photocopies", "photographs", "photography", "phrasebooks", "phraseology", "physicality", "physiognomy", "pianissimos", "pianofortes", "picaresques", "pickpockets", "pictographs", "pictorially", "picturesque", "pigeonholed", "pigeonholes", "piggishness", "piggybacked", "pigheadedly", "pilgrimages", "pillowcases", "pillowslips", "pilothouses", "pincushions", "pinfeathers", "pinpointing", "pinpricking", "pinwheeling", "pirouetting", "piscatorial", "pitchblende", "pitchforked", "pitifullest", "pituitaries", "placeholder", "plagiarisms", "plagiarists", "plainspoken", "plaintively", "planetarium", "plantations", "platforming", "playfulness", "playgrounds", "playschools", "playwrights", "pleasantest", "pleasurable", "pleasurably", "plebiscites", "plentifully", "pluperfects", "pluralistic", "pluralities", "plutocratic", "pocketbooks", "pocketknife", "pockmarking", "podiatrists", "poinsettias", "pointillism", "pointillist", "pointlessly", "poisonously", "polemicists", "policewoman", "policewomen", "policymaker", "politically", "politicians", "politicking", "pollinating", "pollination", "poltergeist", "polyandrous", "polygamists", "polygraphed", "polyhedrons", "polymorphic", "polynomials", "polystyrene", "polytechnic", "polytheists", "pomegranate", "pompadoured", "pompousness", "ponderously", "pontificate", "populations", "pornography", "portability", "porterhouse", "portmanteau", "portraitist", "portraiture", "positioning", "positivists", "possessions", "possessives", "possibility", "postmarking", "postmasters", "postmortems", "postscripts", "postulating", "potentially", "powerhouses", "powerlessly", "practicable", "practicably", "practically", "pragmatists", "prearranged", "prearranges", "precautions", "precipitant", "precipitate", "precipitous", "preciseness", "preconceive", "predeceased", "predeceases", "predecessor", "predestined", "predestines", "predicament", "predicating", "predication", "predicative", "predictable", "predictably", "predictions", "predigested", "predisposed", "predisposes", "predominant", "predominate", "preeminence", "preexisting", "prefectures", "preferences", "prefiguring", "pregnancies", "prehistoric", "prejudicial", "prejudicing", "preliminary", "preliterate", "prematurely", "premeditate", "premiership", "premonition", "premonitory", "preoccupied", "preoccupies", "preordained", "prepackaged", "prepackages", "preparation", "preparatory", "prepayments", "preposition", "prerecorded", "preregister", "prerogative", "preschooler", "prescribing", "presentable", "prestigious", "presumption", "presumptive", "presupposed", "presupposes", "pretentious", "prettifying", "prevaricate", "preventable", "preventives", "priestesses", "priesthoods", "priestliest", "primitively", "primordials", "princeliest", "principally", "principling", "printmaking", "privileging", "prizefights", "proactively", "probability", "probationer", "problematic", "proboscises", "proceedings", "processions", "proclaiming", "procreating", "procreation", "procreative", "procurators", "procurement", "prodigality", "productions", "profanation", "profanities", "professions", "proficiency", "proficients", "profiteered", "profiterole", "profligates", "profoundest", "progenitors", "prognostics", "programmers", "progressing", "progression", "progressive", "prohibiting", "prohibition", "prohibitive", "prohibitory", "projectiles", "projections", "proletarian", "proletariat", "proliferate", "promenading", "prominently", "promiscuity", "promiscuous", "promisingly", "promotional", "promulgated", "promulgates", "pronouncing", "proofreader", "propagating", "propagation", "propagators", "propellants", "prophesying", "prophylaxis", "propinquity", "propitiated", "propitiates", "proportions", "proposition", "propounding", "proprietary", "proprieties", "proprietors", "prosaically", "prosceniums", "proscribing", "prosecuting", "prosecution", "prosecutors", "proselyting", "prospecting", "prospective", "prospectors", "prosthetics", "prostituted", "prostitutes", "prostrating", "prostration", "protagonist", "protections", "protectives", "protestants", "prototyping", "protracting", "protraction", "protractors", "protrusions", "protuberant", "provenances", "provendered", "providently", "provincials", "provisional", "provisioned", "provocateur", "provocation", "provocative", "prudentials", "prudishness", "psychedelia", "psychedelic", "psychiatric", "psychically", "psychodrama", "psychogenic", "psychopaths", "pterodactyl", "publication", "publishable", "pulchritude", "punctilious", "punctuality", "punctuating", "punctuation", "punishingly", "punishments", "purchasable", "purgatorial", "purgatories", "puritanical", "purportedly", "purposeless", "pussyfooted", "putrescence", "pyromaniacs", "pyrotechnic", "quadrangles", "quadrennial", "quadrilling", "quadruplets", "quadrupling", "qualitative", "quantifiers", "quantifying", "quarantined", "quarantines", "quarrelsome", "quarterback", "quarterdeck", "quarterlies", "querulously", "questioners", "questioning", "quicksilver", "quintuplets", "quintupling", "quizzically", "racecourses", "racketeered", "racquetball", "radioactive", "radiocarbon", "radiography", "radiologist", "raffishness", "ragamuffins", "railroading", "rancorously", "rangefinder", "rapaciously", "rapporteurs", "rapscallion", "rapturously", "raspberries", "ratatouille", "rathskeller", "rationalism", "rationalist", "rationality", "rattlesnake", "rattletraps", "raucousness", "raunchiness", "ravishingly", "reactionary", "reactivated", "reactivates", "readability", "readdressed", "readdresses", "readerships", "readjusting", "readmitting", "reaffirming", "realignment", "reallocated", "reallocates", "realpolitik", "reanimating", "reappearing", "reappointed", "reapportion", "reappraisal", "reappraised", "reappraises", "rearranging", "reassembled", "reassembles", "reasserting", "reassessing", "reassigning", "reassurance", "reawakening", "rebroadcast", "recantation", "recapturing", "receivables", "receptacles", "receptively", "receptivity", "recessional", "recidivists", "reciprocals", "reciprocate", "reciprocity", "recitations", "recitatives", "reclamation", "recognition", "recollected", "recombining", "recommenced", "recommences", "recommended", "recompensed", "recompenses", "recompiling", "reconciling", "recondition", "reconfigure", "reconnected", "reconquered", "reconsiders", "reconstruct", "reconvening", "recoverable", "recreations", "recriminate", "recruitment", "rectangular", "rectifiable", "rectilinear", "recuperated", "recuperates", "recurrences", "recursively", "recyclables", "redcurrants", "redecorated", "redecorates", "rededicated", "rededicates", "redeploying", "redesigning", "redeveloped", "redirecting", "redirection", "rediscovers", "rediscovery", "redistricts", "redoubtable", "redundantly", "reeducating", "reeducation", "reelections", "reenactment", "reenlisting", "reestablish", "reevaluated", "reevaluates", "reexamining", "refashioned", "refectories", "referencing", "referendums", "referential", "refinancing", "refinements", "refinishing", "reflections", "reflexively", "reflexology", "reforesting", "reformation", "reformatory", "reformatted", "reformulate", "refreshment", "refrigerant", "refrigerate", "refurbished", "refurbishes", "refurnished", "refurnishes", "refutations", "regenerated", "regenerates", "regimentals", "regimenting", "regionalism", "registering", "registrants", "regressions", "regretfully", "regrettable", "regrettably", "regulations", "regurgitate", "reimbursing", "reincarnate", "reinforcing", "reinserting", "reinstating", "reinsurance", "reinterpret", "reinventing", "reinvesting", "reiterating", "reiteration", "rejiggering", "rejuvenated", "rejuvenates", "relatedness", "relativists", "relaunching", "relaxations", "reliability", "religiosity", "religiously", "reliquaries", "relocatable", "reluctantly", "remaindered", "remarriages", "remastering", "remembering", "remembrance", "reminiscent", "reminiscing", "remittances", "remonstrate", "remorseless", "remortgaged", "remortgages", "remunerated", "remunerates", "renaissance", "renascences", "renditioned", "renegotiate", "renovations", "renumbering", "reoccupying", "reoccurring", "repackaging", "reparations", "reparteeing", "repatriated", "repatriates", "repertoires", "repertories", "repetitions", "repetitious", "replaceable", "replacement", "replenished", "replenishes", "replicating", "replication", "repossessed", "repossesses", "reprehended", "represented", "repressions", "reprimanded", "reproachful", "reproaching", "reprocessed", "reprocesses", "reproducing", "reprovingly", "republicans", "republished", "republishes", "repudiating", "repudiation", "repulsively", "reputations", "requirement", "requisition", "rescheduled", "reschedules", "researchers", "researching", "resemblance", "resentfully", "resentments", "reservation", "reshuffling", "residencies", "residential", "resignation", "resiliently", "resistances", "resolutions", "resourceful", "respectable", "respectably", "respiration", "respirators", "respiratory", "resplendent", "respondents", "responsible", "responsibly", "restatement", "restaurants", "restfullest", "restfulness", "restitution", "restiveness", "restoration", "restorative", "restraining", "restricting", "restriction", "restrictive", "restructure", "resubmitted", "resumptions", "resupplying", "resurfacing", "resurgences", "resurrected", "resuscitate", "retaliating", "retaliation", "retaliatory", "retardation", "reticulated", "retirements", "retractable", "retractions", "retrenching", "retribution", "retributive", "retrievable", "retroactive", "retrofitted", "retrograded", "retrogrades", "retrorocket", "retrospects", "returnables", "reupholster", "revaluation", "revealingly", "revelations", "reverberate", "reverencing", "reverential", "revisionism", "revisionist", "revivalists", "revivifying", "revocations", "revoltingly", "revolutions", "rhetorician", "rhinestones", "ricocheting", "righteously", "ringleaders", "ringmasters", "riotousness", "ritualistic", "riverfronts", "roadblocked", "roadrunners", "roguishness", "romanticism", "romanticist", "rotisseries", "rotogravure", "rottweilers", "roughhoused", "roughhouses", "roughnecked", "roundabouts", "roundhouses", "roustabouts", "rubbernecks", "rudimentary", "rumbustious", "ruminations", "rustproofed", "sabbaticals", "sacramental", "sacramented", "sacrificial", "sacrificing", "safeguarded", "safekeeping", "sagaciously", "sailboarded", "saintliness", "salaciously", "salamanders", "salesclerks", "salespeople", "salesperson", "salmonellae", "saltcellars", "saltshakers", "salutations", "salvageable", "sanatoriums", "sanctifying", "sanctioning", "sanctuaries", "sandbagging", "sandblasted", "sandblaster", "sandcastles", "sandpapered", "sandwiching", "sanitariums", "saprophytes", "sarcophagus", "sartorially", "sassafrases", "satanically", "satelliting", "satirically", "saxophonist", "scaffolding", "scapegoated", "scaremonger", "scatterings", "sceptically", "schismatics", "schlockiest", "schmaltzier", "scholarship", "schoolbooks", "schoolchild", "schoolgirls", "schoolhouse", "schoolmarms", "schoolmates", "schoolrooms", "schoolyards", "scintillate", "scoreboards", "scorekeeper", "scoutmaster", "scraggliest", "scratchcard", "scratchiest", "scratchpads", "screamingly", "screechiest", "screenplays", "screwdriver", "scrimmaging", "scrimshawed", "scruffiness", "scrumhalves", "scrumptious", "scrutineers", "sculpturing", "scuttlebutt", "searchingly", "searchlight", "seasickness", "seasonality", "seaworthier", "secondaries", "secondarily", "secondments", "secretarial", "secretariat", "secretaries", "secretively", "secularists", "sedimentary", "seductively", "segregating", "segregation", "seismically", "seismograph", "selectively", "selectivity", "selfishness", "sellotaping", "semaphoring", "semicircles", "semimonthly", "seminarians", "semiprivate", "semiquavers", "semiskilled", "semitrailer", "sensational", "senselessly", "sensibility", "sensitively", "sensitivity", "sententious", "sentimental", "separations", "separatists", "sequestered", "sequestrate", "serendipity", "seriousness", "serviceable", "settlements", "seventeenth", "seventieths", "sexologists", "shadowboxed", "shadowboxes", "shallowness", "shamanistic", "shamelessly", "shanghaiing", "shantytowns", "shapelessly", "shapeliness", "shareholder", "shellacking", "shellfishes", "shenanigans", "shepherdess", "shepherding", "shibboleths", "shillelaghs", "shipbuilder", "shipwrecked", "shipwrights", "shirtsleeve", "shirtwaists", "shoehorning", "shoestrings", "shopaholics", "shopfitters", "shopfitting", "shopkeepers", "shoplifters", "shoplifting", "shortchange", "shortcoming", "shortenings", "shorthanded", "shortlisted", "shotgunning", "shouldering", "showboating", "showerproof", "showgrounds", "showjumping", "showmanship", "showstopper", "shrubberies", "shutterbugs", "shuttlecock", "sickeningly", "sidesaddles", "sidestepped", "sidestroked", "sidestrokes", "sideswiping", "sidetracked", "sightseeing", "signatories", "significant", "signposting", "silhouetted", "silhouettes", "silversmith", "simperingly", "simplifying", "simulacrums", "simulations", "simulcasted", "singsonging", "singularity", "sisterhoods", "skateboards", "skedaddling", "skeptically", "sketchbooks", "skirmishers", "skirmishing", "skulduggery", "skyrocketed", "skyscrapers", "slaphappier", "slaughtered", "slaughterer", "sleazeballs", "sleeplessly", "sleepwalked", "sleepwalker", "sleepyheads", "slenderness", "slipperiest", "slipstreams", "slovenliest", "slowcoaches", "smallholder", "smatterings", "smithereens", "smokehouses", "smokescreen", "smokestacks", "snapdragons", "snowballing", "snowboarded", "snowboarder", "snowmobiled", "snowmobiles", "snowploughs", "snowplowing", "snowshoeing", "sociability", "socialistic", "sociologist", "softhearted", "solemnities", "solidifying", "soliloquies", "solipsistic", "somersaults", "songwriters", "songwriting", "soothsayers", "sophistries", "sorceresses", "sorrowfully", "soulfulness", "soundlessly", "soundproofs", "soundtracks", "sousaphones", "southerlies", "southerners", "southwester", "sovereignty", "spacecrafts", "spaceflight", "spacewalked", "spanielling", "sparrowhawk", "speakeasies", "spearheaded", "specialisms", "specialists", "specifiable", "specificity", "spectacular", "speculating", "speculation", "speculative", "speculators", "speechified", "speechifies", "speedometer", "spellbinder", "spendthrift", "spermatozoa", "spermicidal", "spermicides", "spinelessly", "spiritually", "spitefuller", "splashdowns", "splattering", "splendidest", "splintering", "splotchiest", "spluttering", "spoilsports", "spokeswoman", "spokeswomen", "sponsorship", "spontaneity", "spontaneous", "spoonerisms", "sportscasts", "sportswoman", "sportswomen", "spotlighted", "spreadsheet", "sprightlier", "springboard", "springiness", "sprinklings", "squandering", "squattering", "squeamishly", "squeegeeing", "squiggliest", "stablemates", "stagestruck", "stagflation", "staggerings", "stakeholder", "stalactites", "stalagmites", "stalemating", "stallholder", "standoffish", "standpoints", "standstills", "startlingly", "statehouses", "stateliness", "statemented", "stateswoman", "stateswomen", "statistical", "statutorily", "staunchness", "steadfastly", "steakhouses", "stealthiest", "steamrolled", "steamroller", "steelmakers", "steelworker", "steeplejack", "stenography", "stepbrother", "stepfathers", "stepladders", "stepmothers", "stepparents", "stepsisters", "stereoscope", "stereotyped", "stereotypes", "stethoscope", "stewardship", "stickleback", "stillbirths", "stimulating", "stimulation", "stimulative", "stipendiary", "stipulating", "stipulation", "stockbroker", "stockholder", "stockpiling", "stocktaking", "stomachache", "stonemasons", "stonewalled", "stonewashed", "stopwatches", "storefronts", "storehouses", "storekeeper", "storyboards", "storyteller", "straggliest", "straightens", "straightest", "straighting", "straitening", "straitlaced", "strangeness", "strangering", "strangulate", "straplesses", "strategical", "strategists", "stratifying", "streamlined", "streamlines", "streetlamps", "streetlight", "strengthens", "strenuously", "stretchered", "stretchiest", "strikebound", "stringently", "stripteased", "stripteases", "strongboxes", "strongholds", "strongrooms", "stroppiness", "structuring", "strumpeting", "stubbornest", "stubborning", "studentship", "stultifying", "stupidities", "stylishness", "subbasement", "subcompacts", "subcontract", "subcultures", "subdividing", "subdivision", "subheadings", "subjectives", "subjugating", "subjugation", "subjunctive", "sublimating", "sublimation", "submariners", "submergence", "submersible", "submissions", "subordinate", "subornation", "subpoenaing", "subprograms", "subroutines", "subscribers", "subscribing", "subsections", "subsequents", "subservient", "subsistence", "substandard", "substantial", "substantive", "substations", "substituted", "substitutes", "subterfuges", "subtracting", "subtraction", "subtrahends", "subtropical", "suburbanite", "subventions", "subversives", "successions", "succinctest", "sufficiency", "suffocating", "suffocation", "suffragette", "suffragists", "sugarcoated", "suggestible", "suggestions", "suitability", "summerhouse", "sumptuously", "supercharge", "superficial", "superfluity", "superfluous", "superheroes", "superimpose", "superintend", "superiority", "superlative", "supermarket", "supermodels", "superpowers", "superscript", "superseding", "supersonics", "superstates", "superstores", "supertanker", "supervening", "supervising", "supervision", "supervisors", "supervisory", "supplanting", "supplements", "supplicants", "supplicated", "supplicates", "supportable", "supposition", "suppository", "suppressant", "suppressing", "suppression", "suppressors", "suppurating", "suppuration", "supremacist", "surcharging", "surfboarded", "surmounting", "surplussing", "surprisings", "surrealists", "surrendered", "surrounding", "susceptible", "suspenseful", "suspensions", "sustainable", "swallowtail", "sweatshirts", "sweepstakes", "sweetbreads", "sweetbriers", "sweethearts", "swellheaded", "swelterings", "switchbacks", "switchblade", "switchboard", "swordfishes", "sycophantic", "syllabified", "syllabifies", "syllogistic", "symmetrical", "sympathetic", "symptomatic", "synchronous", "syncopating", "syncopation", "syndicalism", "syndicalist", "syndicating", "syndication", "synergistic", "syntactical", "syphilitics", "systematics", "tabernacles", "tablecloths", "tablespoons", "tabulations", "tachographs", "tachometers", "taciturnity", "tagliatelle", "tambourines", "tangibility", "taskmasters", "tastelessly", "tattletales", "tautologies", "taxidermist", "teargassing", "tearjerkers", "teaspoonful", "technically", "technicians", "technocracy", "technocrats", "technophobe", "tediousness", "teenybopper", "teetotalism", "telecasters", "telecasting", "telecommute", "telegraphed", "telegrapher", "telegraphic", "telekinesis", "telemetries", "telephoning", "telephonist", "teleprinter", "telescoping", "televisions", "teleworkers", "teleworking", "temperament", "temperating", "temperature", "tempestuous", "temporaries", "temporarily", "temptations", "temptresses", "tenaciously", "tendentious", "tenderfoots", "tenderloins", "tentatively", "tenuousness", "terminating", "termination", "terminators", "terminology", "terrestrial", "territorial", "territories", "tessellated", "tessellates", "testimonial", "testimonies", "tetrahedron", "thalidomide", "thankfuller", "thanklessly", "theatricals", "thenceforth", "theocracies", "theodolites", "theologians", "theological", "theoretical", "therapeutic", "thereabouts", "thermometer", "thermostats", "thesauruses", "thickenings", "thicknesses", "thimblefuls", "thingamabob", "thingamajig", "thingumabob", "thingummies", "thirteenths", "thistledown", "thoroughest", "thoughtless", "thousandths", "threatening", "threescores", "thriftiness", "thrillingly", "throatiness", "thumbprints", "thumbscrews", "thunderbolt", "thunderclap", "thunderhead", "tiddlywinks", "tiebreakers", "tightfisted", "timberlines", "timekeepers", "timekeeping", "timeservers", "timeserving", "timetabling", "tinderboxes", "titillating", "titillation", "toastmaster", "tobacconist", "tobogganing", "tomahawking", "tonsillitis", "toothpastes", "topographer", "topographic", "topological", "touchpapers", "touchstones", "tournaments", "tourniquets", "townspeople", "tracheotomy", "trademarked", "traditional", "traffickers", "trafficking", "tragicomedy", "trailblazer", "trampolined", "trampolines", "tranquilest", "transacting", "transaction", "transceiver", "transcended", "transcribed", "transcribes", "transcripts", "transducers", "transferals", "transferred", "transfigure", "transfinite", "transfixing", "transformed", "transformer", "transfusing", "transfusion", "transistors", "transitions", "transitives", "translating", "translation", "translators", "translucent", "transmittal", "transmitted", "transmitter", "transmuting", "transparent", "transpiring", "transplants", "transponder", "transported", "transporter", "transposing", "transsexual", "transversed", "transverses", "trapezoidal", "travelogues", "travestying", "treacheries", "treacherous", "treasonable", "tremulously", "trenchantly", "trendsetter", "trepidation", "trespassers", "trespassing", "triathletes", "tribeswoman", "tribeswomen", "tribulation", "tributaries", "triceratops", "trilaterals", "trillionths", "triplicated", "triplicates", "triumvirate", "troglodytes", "trombonists", "troposphere", "troubadours", "troubleshot", "troublesome", "truculently", "trusteeship", "trustworthy", "tuberculous", "tumbleweeds", "tunefulness", "turbocharge", "turbulently", "turnarounds", "turtledoves", "turtlenecks", "typecasting", "typescripts", "typesetters", "typesetting", "typewriters", "typewriting", "typewritten", "typographer", "typographic", "tyrannosaur", "ultramarine", "ultrasonics", "ultrasounds", "ultraviolet", "umbrellaing", "unabridgeds", "unalterable", "unalterably", "unambiguous", "unambitious", "unanimously", "unannounced", "unappealing", "unashamedly", "unavailable", "unavoidable", "unavoidably", "unawareness", "unbalancing", "unbelievers", "unbelieving", "unblemished", "unbreakable", "unburdening", "unbuttoning", "unceasingly", "uncertainly", "uncertainty", "unchristian", "uncleanlier", "uncleanness", "uncluttered", "uncollected", "uncommitted", "uncommonest", "uncompleted", "unconcerned", "unconfirmed", "uncongenial", "unconnected", "unconscious", "uncontested", "unconvinced", "uncountable", "uncrushable", "undeceiving", "undecidable", "undefinable", "undelivered", "undemanding", "underacting", "underarming", "undercharge", "undercoated", "underexpose", "underfunded", "underground", "undergrowth", "underhanded", "underlining", "undermanned", "undermining", "underneaths", "underpasses", "underpaying", "underpinned", "underplayed", "underrating", "underscored", "underscores", "undershirts", "undershoots", "undershorts", "undersigned", "underskirts", "understands", "understated", "understates", "undertakers", "undertaking", "undervalued", "undervalues", "underweight", "underwhelms", "underworlds", "underwriter", "underwrites", "undeserving", "undesirable", "undeveloped", "undignified", "undisclosed", "undisguised", "undisturbed", "undoubtedly", "undulations", "unemotional", "unendurable", "unequivocal", "unethically", "unexplained", "unfailingly", "unfaltering", "unfastening", "unfeelingly", "unfettering", "unflappable", "unflinching", "unforgiving", "unfortunate", "unfulfilled", "unfurnished", "ungainliest", "unhappiness", "unhealthful", "unhealthier", "unhealthily", "unhelpfully", "unhurriedly", "unification", "unimportant", "unimpressed", "uninhabited", "uninhibited", "uninitiated", "uninspiring", "universally", "unjustified", "unkindliest", "unknowingly", "unlikeliest", "unmemorable", "unmitigated", "unnaturally", "unnecessary", "unnervingly", "unobservant", "unobtrusive", "unoffensive", "unpalatable", "unpatriotic", "unperturbed", "unprintable", "unpromising", "unprotected", "unpublished", "unqualified", "unreachable", "unrealistic", "unreasoning", "unregulated", "unrehearsed", "unrelenting", "unremitting", "unrepentant", "unrewarding", "unsatisfied", "unsaturated", "unscheduled", "unscrambled", "unscrambles", "unseemliest", "unselfishly", "unsheathing", "unsightlier", "unsolicited", "unspeakable", "unspeakably", "unspecified", "unsteadiest", "unstoppable", "unsupported", "unsurpassed", "unsuspected", "unsweetened", "unthinkable", "untimeliest", "untouchable", "untypically", "unutterable", "unutterably", "unvarnished", "unwarranted", "unwelcoming", "unwholesome", "unwieldiest", "unwillingly", "unwittingly", "unworthiest", "upbringings", "upholstered", "upholsterer", "uprightness", "upstreaming", "uselessness", "utilitarian", "vacationers", "vacationing", "vaccinating", "vaccination", "vacillating", "vacillation", "vacuousness", "vagabonding", "valedictory", "validations", "vanquishing", "variability", "variegating", "variegation", "vasectomies", "vegeburgers", "vegetarians", "ventilating", "ventilation", "ventilators", "ventricular", "venturesome", "verdigrised", "verdigrises", "vernaculars", "versatility", "vertebrates", "vertiginous", "vestigially", "vexatiously", "vibraphones", "vicariously", "vichyssoise", "viciousness", "vicissitude", "videophones", "videotaping", "viewfinders", "vigilantism", "vinaigrette", "vindicating", "vindication", "vindicators", "violincello", "violoncello", "viscountess", "visionaries", "visitations", "viticulture", "vituperated", "vituperates", "vivaciously", "vivisection", "vociferated", "vociferates", "volleyballs", "voluntaries", "voluntarily", "volunteered", "voraciously", "vouchsafing", "voyeuristic", "vulgarities", "wainscoting", "waistcoated", "wakefulness", "wallflowers", "wallpapered", "wanderlusts", "warehousing", "warmhearted", "warrantying", "washerwoman", "washerwomen", "wastebasket", "watchmakers", "watchstraps", "watchtowers", "watercourse", "waterfronts", "waterlogged", "watermarked", "watermelons", "waterproofs", "waterspouts", "waterwheels", "wavelengths", "waywardness", "wealthiness", "weathercock", "weedkillers", "weighbridge", "weightiness", "wellingtons", "wellsprings", "westernmost", "wheelbarrow", "wheelchairs", "wheelhouses", "wheelwright", "whereabouts", "wheresoever", "wherewithal", "whimsically", "whirlybirds", "whiteboards", "whitefishes", "whitewashed", "whitewashes", "wholesalers", "wholesaling", "whorehouses", "wildcatters", "wildcatting", "wildebeests", "wildflowers", "willfulness", "willingness", "windbreaker", "windburning", "windcheater", "windjammers", "windmilling", "windowpanes", "windowsills", "windscreens", "windshields", "windsurfers", "windsurfing", "wineglasses", "wingspreads", "wintergreen", "wiretapping", "wisecracked", "wistfulness", "withdrawals", "withdrawing", "witheringly", "withholding", "womanliness", "wonderfully", "wonderingly", "wonderlands", "woodcarving", "woodcutters", "woodcutting", "woodpeckers", "woodworking", "workaholics", "workbaskets", "workbenches", "workmanlike", "workmanship", "workstation", "worldliness", "wraparounds", "wretchedest", "wrongdoings", "wrongheaded", "wunderkinds", "xerographic", "xylophonist", "yachtswoman", "yachtswomen", "zealousness" }; const char* w_12[] = { "abbreviating", "abbreviation", "abolitionist", "abominations", "abortionists", "abrasiveness", "abstractedly", "abstractions", "abstractness", "abstruseness", "academically", "academicians", "accelerating", "acceleration", "accelerators", "accentuating", "accentuation", "accessioning", "accidentally", "acclimatised", "acclimatises", "acclimatized", "acclimatizes", "accommodated", "accommodates", "accompanists", "accompanying", "accomplished", "accomplishes", "accumulating", "accumulation", "accumulative", "accumulators", "accurateness", "achievements", "acknowledged", "acknowledges", "acoustically", "acquaintance", "acquiescence", "acquisitions", "adaptability", "additionally", "adjectivally", "adjournments", "adjudicating", "adjudication", "adjudicators", "administered", "administrate", "admonishment", "adolescences", "adulterating", "adulteration", "adulteresses", "advancements", "advantageous", "adventitious", "adventurists", "advertorials", "advisability", "aerodynamics", "aeronautical", "affectations", "affectionate", "affectioning", "affiliations", "affirmations", "affirmatives", "aforethought", "afterburners", "aftereffects", "afterthought", "agglomerated", "agglomerates", "agglutinated", "agglutinates", "aggravations", "aggregations", "aggressively", "agoraphobics", "agribusiness", "agricultural", "airworthiest", "alliteration", "alliterative", "alphabetical", "alphanumeric", "altercations", "alternations", "alternatives", "amalgamating", "amalgamation", "amateurishly", "ambidextrous", "ambivalently", "ambulanceman", "ambulancemen", "ambulatories", "ameliorating", "amelioration", "amphetamines", "anachronisms", "analytically", "anarchically", "anatomically", "ancestresses", "anchorpeople", "anchorperson", "angularities", "annihilating", "annihilation", "annihilators", "announcement", "answerphones", "antagonistic", "antechambers", "antediluvian", "anthologists", "anthropology", "antiabortion", "antiaircraft", "anticipating", "anticipation", "anticipatory", "anticlimaxes", "anticyclones", "antimacassar", "antiparticle", "antipathetic", "antiquarians", "antirrhinums", "antithetical", "aphrodisiacs", "apothecaries", "apparatchiks", "appeasements", "appellations", "appendectomy", "appendicitis", "appertaining", "applications", "appointments", "apportioning", "appositeness", "appreciating", "appreciation", "appreciative", "apprehending", "apprehension", "apprehensive", "apprenticing", "approachable", "approbations", "appropriated", "appropriates", "approximated", "approximates", "appurtenance", "arbitrageurs", "archdioceses", "archipelagos", "architecture", "aristocratic", "arithmetical", "aromatherapy", "arraignments", "arrangements", "articulately", "articulating", "articulation", "artificially", "artistically", "ascertaining", "asphyxiating", "asphyxiation", "assassinated", "assassinates", "asseverating", "assignations", "assimilating", "assimilation", "associations", "astigmatisms", "astonishment", "astoundingly", "astrological", "astronautics", "astronomical", "astrophysics", "asymmetrical", "asymptomatic", "asynchronous", "athletically", "atmospherics", "attestations", "attractively", "attributable", "attributions", "attributives", "augmentation", "auspiciously", "authenticate", "authenticity", "autographing", "automobiling", "autonomously", "availability", "avariciously", "bacchanalian", "backbenchers", "backbreaking", "backslappers", "backslapping", "backstabbing", "backstopping", "backstroking", "backtracking", "backwardness", "backwoodsman", "backwoodsmen", "bacteriology", "bankruptcies", "bantamweight", "baptisteries", "barbiturates", "barnstorming", "battlefields", "battleground", "beachcombers", "beatifically", "beautifulest", "begrudgingly", "beleaguering", "belligerence", "belligerency", "belligerents", "bellybuttons", "benedictions", "benefactions", "benefactress", "beneficently", "beneficially", "benevolences", "benevolently", "bereavements", "beseechingly", "bespectacled", "bewilderment", "bibliography", "bibliophiles", "bicentennial", "bifurcations", "billionaires", "biochemicals", "biochemistry", "biodegrading", "biodiversity", "biographical", "biologically", "biophysicist", "birdwatchers", "bittersweets", "blabbermouth", "blackballing", "blackberries", "blackcurrant", "blackjacking", "blacklisting", "blackmailers", "blackmailing", "blacktopping", "blandishment", "blindfolding", "blissfulness", "blockbusters", "blockbusting", "bloodletting", "bloodmobiles", "bloodstained", "bloodstreams", "bloodsuckers", "bloodthirsty", "blueprinting", "bluestocking", "boastfulness", "bodybuilding", "boisterously", "bombardments", "boomeranging", "boondoggling", "brainstormed", "brainteasers", "brainwashing", "breadbaskets", "breadwinners", "breakfasting", "breakthrough", "breastplates", "breaststroke", "breathalyser", "breathalyzer", "breathlessly", "breathtaking", "brilliantine", "brinkmanship", "broadcasters", "broadcasting", "brontosaurus", "brotherhoods", "brushstrokes", "buccaneering", "bulletproofs", "bullfighters", "bullfighting", "bullshitters", "bullshitting", "bureaucratic", "bushwhackers", "bushwhacking", "businesslike", "butterflying", "butterscotch", "buttonholing", "cabinetmaker", "cablecasting", "calamitously", "calculations", "calibrations", "calisthenics", "calligrapher", "calumniating", "camiknickers", "camouflaging", "cancellation", "candidatures", "candlesticks", "cannonballed", "cantankerous", "cantilevered", "capabilities", "caparisoning", "capitalistic", "capitulating", "capitulation", "capriciously", "carbohydrate", "carburettors", "carcinogenic", "cardiologist", "carelessness", "caricaturing", "caricaturist", "carillonning", "carpentering", "carpetbagged", "carpetbagger", "carriageways", "cartographer", "cartwheeling", "catastrophes", "catastrophic", "catchphrases", "caterpillars", "caterwauling", "cauliflowers", "cautiousness", "celebrations", "censoriously", "centenarians", "centrifuging", "ceremonially", "certificated", "certificates", "chairmanship", "chairpersons", "chamberlains", "chambermaids", "championship", "chanticleers", "chaplaincies", "characterful", "charbroiling", "charioteered", "charismatics", "chastisement", "chatterboxes", "chauffeuring", "chauvinistic", "cheerfullest", "cheerfulness", "cheerleaders", "cheeseboards", "cheeseburger", "cheeseparing", "chemotherapy", "chickenshits", "childbearing", "childishness", "childminders", "childminding", "childproofed", "chiropodists", "chiropractic", "chiropractor", "chitchatting", "chitterlings", "chivalrously", "chlorinating", "chlorination", "chloroformed", "choirmasters", "choreographs", "choreography", "christenings", "chronographs", "chronologies", "chronometers", "churchwarden", "churlishness", "circuitously", "circulations", "circumcising", "circumcision", "circumflexes", "circumscribe", "circumstance", "circumvented", "clairvoyance", "clairvoyants", "clapboarding", "clapperboard", "clarinetists", "classifiable", "clerestories", "cliffhangers", "cliffhanging", "closemouthed", "clotheslined", "clotheslines", "clownishness", "cobblestones", "cockfighting", "cockleshells", "codependency", "codependents", "codification", "coefficients", "coffeehouses", "cohabitation", "cohesiveness", "coincidences", "coincidental", "collaborated", "collaborates", "collaborator", "collectibles", "collectively", "collectivism", "collectivist", "collocations", "colloquially", "colonialists", "combinations", "combustibles", "comeuppances", "comfortingly", "commandeered", "commandments", "commemorated", "commemorates", "commencement", "commendation", "commensurate", "commentaries", "commentating", "commentators", "commercially", "commiserated", "commiserates", "commissariat", "commissaries", "commissioned", "commissioner", "commonplaces", "commonwealth", "communicable", "communicants", "communicated", "communicates", "communicator", "commutations", "companionway", "comparatives", "compartments", "compellingly", "compensating", "compensation", "compensatory", "competencies", "competitions", "compilations", "complacently", "complainants", "complaisance", "complemented", "completeness", "complexioned", "complexities", "complicating", "complication", "complimented", "compositions", "comprehended", "compressible", "compromising", "comptrollers", "compulsively", "compulsories", "compulsorily", "compunctions", "computations", "concatenated", "concatenates", "concentrated", "concentrates", "conceptually", "concertgoers", "concertinaed", "conciliating", "conciliation", "conciliators", "conciliatory", "conclusively", "concomitants", "concordances", "concurrences", "concurrently", "condemnation", "condemnatory", "condensation", "condescended", "conditionals", "conditioners", "conditioning", "condominiums", "conductivity", "confectioner", "confederated", "confederates", "conferencing", "confessional", "confidential", "configurable", "confinements", "confirmation", "confirmatory", "confiscating", "confiscation", "conformation", "congeniality", "congenitally", "conglomerate", "congratulate", "congregating", "congregation", "conjecturing", "conjugations", "conjunctions", "conjunctives", "conjunctures", "connectivity", "connoisseurs", "connotations", "conquistador", "conscripting", "conscription", "consecrating", "consecration", "consequences", "consequently", "conservation", "conservatism", "conservative", "conservators", "conservatory", "considerable", "considerably", "considerings", "consignments", "consistently", "consolations", "consolidated", "consolidates", "conspiracies", "conspirators", "constabulary", "constipating", "constipation", "constituency", "constituents", "constituting", "constitution", "constraining", "constricting", "constriction", "constrictive", "constrictors", "constructing", "construction", "constructive", "constructors", "consultation", "consultative", "consummately", "consummating", "consummation", "consumptives", "contagiously", "contaminants", "contaminated", "contaminates", "contemplated", "contemplates", "contemporary", "contemptible", "contemptibly", "contemptuous", "contextually", "continentals", "contingently", "continuances", "continuation", "continuities", "continuously", "contractions", "contradicted", "contraptions", "contrapuntal", "contrariness", "contrariwise", "contravening", "contributing", "contribution", "contributors", "contributory", "contrivances", "controllable", "controverted", "contumacious", "conurbations", "convalescent", "convalescing", "conveniences", "conveniently", "conventional", "convergences", "conversation", "convertibles", "conveyancing", "convincingly", "conviviality", "convocations", "convolutions", "convulsively", "cooperatives", "coordinating", "coordination", "coordinators", "copyrighting", "coquettishly", "corespondent", "corkscrewing", "cornerstones", "corporations", "correctional", "correlations", "correlatives", "corresponded", "corroborated", "corroborates", "corrugations", "cosmetically", "cosmological", "cosmologists", "cosmopolitan", "cosponsoring", "cottonmouths", "councilwoman", "councilwomen", "countenanced", "countenances", "counteracted", "counterblast", "counterclaim", "counterfeits", "counterfoils", "countermands", "counteroffer", "counterpanes", "counterparts", "counterpoint", "countersigns", "countersinks", "countertenor", "countervails", "countrysides", "countrywoman", "countrywomen", "courageously", "covetousness", "cowardliness", "crackerjacks", "craftspeople", "creationists", "creativeness", "credentialed", "creditworthy", "crematoriums", "crisscrossed", "crisscrosses", "crossbarring", "crosschecked", "crosscurrent", "crosspatches", "crucifixions", "cryptography", "crystallines", "culminations", "cumulatively", "curmudgeonly", "currycombing", "curtailments", "cuttlefishes", "deactivating", "debaucheries", "debilitating", "debilitation", "decaffeinate", "decapitating", "decapitation", "decelerating", "deceleration", "decipherable", "decisiveness", "declamations", "declarations", "declassified", "declassifies", "decommission", "decompressed", "decompresses", "decongestant", "deconstructs", "decontrolled", "decoratively", "decrescendos", "deerstalkers", "deescalating", "deficiencies", "definiteness", "definitively", "deflationary", "deformations", "degenerating", "degeneration", "degenerative", "dehumidified", "dehumidifier", "dehumidifies", "deliberately", "deliberating", "deliberation", "deliberative", "delicatessen", "delightfully", "delineations", "delinquently", "deliquescent", "demarcations", "demographers", "demographics", "demoniacally", "demonstrable", "demonstrably", "demonstrated", "demonstrates", "demonstrator", "demotivating", "demystifying", "denominating", "denomination", "denominators", "denouncement", "denunciation", "departmental", "dependencies", "depilatories", "depopulating", "depopulation", "deportations", "depositories", "depreciating", "depreciation", "depredations", "depressingly", "deprivations", "deprogrammed", "deregulating", "deregulation", "desalinating", "desalination", "descriptions", "desegregated", "desegregates", "designations", "desirability", "desolateness", "despairingly", "despondently", "despotically", "dessertspoon", "destinations", "destructible", "deteriorated", "deteriorates", "determinable", "determinants", "determinedly", "dethronement", "devaluations", "developments", "diabolically", "diagrammatic", "dictatorship", "dictionaries", "didactically", "differential", "difficulties", "dilapidation", "dilettantism", "dillydallied", "dillydallies", "diplomatists", "dipsomaniacs", "directionals", "directorates", "directorship", "disabilities", "disadvantage", "disaffecting", "disaffection", "disafforests", "disagreeable", "disagreeably", "disagreement", "disambiguate", "disappearing", "disappointed", "disapproving", "disarranging", "disassembled", "disassembles", "disassociate", "disastrously", "disbelieving", "disbursement", "disciplinary", "disciplining", "discomfiting", "discomfiture", "discomforted", "discommoding", "discomposing", "discomposure", "disconcerted", "disconnected", "disconsolate", "discontented", "discontinued", "discontinues", "discotheques", "discouraging", "discourteous", "discrediting", "discreteness", "discriminant", "discriminate", "disdainfully", "disembarking", "disembodying", "disemboweled", "disenchanted", "disencumbers", "disentangled", "disentangles", "disestablish", "disfranchise", "disgruntling", "disgustingly", "disheartened", "disillusions", "disincentive", "disinclining", "disinfectant", "disinfecting", "disingenuous", "disinherited", "disintegrate", "disinterests", "disinterment", "disinterring", "disjointedly", "dislocations", "dismembering", "dismissively", "disobedience", "disorientate", "disorienting", "dispensaries", "dispensation", "displacement", "dispositions", "dispossessed", "dispossesses", "disputations", "disputatious", "disqualified", "disqualifies", "disquisition", "disregarding", "disreputable", "disreputably", "disrespected", "disruptively", "dissatisfied", "dissatisfies", "disseminated", "disseminates", "dissertation", "dissimulated", "dissimulates", "dissociating", "dissociation", "distillation", "distilleries", "distinctions", "distractedly", "distractions", "distributing", "distribution", "distributive", "distributors", "disturbances", "disturbingly", "ditransitive", "diversifying", "diversionary", "divisibility", "divisiveness", "doctrinaires", "dogmatically", "domestically", "domesticated", "domesticates", "dominatrices", "doorknockers", "doorstepping", "downshifting", "dramatically", "dreadnoughts", "dumbfounding", "dysfunctions", "earsplitting", "earthquaking", "earthshaking", "eavesdropped", "eavesdropper", "eccentricity", "ecclesiastic", "eclectically", "ecologically", "economically", "ecstatically", "ecumenically", "educationist", "effectuating", "effervescent", "effervescing", "effortlessly", "effusiveness", "egalitarians", "ejaculations", "elaborations", "elderberries", "electioneers", "electrically", "electricians", "electrifying", "electrocuted", "electrocutes", "electrolysis", "electrolytes", "electrolytic", "electroplate", "eliminations", "elliptically", "elocutionist", "elucidations", "emancipating", "emancipation", "emancipators", "emasculating", "emasculation", "embarkations", "embarrassing", "embellishing", "embezzlement", "embrocations", "embroideries", "embroidering", "embryologist", "emotionalism", "emphatically", "emplacements", "encapsulated", "encapsulates", "encephalitis", "enchantingly", "enchantments", "encirclement", "encompassing", "encountering", "encroachment", "encrustation", "encumbrances", "encyclopedia", "encyclopedic", "endorsements", "enfranchised", "enfranchises", "enhancements", "enlargements", "enlightening", "enormousness", "entanglement", "enterprising", "entertainers", "entertaining", "enthronement", "enthusiastic", "entitlements", "entomologist", "entrenchment", "entrepreneur", "enumerations", "environments", "epidemiology", "epiglottises", "epigrammatic", "epistemology", "epistolaries", "equestrienne", "equilaterals", "equivalences", "equivalently", "equivocating", "equivocation", "erythrocytes", "escapologist", "esoterically", "establishing", "esthetically", "estrangement", "ethnocentric", "ethnographer", "ethnographic", "ethnological", "ethnologists", "etymological", "etymologists", "eucalyptuses", "euphorically", "evangelicals", "evangelistic", "eventfulness", "everlastings", "eviscerating", "evisceration", "evolutionary", "exacerbating", "exacerbation", "exaggerating", "exaggeration", "examinations", "exasperating", "exasperation", "exchangeable", "excitability", "exclamations", "exclusionary", "excoriations", "excrescences", "excruciating", "executioners", "exemplifying", "exhaustively", "exhilarating", "exhilaration", "exhortations", "exorbitantly", "expansionary", "expansionism", "expansionist", "expatriating", "expatriation", "expectations", "expectorants", "expectorated", "expectorates", "expediencies", "expenditures", "experiencing", "experiential", "experimental", "experimented", "experimenter", "explanations", "explications", "explicitness", "exploitation", "exploitative", "explorations", "expostulated", "expostulates", "expressively", "expropriated", "expropriates", "expropriator", "expurgations", "exterminated", "exterminates", "exterminator", "extinguished", "extinguisher", "extinguishes", "extortionate", "extortioners", "extortionist", "extraditable", "extraditions", "extramarital", "extraneously", "extrapolated", "extrapolates", "extrasensory", "extravagance", "extravaganza", "extroversion", "eyewitnesses", "fabrications", "facilitating", "facilitation", "facilitators", "facsimileing", "factionalism", "fainthearted", "faithfulness", "fallaciously", "fascinations", "fastidiously", "faultfinding", "fearlessness", "fecklessness", "felicitation", "felicitously", "fermentation", "fiddlesticks", "fieldworkers", "figuratively", "filibustered", "fingerboards", "fingerprints", "firebombings", "firecrackers", "firefighters", "firefighting", "firelighters", "fireproofing", "flabbergasts", "flagellating", "flagellation", "flamboyantly", "flamethrower", "flammability", "flatteringly", "flimflamming", "floodlighted", "fluctuations", "fluorescence", "fluoridating", "fluoridation", "fluorocarbon", "fluoroscopes", "foolhardiest", "footslogging", "forbiddingly", "forcefulness", "foreclosures", "foregrounded", "foreordained", "foreshadowed", "foreshortens", "forestalling", "forgathering", "formaldehyde", "formlessness", "formulations", "forthrightly", "fortuitously", "fountainhead", "fractionally", "frankfurters", "frankincense", "fraternities", "fraudulently", "freakishness", "freestanding", "freethinkers", "freethinking", "freewheeling", "frenetically", "fricasseeing", "friendliness", "frogmarching", "frontbencher", "frontbenches", "frontiersman", "frontiersmen", "frontispiece", "fruitfullest", "fruitfulness", "frustrations", "fulminations", "functionally", "fundamentals", "gallbladders", "gallivanting", "galvanometer", "gamesmanship", "garnisheeing", "gatecrashers", "gatecrashing", "gazetteering", "genealogical", "genealogists", "generalities", "generational", "generosities", "genuflecting", "genuflection", "geographical", "geologically", "geophysicist", "geopolitical", "geriatrician", "gerrymanders", "gesticulated", "gesticulates", "ghostwriters", "ghostwriting", "ghostwritten", "gigantically", "gladiatorial", "globetrotter", "glockenspiel", "gluttonously", "gobbledygook", "goddaughters", "goldbricking", "gooseberries", "goosestepped", "gorgeousness", "governmental", "governorship", "gracefullest", "gracefulness", "graciousness", "granddaddies", "grandfathers", "grandmothers", "grandparents", "grandstanded", "graphologist", "grasshoppers", "gratefullest", "gratefulness", "gratifyingly", "gratuitously", "gravediggers", "greengrocers", "gregariously", "griddlecakes", "groundcloths", "groundlessly", "groundsheets", "groundswells", "guaranteeing", "guardianship", "guesstimated", "guesstimates", "guillotining", "guttersnipes", "haberdashers", "haberdashery", "habitability", "hairbreadths", "hairdressers", "hairdressing", "hairsbreadth", "hairstylists", "hallucinated", "hallucinates", "hallucinogen", "hamstringing", "handcrafting", "handicappers", "handicapping", "handkerchief", "handsomeness", "happenstance", "harbormaster", "hardheadedly", "hardscrabble", "harmlessness", "harmonically", "harmoniously", "harpsichords", "headmistress", "headquarters", "headteachers", "heartrending", "heartstrings", "heartwarming", "heavyweights", "heedlessness", "helicoptered", "helplessness", "hemorrhaging", "hemstitching", "henceforward", "hermetically", "herringboned", "herringbones", "hesitatingly", "heterosexual", "hierarchical", "hieroglyphic", "highlighters", "highlighting", "hindquarters", "hippopotamus", "historically", "holidaymaker", "holistically", "homelessness", "homesickness", "homesteaders", "homesteading", "honeycombing", "honeymooners", "honeymooning", "honeysuckles", "hopelessness", "hopscotching", "horizontally", "horrendously", "horrifically", "horrifyingly", "horsemanship", "horseshoeing", "horsetrading", "horsewhipped", "horticulture", "housebreaker", "housecleaned", "householders", "househusband", "housekeepers", "housekeeping", "housemasters", "housemothers", "housewarming", "humanitarian", "humiliations", "hummingbirds", "hundredfolds", "hydraulicked", "hydrocarbons", "hydrogenated", "hydrogenates", "hydroplaning", "hydrotherapy", "hygienically", "hyperactives", "hypermarkets", "hypertension", "hyphenations", "hypnotherapy", "hypnotically", "hypochondria", "hypocritical", "hypoglycemia", "hypoglycemic", "hypothalamus", "hypothetical", "hysterectomy", "hysterically", "iconoclastic", "identifiable", "idiosyncrasy", "illegalities", "illegibility", "illegitimacy", "illegitimate", "illogicality", "illuminating", "illumination", "illusionists", "illustrating", "illustration", "illustrative", "illustrators", "imaginations", "imbecilities", "immaculately", "immeasurable", "immeasurably", "immobilisers", "immobilizers", "immoderately", "immoralities", "immutability", "impartiality", "impeachments", "impenetrable", "impenetrably", "imperatively", "imperfection", "imperialists", "imperishable", "impermanence", "impersonally", "impersonated", "impersonates", "impersonator", "impertinence", "impertinents", "implantation", "implementing", "implications", "impoliteness", "imponderable", "importations", "importunated", "importunates", "impoverished", "impoverishes", "imprecations", "impregnating", "impregnation", "impressively", "imprisonment", "improvements", "improvidence", "inaccessible", "inaccuracies", "inaccurately", "inadequacies", "inadequately", "inadmissible", "inadvertence", "inapplicable", "inarticulacy", "inarticulate", "inaudibility", "inaugurating", "inauguration", "inauspicious", "incalculable", "incalculably", "incandescent", "incantations", "incapability", "incapacitate", "incarcerated", "incarcerates", "incarnations", "incautiously", "incendiaries", "incestuously", "incidentally", "incinerating", "incineration", "incinerators", "incisiveness", "incivilities", "inclinations", "incoherently", "incomparable", "incomparably", "incompatible", "incompatibly", "incompetence", "incompetents", "incompletely", "inconclusive", "inconsistent", "inconsolable", "inconsolably", "incontinence", "inconvenient", "incorporated", "incorporates", "incorrigible", "incorrigibly", "increasingly", "incrementing", "incriminated", "incriminates", "incrustation", "incumbencies", "indebtedness", "indecisively", "indecorously", "indefensible", "indefensibly", "indefinitely", "indelicacies", "indelicately", "indemnifying", "indentations", "independence", "independents", "indifference", "indigestible", "indirectness", "indiscipline", "indiscreetly", "indiscretion", "indisputable", "indisputably", "indissoluble", "indissolubly", "indistinctly", "individually", "indoctrinate", "industrially", "inefficiency", "inefficients", "inequalities", "ineradicable", "inessentials", "inexperience", "inexplicable", "inexplicably", "inexpressive", "inextricable", "inextricably", "infanticides", "infatuations", "infectiously", "infelicities", "infelicitous", "infestations", "infidelities", "infiltrating", "infiltration", "infiltrators", "inflammation", "inflammatory", "inflationary", "inflectional", "infomercials", "infotainment", "infrequently", "infringement", "ingloriously", "ingratiating", "inheritances", "inhospitable", "inhumanities", "inoculations", "inordinately", "inquisitions", "insalubrious", "inscriptions", "insecticidal", "insecticides", "insectivores", "insecurities", "inseminating", "insemination", "inseparables", "insinuations", "insolubility", "insolvencies", "inspectorate", "inspirations", "installation", "institutions", "instructions", "instrumental", "instrumented", "insufferable", "insufferably", "insufficient", "insurgencies", "insurrection", "intellectual", "intelligence", "intelligible", "intelligibly", "intemperance", "intensifiers", "intensifying", "interactions", "intercepting", "interception", "interceptors", "intercession", "intercessors", "interchanged", "interchanges", "interconnect", "interdicting", "interdiction", "interference", "interjecting", "interjection", "interlarding", "interleaving", "interlinking", "interlocking", "interlocutor", "intermarried", "intermarries", "intermediary", "intermediate", "interminable", "interminably", "intermingled", "intermingles", "intermission", "intermittent", "interpolated", "interpolates", "interpreters", "interpreting", "interpretive", "interregnums", "interrelated", "interrelates", "interrogated", "interrogates", "interrogator", "interrupting", "interruption", "intersecting", "intersection", "interspersed", "intersperses", "interstellar", "intertwining", "intervention", "interviewees", "interviewers", "interviewing", "interweaving", "intimidating", "intimidation", "intolerantly", "intoxicating", "intoxication", "intransigent", "intransitive", "intrauterine", "intriguingly", "introduction", "introductory", "introversion", "invalidating", "invalidation", "inventorying", "invertebrate", "investigated", "investigates", "investigator", "investitures", "invigilating", "invigilation", "invigilators", "invigorating", "invigoration", "invisibility", "invitational", "involvements", "invulnerable", "invulnerably", "irascibility", "irrationally", "irredeemable", "irredeemably", "irregardless", "irregularity", "irrelevances", "irrelevantly", "irremediable", "irremediably", "irresistible", "irresistibly", "irresolutely", "irresolution", "irrespective", "irreverently", "irreversible", "irreversibly", "irritability", "irritatingly", "isolationism", "isolationist", "jackhammered", "jitterbugged", "journalistic", "jurisdiction", "kaleidoscope", "keyboardists", "kindergarten", "kitchenettes", "kleptomaniac", "knuckleheads", "laboratories", "labyrinthine", "lamentations", "landholdings", "languorously", "lasciviously", "latticeworks", "launderettes", "leapfrogging", "leaseholders", "leathernecks", "lectureships", "legionnaires", "legislatures", "legitimately", "legitimating", "lexicography", "libertarians", "licentiously", "lighthearted", "lightweights", "limelighting", "liquefaction", "liquidations", "listlessness", "lithographed", "lithographer", "lithographic", "lithospheres", "liturgically", "loganberries", "logistically", "longitudinal", "longshoreman", "longshoremen", "lopsidedness", "loquaciously", "loudspeakers", "lubriciously", "lugubriously", "luminescence", "lumpectomies", "luncheonette", "lusciousness", "machinations", "mackintoshes", "macrobiotics", "mademoiselle", "magnetically", "magnificence", "maidservants", "mainstreamed", "maintainable", "majestically", "malapropisms", "maledictions", "malevolently", "malformation", "malfunctions", "malignancies", "malleability", "malnourished", "malnutrition", "malpractices", "maltreatment", "manageresses", "maneuverings", "manifestoing", "manipulating", "manipulation", "manipulative", "manipulators", "manoeuvrings", "manslaughter", "mantelpieces", "manufactured", "manufacturer", "manufactures", "marketplaces", "marksmanship", "marriageable", "marshmallows", "masqueraders", "masquerading", "mastectomies", "masterminded", "masterpieces", "masterstroke", "masturbating", "masturbation", "masturbatory", "materialists", "mathematical", "matriarchies", "matriculated", "matriculates", "meaningfully", "measurements", "mechanically", "mediocrities", "meditatively", "meetinghouse", "megalomaniac", "melancholics", "melodramatic", "menstruating", "menstruation", "merchandised", "merchandises", "meretricious", "meritocratic", "metalanguage", "metallurgist", "metamorphism", "metamorphose", "metaphorical", "metaphysical", "methodically", "meticulously", "metropolises", "metropolitan", "microbiology", "microfilming", "microseconds", "microsurgery", "microwavable", "middleweight", "militaristic", "millionaires", "milliseconds", "milquetoasts", "mimeographed", "mindlessness", "mineralogist", "minesweepers", "miniaturists", "minicomputer", "ministration", "miraculously", "misadventure", "misalignment", "misalliances", "misanthropes", "misanthropic", "misapprehend", "miscalculate", "miscarriages", "miscellanies", "misconceived", "misconceives", "misconducted", "misconstrued", "misconstrues", "misdiagnosed", "misdiagnoses", "misdiagnosis", "misdirecting", "misdirection", "misgoverning", "misinforming", "misinterpret", "misleadingly", "misogynistic", "mispronounce", "misquotation", "misreporting", "misrepresent", "missionaries", "misspellings", "misstatement", "mistreatment", "mockingbirds", "modification", "mollycoddled", "mollycoddles", "moneylenders", "monkeyshines", "monogramming", "monolinguals", "monopolistic", "monosyllabic", "monosyllable", "monotheistic", "monotonously", "monumentally", "moonlighters", "moonlighting", "mortarboards", "motherboards", "motherfucker", "motherliness", "motivational", "motorcycling", "motorcyclist", "mountaineers", "mountainside", "mountaintops", "mournfullest", "mournfulness", "mousetrapped", "mulligatawny", "multifaceted", "multifarious", "multilateral", "multilingual", "multiplexers", "multiplexing", "multiplicand", "multiplicity", "multipurpose", "multitasking", "multivariate", "multivitamin", "municipality", "musicianship", "musicologist", "muskellunges", "mysteriously", "mythological", "mythologists", "narcissistic", "nationalists", "naturalistic", "nauseatingly", "nauseousness", "navigability", "navigational", "neanderthals", "nebulousness", "necessitated", "necessitates", "neckerchiefs", "necromancers", "necrophiliac", "necropolises", "neglectfully", "negotiations", "neoclassical", "neurological", "neurologists", "neurosurgery", "neurotically", "nevertheless", "newspapering", "newspaperman", "newspapermen", "newsworthier", "nickelodeons", "nightclothes", "nightclubbed", "nightdresses", "nightingales", "nomenclature", "nonabsorbent", "nonagenarian", "nonalcoholic", "nonbelievers", "nonbreakable", "nonchalantly", "noncombatant", "noncommittal", "nonconductor", "nonessential", "nonexistence", "nonflammable", "nonhazardous", "nonmalignant", "nonobjective", "nonpartisans", "nonpoisonous", "nonpolitical", "nonpolluting", "nonrenewable", "nonresidents", "nonscheduled", "nonsectarian", "nontechnical", "northeastern", "northeasters", "northernmost", "northwestern", "noticeboards", "notification", "numismatists", "nutritionist", "nymphomaniac", "obfuscations", "obliterating", "obliteration", "obscurantism", "obscurantist", "obsequiously", "observations", "obsolescence", "obstetrician", "obstreperous", "obstructions", "obstructives", "occasionally", "occupational", "oceanography", "octogenarian", "officeholder", "omnipresence", "onomatopoeia", "onomatopoeic", "operatically", "opportunists", "oppressively", "optometrists", "orchestrated", "orchestrates", "ordinariness", "orientalists", "orientations", "orienteering", "orthodontics", "orthodontist", "orthographic", "oscillations", "oscilloscope", "ossification", "ostentatious", "osteoporosis", "otherworldly", "outbalancing", "outbuildings", "outcroppings", "outdistanced", "outdistances", "outlandishly", "outnumbering", "outperformed", "outplacement", "outrageously", "outspreading", "outstretched", "outstretches", "outstripping", "overabundant", "overachieved", "overachiever", "overachieves", "overbalanced", "overbalances", "overburdened", "overcautious", "overcharging", "overcrowding", "overdevelops", "overdressing", "overemphasis", "overestimate", "overexciting", "overexposing", "overexposure", "overextended", "overgenerous", "overindulged", "overindulges", "overpopulate", "overpowering", "overprinting", "overproduced", "overproduces", "overreaching", "overreacting", "overreaction", "oversampling", "overshadowed", "overshooting", "oversimplify", "oversleeping", "overspending", "overstepping", "overstocking", "oversupplied", "oversupplies", "overthrowing", "overwhelming", "overwintered", "oxyacetylene", "pacification", "paintbrushes", "palaeolithic", "paleontology", "palpitations", "pamphleteers", "panchromatic", "pantechnicon", "paperbacking", "paperhangers", "paperweights", "paracetamols", "parachutists", "paradigmatic", "paragraphing", "parallelisms", "paramedicals", "paramilitary", "paraphrasing", "parascending", "paratroopers", "parishioners", "parochialism", "parsimonious", "participants", "participated", "participates", "participator", "particularly", "particulates", "partisanship", "partitioning", "partnerships", "passionately", "passionating", "paternalists", "pathetically", "pathological", "pathologists", "patriarchies", "peacefullest", "peacefulness", "peacekeepers", "peacekeeping", "peccadilloes", "pedantically", "pejoratively", "penetrations", "penitentiary", "pennyweights", "penultimates", "perambulated", "perambulates", "perambulator", "perceptively", "peremptorily", "perforations", "performances", "periodically", "peripatetics", "peripherally", "permeability", "permissively", "permutations", "perniciously", "perpetrating", "perpetration", "perpetrators", "perpetuating", "perpetuation", "perplexities", "persecutions", "perseverance", "persistently", "personifying", "perspectives", "perspicacity", "perspiration", "persuasively", "pertinacious", "perturbation", "perverseness", "pestilential", "petrifaction", "petrodollars", "pettifoggers", "pettifogging", "pharmacology", "phenomenally", "philanderers", "philandering", "philanthropy", "philatelists", "philharmonic", "philistinism", "philodendron", "philological", "philologists", "philosophers", "philosophies", "phonetically", "phoneticians", "phonological", "phonologists", "photocopiers", "photocopying", "photographed", "photographer", "photographic", "photostatted", "phrenologist", "physiologist", "pigeonholing", "piggybacking", "pigmentation", "pitchforking", "pitilessness", "plainclothes", "planetariums", "plasterboard", "plausibility", "pleasantness", "pleasantries", "plutocracies", "pocketknives", "pointillists", "policyholder", "policymakers", "poltergeists", "polyethylene", "polygraphing", "polymorphous", "polysyllabic", "polysyllable", "polytechnics", "polytheistic", "polyurethane", "pomegranates", "pontificated", "pontificates", "pornographer", "pornographic", "portcullises", "portentously", "porterhouses", "portmanteaus", "portraitists", "positiveness", "possessively", "postdoctoral", "postgraduate", "posthumously", "postmistress", "postponement", "postprandial", "potentiality", "practicality", "practitioner", "praiseworthy", "prearranging", "precariously", "preciousness", "precipitants", "precipitated", "precipitates", "precociously", "precognition", "preconceived", "preconceives", "precondition", "predeceasing", "predecessors", "predestining", "predetermine", "predicaments", "predigesting", "predilection", "predisposing", "predominance", "predominated", "predominates", "preeminently", "prefabricate", "preferential", "premeditated", "premeditates", "premenstrual", "premonitions", "preoccupying", "preordaining", "prepackaging", "preparations", "preparedness", "preponderant", "preponderate", "prepositions", "prepossessed", "prepossesses", "preposterous", "prepubescent", "prerecording", "preregisters", "prerequisite", "prerogatives", "presbyteries", "preschoolers", "prescription", "prescriptive", "presentation", "presentiment", "preservation", "preservative", "preshrinking", "presidencies", "presidential", "presumptions", "presumptuous", "presupposing", "prevaricated", "prevaricates", "prevaricator", "preventative", "priggishness", "principality", "prizefighter", "prizewinning", "probationary", "probationers", "problematics", "processional", "processioned", "proclamation", "proclivities", "prodigiously", "productively", "productivity", "profanations", "professional", "professorial", "proficiently", "profiteering", "profiteroles", "profundities", "progesterone", "programmable", "programmatic", "progressions", "progressives", "prohibitions", "proletarians", "proliferated", "proliferates", "prolifically", "prolongation", "promontories", "promulgating", "promulgation", "proofreaders", "proofreading", "propagandist", "propensities", "prophetesses", "prophylactic", "propitiating", "propitiation", "propitiatory", "propitiously", "proportional", "proportioned", "propositions", "proprietress", "proscription", "prosecutions", "prospectives", "prospectuses", "prosperously", "prostituting", "prostitution", "prostrations", "protagonists", "protectively", "protectorate", "protestation", "protoplasmic", "prototypical", "protuberance", "provendering", "proverbially", "providential", "provincially", "provisioning", "provocateurs", "provocations", "psephologist", "pseudonymous", "psychedelics", "psychiatrist", "psychoactive", "psychobabble", "psychodramas", "psychologies", "psychologist", "psychometric", "psychopathic", "psychotropic", "pterodactyls", "publications", "pugnaciously", "pumpernickel", "purification", "purposefully", "pussyfooting", "putrefaction", "pyrotechnics", "quadrangular", "quadraphonic", "quadricepses", "quadriplegia", "quadriplegic", "quantifiable", "quantitative", "quarantining", "quarterbacks", "quarterdecks", "quarterfinal", "questionable", "questionably", "quintessence", "racketeering", "racquetballs", "radiographer", "radioisotope", "radiologists", "radiotherapy", "rambunctious", "ramification", "rangefinders", "rapscallions", "rathskellers", "ratification", "rationalists", "rattlesnakes", "reactivating", "reactivation", "readdressing", "readjustment", "realignments", "reallocating", "reallocation", "reappearance", "reappointing", "reapportions", "reappraisals", "reappraising", "reassembling", "reassessment", "reassurances", "reassuringly", "rebelliously", "rebroadcasts", "recalcitrant", "recantations", "recapitulate", "receivership", "receptionist", "recessionals", "recessionary", "rechargeable", "reciprocally", "reciprocated", "reciprocates", "recklessness", "reclassified", "reclassifies", "recollecting", "recollection", "recommencing", "recommending", "recompensing", "reconcilable", "reconditions", "reconfigured", "reconnecting", "reconquering", "reconsidered", "reconstitute", "reconstructs", "recreational", "recriminated", "recriminates", "recuperating", "recuperation", "recuperative", "redecorating", "redecoration", "rededicating", "redefinition", "redeployment", "redeveloping", "rediscovered", "redistribute", "redistricted", "reductionist", "redundancies", "reenactments", "reevaluating", "refashioning", "reflationary", "reflectively", "reformations", "reformatting", "reformulated", "reformulates", "refractories", "refreshingly", "refreshments", "refrigerants", "refrigerated", "refrigerates", "refrigerator", "refurbishing", "refurnishing", "regenerating", "regeneration", "regenerative", "regionalisms", "registration", "regularities", "regurgitated", "regurgitates", "rehabilitate", "reincarnated", "reincarnates", "reinterprets", "reiterations", "rejuvenating", "rejuvenation", "relationship", "relativistic", "relentlessly", "relinquished", "relinquishes", "remaindering", "remembrances", "reminiscence", "remonstrance", "remonstrated", "remonstrates", "remorsefully", "remortgaging", "remunerating", "remuneration", "remunerative", "renaissances", "rendezvoused", "rendezvouses", "renditioning", "renegotiated", "renegotiates", "renunciation", "repatriating", "repatriation", "repercussion", "repetitively", "replacements", "replenishing", "replications", "repositories", "repossessing", "repossession", "reprehending", "representing", "repressively", "reprimanding", "reprocessing", "reproducible", "reproduction", "reproductive", "reprogrammed", "republishing", "repudiations", "requirements", "requisitions", "rescheduling", "resemblances", "reservations", "resettlement", "resignations", "resoluteness", "resoundingly", "respectables", "respectfully", "respectively", "resplendence", "responsively", "restatements", "restaurateur", "restlessness", "restorations", "restoratives", "restrictions", "restrictives", "restructured", "restructures", "resubmitting", "resurrecting", "resurrection", "resuscitated", "resuscitates", "resuscitator", "retaliations", "reticulation", "retrenchment", "retributions", "retrofitting", "retrograding", "retrogressed", "retrogresses", "retrorockets", "retrospected", "reupholsters", "revaluations", "reverberated", "reverberates", "revisionists", "rhetorically", "rhetoricians", "rhinoceroses", "rhododendron", "rhythmically", "ridiculously", "rightfulness", "roadblocking", "romantically", "romanticists", "rootlessness", "rotogravures", "roughhousing", "roughnecking", "rubbernecked", "rubbernecker", "ruminatively", "rustproofing", "ruthlessness", "sacramenting", "sacrilegious", "sadistically", "safeguarding", "safekeepings", "sailboarding", "salesmanship", "sandblasters", "sandblasting", "sandpapering", "sardonically", "sarsaparilla", "satisfaction", "satisfactory", "satisfyingly", "saxophonists", "scandalously", "scapegoating", "scaremongers", "scatological", "scatterbrain", "schmaltziest", "scholarships", "schoolhouses", "schoolmaster", "scintillated", "scintillates", "scorekeepers", "scoutmasters", "scratchcards", "scratchiness", "screenwriter", "screwdrivers", "scrimshawing", "scriptwriter", "scrupulously", "scurrilously", "seamstresses", "searchlights", "seaworthiest", "secessionist", "secretariats", "sectarianism", "sectionalism", "seductresses", "segmentation", "seismographs", "seismologist", "selflessness", "semantically", "semicircular", "semifinalist", "semiprecious", "semitrailers", "semitropical", "semiweeklies", "sensuousness", "separability", "sequentially", "sequestering", "sequestrated", "sequestrates", "servicewoman", "servicewomen", "seventeenths", "sexagenarian", "shadowboxing", "shamefacedly", "shamefulness", "sharecropper", "shareholders", "shareholding", "sharpshooter", "shatterproof", "sheepishness", "shipbuilders", "shipbuilding", "shipwrecking", "shirtsleeves", "shortchanged", "shortchanges", "shortcomings", "shortcutting", "shortlisting", "shortsighted", "showstoppers", "showstopping", "shuffleboard", "shuttlecocks", "sidestepping", "sidestroking", "sidetracking", "significance", "silhouetting", "silverfishes", "silversmiths", "similarities", "simulcasting", "simultaneity", "simultaneous", "skateboarded", "skateboarder", "skittishness", "skyrocketing", "slaphappiest", "slaughterers", "slaughtering", "sledgehammer", "sleepwalkers", "sleepwalking", "slipperiness", "sloganeering", "slothfulness", "slovenliness", "sluggishness", "smallholders", "smallholding", "smokescreens", "snobbishness", "snowboarders", "snowboarding", "snowmobiling", "sociological", "sociologists", "solicitation", "solicitously", "solitariness", "somersaulted", "somnambulism", "somnambulist", "songstresses", "sophisticate", "soullessness", "soundproofed", "southeastern", "southernmost", "southwestern", "southwesters", "spaceflights", "spacewalking", "spaciousness", "sparrowhawks", "speakerphone", "spearheading", "specifically", "speciousness", "spectaculars", "spectroscope", "spectroscopy", "speculations", "speechifying", "speechlessly", "speechwriter", "speedometers", "speleologist", "spellbinders", "spellbinding", "spellchecker", "spendthrifts", "spermatozoon", "spinsterhood", "spiritualism", "spiritualist", "spirituality", "spitefullest", "spitefulness", "spokespeople", "spokesperson", "sporadically", "sportscaster", "sportspeople", "sportsperson", "spotlessness", "spotlighting", "spreadeagled", "spreadsheets", "sprightliest", "springboards", "spuriousness", "squeezeboxes", "stagecoaches", "staggeringly", "stakeholders", "stallholders", "stammeringly", "statementing", "statistician", "steamrollers", "steamrolling", "steelworkers", "steeplechase", "steeplejacks", "stenographer", "stenographic", "stepbrothers", "stepchildren", "stepdaughter", "stereophonic", "stereoscopes", "stereoscopic", "stereotyping", "stethoscopes", "stewardesses", "sticklebacks", "stipulations", "stockbrokers", "stockbroking", "stockholders", "stomachaches", "stonewalling", "storekeepers", "storytellers", "storytelling", "stouthearted", "straightaway", "straightedge", "straightened", "straightness", "straitjacket", "stranglehold", "strangulated", "strangulates", "stratosphere", "strawberries", "streamlining", "streetlights", "streetwalker", "strengthened", "streptococci", "streptomycin", "stretchering", "stretchmarks", "stripteasing", "structurally", "stubbornness", "studentships", "studiousness", "stupefaction", "stupendously", "subbasements", "subcommittee", "subconscious", "subcontinent", "subcontracts", "subcutaneous", "subdivisions", "subjectively", "subjectivity", "subjunctives", "subliminally", "submersibles", "submissively", "subordinated", "subordinates", "subscription", "subsequently", "subservience", "subservients", "subsidiaries", "subsidiarity", "substantiate", "substantives", "substituting", "substitution", "substructure", "subterranean", "subtractions", "suburbanites", "subversively", "successfully", "successively", "succinctness", "sufficiently", "suffocatings", "suffragettes", "sugarcoating", "suggestively", "summerhouses", "superannuate", "supercharged", "supercharger", "supercharges", "supercilious", "superficials", "supergrasses", "superhighway", "superimposed", "superimposes", "superintends", "superlatives", "supermarkets", "supernatural", "superscripts", "superstition", "supertankers", "supervisions", "supplemental", "supplemented", "supplicating", "supplication", "suppositions", "suppressants", "supremacists", "surfboarding", "surmountable", "surprisingly", "surrealistic", "surrendering", "surroundings", "surveillance", "suspiciously", "swallowtails", "swashbuckler", "switchblades", "switchboards", "syllabifying", "symbolically", "sympathetics", "syndicalists", "systemically", "tactlessness", "taramasalata", "tautological", "taxidermists", "teaspoonfuls", "technicality", "technocratic", "technologies", "technologist", "technophobes", "teenyboppers", "telecommuted", "telecommuter", "telecommutes", "telegraphers", "telegraphese", "telegraphing", "teleological", "telephonists", "teleprinters", "temperaments", "temperatures", "tercentenary", "terminations", "terrestrials", "terrifically", "terrifyingly", "territorials", "tessellating", "tessellation", "testamentary", "testimonials", "testosterone", "tetrahedrons", "thankfullest", "thankfulness", "thanksgiving", "theatrically", "thematically", "theoretician", "therapeutics", "thermometers", "thermostatic", "thingamabobs", "thingamajigs", "thingumabobs", "thoroughbred", "thoroughfare", "thoroughness", "thoughtfully", "threatenings", "thunderbolts", "thunderclaps", "thundercloud", "thunderheads", "thunderously", "thunderstorm", "timelessness", "timorousness", "tirelessness", "tiresomeness", "toastmasters", "tobacconists", "togetherness", "tomfooleries", "toothbrushes", "topographers", "topographies", "tortuousness", "totalitarian", "toxicologist", "tractability", "trademarking", "tradespeople", "trailblazers", "trainspotter", "traitorously", "trajectories", "trampolining", "transactions", "transceivers", "transcendent", "transcending", "transcribing", "transferable", "transference", "transferring", "transfigured", "transfigures", "transformers", "transforming", "transfusions", "transgressed", "transgresses", "transgressor", "transitional", "transitioned", "transitively", "transitivity", "translations", "translucence", "transmigrate", "transmission", "transmitters", "transmitting", "transmogrify", "transoceanic", "transparency", "transplanted", "transponders", "transporters", "transporting", "transsexuals", "transshipped", "transversely", "transversing", "transvestism", "transvestite", "trapshooting", "tremendously", "trendsetters", "trendsetting", "tribulations", "triglyceride", "trigonometry", "triplicating", "triumphalism", "triumphalist", "triumphantly", "triumvirates", "trivialities", "trolleybuses", "tropospheres", "troublemaker", "troubleshoot", "trusteeships", "trustfulness", "truthfulness", "tuberculosis", "tumultuously", "turbocharged", "turbocharger", "turbocharges", "typographers", "tyrannically", "tyrannosaurs", "ubiquitously", "unacceptable", "unacceptably", "unaccustomed", "unacquainted", "unaffectedly", "unanswerable", "unapologetic", "unassailable", "unattainable", "unattractive", "unattributed", "unbelievable", "unbelievably", "unblinkingly", "unbridgeable", "uncatalogued", "unchallenged", "unchangeable", "uncharitable", "uncharitably", "unclassified", "uncleanliest", "uncompressed", "unconcerning", "unconsidered", "uncontrolled", "unconvincing", "uncorrelated", "uncritically", "unctuousness", "uncultivated", "undemocratic", "undependable", "underachieve", "underbellies", "underbidding", "underbrushed", "underbrushes", "undercharged", "undercharges", "underclasses", "underclothes", "undercoating", "undercurrent", "undercutting", "underexposed", "underexposes", "underfeeding", "undergarment", "undergrounds", "underpinning", "underplaying", "underscoring", "underselling", "undersigning", "understaffed", "understating", "understudied", "understudies", "undertakings", "undervaluing", "underwhelmed", "underwriters", "underwriting", "underwritten", "undeservedly", "undesirables", "undetectable", "undetermined", "undiminished", "undischarged", "undiscovered", "undocumented", "uneconomical", "unemployable", "unemployment", "uneventfully", "unexpectedly", "unexpurgated", "unfaithfully", "unfathomable", "unfathomably", "unflattering", "unforgivable", "unforgivably", "unfortunates", "unfrequented", "unfriendlier", "ungainliness", "ungovernable", "ungraciously", "ungratefully", "unhealthiest", "unhesitating", "unidentified", "unilaterally", "unimaginable", "unimaginably", "unimpressive", "uninterested", "universality", "universities", "unlikelihood", "unmanageable", "unmercifully", "unmistakable", "unmistakably", "unnoticeable", "unobstructed", "unobtainable", "unofficially", "unpardonable", "unpleasantly", "unpopularity", "unprejudiced", "unprincipled", "unprivileged", "unproductive", "unprofitable", "unquenchable", "unquestioned", "unreasonable", "unreasonably", "unregenerate", "unregistered", "unrelievedly", "unremarkable", "unrepeatable", "unreservedly", "unresponsive", "unrestrained", "unrestricted", "unsanctioned", "unsatisfying", "unscientific", "unscrambling", "unscrupulous", "unseasonable", "unseasonably", "unseemliness", "unsightliest", "unsteadiness", "unstintingly", "unstructured", "unsuccessful", "unsupervised", "unsurprising", "unsuspecting", "unthinkingly", "untimeliness", "untouchables", "untruthfully", "unwieldiness", "unworthiness", "upholsterers", "upholstering", "uppercutting", "uproariously", "utilitarians", "vaccinations", "vacillations", "vainglorious", "vaporisation", "veggieburger", "verdigrising", "verification", "veterinarian", "veterinaries", "vicissitudes", "victoriously", "vilification", "vindications", "vindictively", "violincellos", "violoncellos", "virtuousness", "viscountcies", "vituperating", "vituperation", "vituperative", "vocabularies", "vocationally", "vociferating", "vociferation", "vociferously", "voluminously", "volunteering", "voluptuaries", "voluptuously", "wainscotings", "waistcoating", "wallpapering", "warmongering", "wastebaskets", "wastefulness", "watchfulness", "watercourses", "watermarking", "waterproofed", "weatherboard", "weathercocks", "weatherproof", "weighbridges", "weightlessly", "weightlifter", "welterweight", "whatshername", "whatshisname", "wheelbarrows", "wheelwrights", "whimsicality", "whippoorwill", "whitewashing", "wholehearted", "wildernesses", "windbreakers", "windcheaters", "wisecracking", "withstanding", "woodcarvings", "workstations", "wretchedness", "wristwatches", "wrongfulness", "xylophonists", "yellowhammer", "youthfulness" }; const char* w_13[] = { "abbreviations", "abnormalities", "abolitionists", "accelerations", "acceptability", "accessibility", "acclimatising", "acclimatizing", "accommodating", "accommodation", "accompaniment", "accomplishing", "accouterments", "accreditation", "acculturation", "accumulations", "acetaminophen", "acknowledging", "acquaintances", "acrimoniously", "acupuncturist", "adjudications", "administering", "administrated", "administrates", "administrator", "admissibility", "admonishments", "adventuresome", "adventuresses", "adventurously", "advertisement", "aesthetically", "affirmatively", "affordability", "afforestation", "afterthoughts", "agglomerating", "agglomeration", "agglutinating", "agglutination", "airworthiness", "algebraically", "allegorically", "alliterations", "alphanumerics", "alternatively", "amalgamations", "ambassadorial", "ambitiousness", "amniocenteses", "amniocentesis", "amorphousness", "amplification", "anachronistic", "angioplasties", "anniversaries", "announcements", "antibacterial", "anticipations", "anticlimactic", "anticlockwise", "anticoagulant", "antihistamine", "antimacassars", "antiparticles", "antipersonnel", "apathetically", "applicability", "apportionment", "appreciations", "apprehensions", "appropriately", "appropriating", "appropriation", "approximately", "approximating", "approximation", "appurtenances", "arachnophobia", "arbitrariness", "archaeologist", "archbishopric", "archduchesses", "architectural", "architectures", "argumentation", "argumentative", "aristocracies", "articulations", "artificiality", "ascertainable", "asphyxiations", "assassinating", "assassination", "assemblywoman", "assemblywomen", "assertiveness", "assiduousness", "asthmatically", "astonishingly", "astrophysical", "atrociousness", "attentiveness", "attributively", "audaciousness", "augmentations", "authentically", "authenticated", "authenticates", "authoritarian", "authoritative", "autobiography", "automatically", "axiomatically", "baccalaureate", "bacchanalians", "backstretches", "bantamweights", "battlegrounds", "beatification", "belligerently", "beneficiaries", "bewilderingly", "bibliographer", "bibliographic", "bicentenaries", "bicentennials", "bidirectional", "biodegradable", "biophysicists", "biotechnology", "blabbermouths", "blackberrying", "blackcurrants", "blandishments", "blasphemously", "bloodcurdling", "bluestockings", "blunderbusses", "boardinghouse", "bougainvillea", "bouillabaisse", "boysenberries", "brainchildren", "brainstorming", "breakthroughs", "breastfeeding", "breaststrokes", "breathalysers", "breathalyzers", "brokenhearted", "brotherliness", "bulletproofed", "bumptiousness", "bureaucracies", "businesswoman", "businesswomen", "butterfingers", "cabinetmakers", "calligraphers", "campanologist", "cancellations", "cannibalistic", "cannonballing", "cantilevering", "capaciousness", "capitulations", "carbohydrates", "carboniferous", "cardiologists", "caricaturists", "carpetbaggers", "carpetbagging", "cartilaginous", "cartographers", "categorically", "ceremoniously", "certificating", "certification", "chairmanships", "championships", "chancelleries", "changeability", "characterless", "charioteering", "chastisements", "cheerlessness", "cheeseburgers", "childlessness", "childproofing", "chiropractics", "chiropractors", "chloroforming", "choreographed", "choreographer", "choreographic", "chronological", "chrysanthemum", "churchwardens", "circumcisions", "circumference", "circumscribed", "circumscribes", "circumspectly", "circumstanced", "circumstances", "circumventing", "circumvention", "clandestinely", "clapperboards", "clarification", "classlessness", "clearinghouse", "climatologist", "clotheslining", "codifications", "coeducational", "collaborating", "collaboration", "collaborative", "collaborators", "collectivists", "colloquialism", "combativeness", "commandeering", "commemorating", "commemoration", "commemorative", "commencements", "commendations", "commensurable", "commercialism", "commiserating", "commiseration", "commissariats", "commissioners", "commissioning", "commonalities", "commonwealths", "communicating", "communication", "communicative", "communicators", "companionable", "companionably", "companionship", "companionways", "comparability", "comparatively", "compassionate", "compatibility", "compensations", "competitively", "complaisantly", "complementary", "complementing", "complications", "complimentary", "complimenting", "comprehending", "comprehension", "comprehensive", "computational", "concatenating", "concatenation", "concentrating", "concentration", "concertinaing", "concertmaster", "concessionary", "concomitantly", "condemnations", "condensations", "condescending", "condescension", "conditionally", "conductresses", "confectioners", "confectionery", "confederacies", "confederating", "confederation", "confessionals", "configuration", "confirmations", "confiscations", "conflagration", "conformations", "confrontation", "conglomerated", "conglomerates", "congratulated", "congratulates", "congregations", "congressional", "congresswoman", "congresswomen", "conquistadors", "consanguinity", "conscientious", "consciousness", "consecrations", "consecutively", "consequential", "conservancies", "conservatives", "conservatoire", "considerately", "consideration", "consistencies", "consolidating", "consolidation", "conspicuously", "constellation", "consternation", "constitutions", "constrictions", "constructions", "consultancies", "consultations", "consummations", "contaminating", "contamination", "contemplating", "contemplation", "contemplative", "contentedness", "contentiously", "contingencies", "continuations", "contortionist", "contraception", "contraceptive", "contractually", "contradicting", "contradiction", "contradictory", "contravention", "contributions", "controversial", "controversies", "controverting", "convalescence", "convalescents", "conventioneer", "conversations", "cooperatively", "coreligionist", "corespondents", "correspondent", "corresponding", "corroborating", "corroboration", "corroborative", "cosignatories", "cosmetologist", "cosmopolitans", "countenancing", "counteracting", "counteraction", "counterattack", "counterblasts", "counterclaims", "counterfeited", "counterfeiter", "countermanded", "counteroffers", "counterpoints", "countersigned", "countertenors", "countervailed", "counterweight", "courteousness", "craftsmanship", "credentialing", "credulousness", "criminologist", "crisscrossing", "crossbreeding", "crosschecking", "crosscurrents", "cryptographer", "daguerreotype", "dauntlessness", "decaffeinated", "decaffeinates", "decapitations", "deceitfulness", "deceptiveness", "declassifying", "decommissions", "decomposition", "decompressing", "decompression", "decongestants", "deconstructed", "decontaminate", "decontrolling", "defectiveness", "defensiveness", "deferentially", "defibrillator", "deforestation", "dehumidifiers", "dehumidifying", "deliberations", "delicatessens", "deliciousness", "delinquencies", "demagogically", "demigoddesses", "demonstrating", "demonstration", "demonstrative", "demonstrators", "denominations", "denouncements", "denunciations", "dependability", "deprecatingly", "deprogramming", "dermatologist", "descriptively", "desegregating", "desegregation", "dessertspoons", "destructively", "deteriorating", "deterioration", "determination", "deterministic", "detrimentally", "devastatingly", "developmental", "diagnostician", "diametrically", "dictatorially", "dictatorships", "differentials", "differentiate", "dillydallying", "dimensionless", "directionless", "directorships", "disadvantaged", "disadvantages", "disafforested", "disagreements", "disappearance", "disappointing", "disassembling", "disassociated", "disassociates", "disbursements", "discographies", "discomforting", "disconcerting", "disconnecting", "disconnection", "discontenting", "discontinuing", "discontinuity", "discontinuous", "discourtesies", "discreditable", "discreditably", "discrepancies", "discretionary", "discriminated", "discriminates", "disemboweling", "disenchanting", "disencumbered", "disengagement", "disentangling", "disfigurement", "disfranchised", "disfranchises", "disgracefully", "disharmonious", "disheartening", "disillusioned", "disincentives", "disinfectants", "disinheriting", "disintegrated", "disintegrates", "disinterested", "disinvestment", "dismemberment", "disobediently", "disorientated", "disorientates", "disparagement", "disparagingly", "dispassionate", "dispensations", "displacements", "dispossessing", "dispossession", "disproportion", "disqualifying", "disquisitions", "disrespectful", "disrespecting", "dissatisfying", "disseminating", "dissemination", "dissertations", "dissimilarity", "dissimulating", "dissimulation", "dissoluteness", "distastefully", "distillations", "distinctively", "distinguished", "distinguishes", "distressingly", "distributions", "distrustfully", "documentaries", "documentation", "domesticating", "domestication", "draughtboards", "draughtswoman", "draughtswomen", "dysfunctional", "eavesdroppers", "eavesdropping", "eccentrically", "ecclesiastics", "educationally", "educationists", "effectiveness", "effervescence", "efficaciously", "efflorescence", "egocentricity", "egotistically", "elaborateness", "electioneered", "electrocuting", "electrocution", "electromagnet", "electroplated", "electroplates", "electrostatic", "elocutionists", "embarrassment", "embellishment", "embryological", "embryologists", "encapsulating", "encapsulation", "enchantresses", "encouragement", "encouragingly", "encroachments", "encrustations", "encyclopedias", "energetically", "enfranchising", "enigmatically", "enlightenment", "entanglements", "entertainment", "enthronements", "entomological", "entomologists", "entrenchments", "entrepreneurs", "environmental", "equestriennes", "equivocations", "ergonomically", "escapologists", "establishment", "estrangements", "ethnocentrism", "ethnographers", "eventualities", "everlastingly", "exaggeratedly", "exaggerations", "exasperatedly", "exceptionable", "exceptionally", "exclusiveness", "excommunicate", "exhibitionism", "exhibitionist", "existentially", "expansionists", "expansiveness", "expectorating", "expectoration", "expeditionary", "expeditiously", "experimenters", "experimenting", "explosiveness", "exponentially", "expostulating", "expostulation", "expressionism", "expressionist", "expropriating", "expropriation", "expropriators", "exquisiteness", "extensiveness", "exterminating", "extermination", "exterminators", "extinguishers", "extinguishing", "extortionists", "extrajudicial", "extraordinary", "extrapolating", "extrapolation", "extravagances", "extravagantly", "extravaganzas", "extrinsically", "facetiousness", "faithlessness", "falsification", "fantastically", "fascinatingly", "featherweight", "felicitations", "ferociousness", "filibustering", "fingerprinted", "flabbergasted", "flamethrowers", "flirtatiously", "floodlighting", "fluorocarbons", "foolhardiness", "foregrounding", "foreknowledge", "foreordaining", "foreshadowing", "foreshortened", "forgetfulness", "fortification", "fountainheads", "fractiousness", "fragmentation", "frighteningly", "frontbenchers", "frontispieces", "fruitlessness", "functionalism", "functionalist", "functionality", "functionaries", "fundamentally", "galvanometers", "garrulousness", "gastronomical", "generalissimo", "genuflections", "geometrically", "geophysicists", "geostationary", "geriatricians", "gerontologist", "gerrymandered", "gesticulating", "gesticulation", "globetrotters", "globetrotting", "glockenspiels", "glorification", "goosestepping", "gracelessness", "grammatically", "grandchildren", "granddaughter", "grandfathered", "grandiloquent", "grandstanding", "graphologists", "gratification", "gravitational", "groundskeeper", "gubernatorial", "guesstimating", "hagiographies", "hairsbreadths", "hairsplitting", "halfheartedly", "hallucinating", "hallucination", "hallucinatory", "hallucinogens", "handkerchiefs", "happenstances", "harbormasters", "hardheartedly", "headquartered", "healthfulness", "heartbreaking", "heartlessness", "helicoptering", "hemispherical", "hermaphrodite", "herringboning", "heterogeneity", "heterogeneous", "heterosexuals", "hieroglyphics", "holidaymakers", "homestretches", "homogeneously", "homosexuality", "horseradishes", "horsewhipping", "horticultural", "hotheadedness", "housebreakers", "housebreaking", "housecleaning", "househusbands", "housemistress", "housewarmings", "huckleberries", "humanitarians", "hundredweight", "hydraulically", "hydraulicking", "hydroelectric", "hydrogenating", "hyperactivity", "hypercritical", "hypochondriac", "hypoglycemics", "ideologically", "idiomatically", "idiosyncratic", "ignominiously", "illuminations", "illustrations", "imaginatively", "impeccability", "imperceptible", "imperceptibly", "imperfections", "imperialistic", "imperiousness", "imperishables", "impermissible", "impersonating", "impersonation", "impersonators", "impertinences", "impertinently", "imperturbable", "imperturbably", "impetuousness", "implacability", "implementable", "imponderables", "importunating", "impossibility", "impoverishing", "impracticable", "impracticably", "impressionism", "impressionist", "imprisonments", "improbability", "improprieties", "improvidently", "improvisation", "impulsiveness", "inadvertently", "inappropriate", "inarticulates", "inattentively", "inaugurations", "incandescence", "incandescents", "incapacitated", "incapacitates", "incarcerating", "incarceration", "incombustible", "incommunicado", "incompatibles", "incompetently", "inconceivable", "inconceivably", "incongruities", "incongruously", "inconsiderate", "inconsistency", "inconspicuous", "incontestable", "incontestably", "inconvenience", "incorporating", "incorporation", "incorrectness", "incorruptible", "incorruptibly", "incredibility", "incredulously", "incrementally", "incriminating", "incrimination", "incriminatory", "incrustations", "indefatigable", "indefatigably", "independently", "indescribable", "indescribably", "indeterminacy", "indeterminate", "indifferently", "indigestibles", "indiscernible", "indiscretions", "indispensable", "indispensably", "indisposition", "individualism", "individualist", "individuality", "indoctrinated", "indoctrinates", "industrialism", "industrialist", "industriously", "ineffectively", "ineffectually", "inefficiently", "ineligibility", "inevitability", "inexhaustible", "inexhaustibly", "inexorability", "inexpensively", "inexperienced", "inexpressible", "inexpressibly", "infallibility", "infinitesimal", "inflammations", "inflexibility", "inflorescence", "influentially", "informational", "infringements", "infuriatingly", "ingenuousness", "injudiciously", "innocuousness", "inoffensively", "inopportunely", "inquisitively", "inquisitorial", "insectivorous", "insensibility", "insensitively", "insensitivity", "insidiousness", "insignificant", "inspectorates", "inspirational", "instabilities", "installations", "instantaneous", "instinctively", "institutional", "instructional", "instructively", "instrumentals", "instrumenting", "insubordinate", "insubstantial", "insufficiency", "insupportable", "insurrections", "intellectuals", "intelligently", "intemperately", "intentionally", "interactively", "interactivity", "interbreeding", "interceptions", "intercessions", "interchanging", "interconnects", "interestingly", "intergalactic", "interjections", "interlocutors", "interlocutory", "intermarriage", "intermarrying", "intermediates", "intermingling", "intermissions", "international", "interpersonal", "interpolating", "interpolation", "interposition", "interrelating", "interrelation", "interrogating", "interrogation", "interrogative", "interrogators", "interrogatory", "interruptions", "intersections", "interspersing", "interventions", "intransigence", "intransigents", "intransitives", "intravenouses", "intravenously", "intrinsically", "introductions", "introspection", "introspective", "inventiveness", "invertebrates", "investigating", "investigation", "investigative", "investigators", "investigatory", "invidiousness", "invincibility", "inviolability", "invitationals", "involuntarily", "irrationality", "irrecoverable", "irrecoverably", "irredeemables", "irrelevancies", "irreplaceable", "irrepressible", "irrepressibly", "irresponsible", "irresponsibly", "irretrievable", "irretrievably", "isolationists", "jackhammering", "jitterbugging", "jollification", "judiciousness", "jurisdictions", "jurisprudence", "justification", "juxtaposition", "kaleidoscopes", "kaleidoscopic", "kindergartens", "kleptomaniacs", "knowledgeable", "knowledgeably", "knuckleduster", "laboriousness", "lackadaisical", "landownership", "laughingstock", "lethargically", "lexicographer", "librarianship", "lithographers", "lithographing", "litigiousness", "loathsomeness", "ludicrousness", "luncheonettes", "luxuriousness", "macroeconomic", "mademoiselles", "magisterially", "magnanimously", "magnetosphere", "magnification", "magnificently", "mainstreaming", "maladjustment", "maladroitness", "malformations", "malfunctioned", "manageability", "manifestation", "manipulations", "mantelshelves", "manufacturers", "manufacturing", "marchionesses", "marketability", "masterclasses", "masterminding", "masterstrokes", "materialistic", "mathematician", "matriculating", "matriculation", "meaninglessly", "meetinghouses", "megalomaniacs", "megalopolises", "mellifluously", "melodiousness", "melodramatics", "merchandising", "meritocracies", "meritoriously", "metalanguages", "metallurgical", "metallurgists", "metamorphosed", "metamorphoses", "metamorphosis", "meteorologist", "methodologies", "microcomputer", "microorganism", "microwaveable", "middleweights", "millionairess", "mimeographing", "mineralogists", "minicomputers", "ministrations", "misadventures", "misanthropist", "misapprehends", "miscalculated", "miscalculates", "miscegenation", "miscellaneous", "mischievously", "misconceiving", "misconception", "misconducting", "misconstruing", "misdiagnosing", "misidentified", "misidentifies", "misinterprets", "mismanagement", "mispronounced", "mispronounces", "misquotations", "misrepresents", "misstatements", "mistranslated", "mistrustfully", "misunderstand", "misunderstood", "modifications", "mollification", "mollycoddling", "momentousness", "monochromatic", "monocotyledon", "mononucleosis", "monosyllables", "monotonically", "monstrosities", "morphological", "mortification", "motherfuckers", "motherfucking", "motorcyclists", "mountaineered", "mountainsides", "mousetrapping", "mouthwatering", "multicultural", "multinational", "multiplicands", "multitudinous", "multivitamins", "mummification", "musicologists", "mystification", "nationalistic", "nationalities", "necessitating", "necrophiliacs", "nefariousness", "neoclassicism", "newsworthiest", "niggardliness", "nightclubbing", "nightwatchman", "nightwatchmen", "nitroglycerin", "noiselessness", "nomenclatures", "nonabsorbents", "nonagenarians", "nonalcoholics", "noncombatants", "noncommercial", "noncompliance", "nonconductors", "nonconformism", "nonconformist", "nonconformity", "noncontagious", "nondeductible", "nonindustrial", "nonjudgmental", "nonnegotiable", "nonproductive", "nonrefillable", "nonrefundable", "nonreturnable", "nonsensically", "northeasterly", "northeastward", "northwesterly", "northwestward", "nostalgically", "notifications", "nullification", "nutritionally", "nutritionists", "nymphomaniacs", "objectionable", "objectionably", "objectiveness", "obliviousness", "obnoxiousness", "observational", "observatories", "obsessionally", "obstetricians", "obstructively", "obtrusiveness", "oceanographer", "oceanographic", "octogenarians", "offensiveness", "offhandedness", "officeholders", "officiousness", "oleomargarine", "operationally", "ophthalmology", "opportunistic", "opportunities", "orchestrating", "orchestration", "ornamentation", "ornithologist", "orthodontists", "orthogonality", "orthographies", "oscilloscopes", "outdistancing", "outperforming", "outspokenness", "outstandingly", "outstretching", "overabundance", "overachievers", "overachieving", "overambitious", "overbalancing", "overburdening", "overconfident", "overdeveloped", "overestimated", "overestimates", "overextending", "overindulging", "overpopulated", "overpopulates", "overproducing", "overqualified", "overreactions", "oversensitive", "overshadowing", "overspreading", "overstatement", "overstretched", "overstretches", "oversubscribe", "oversupplying", "overvaluation", "overweeningly", "overwintering", "painstakingly", "palaeontology", "pantechnicons", "paradoxically", "parallelogram", "paraphernalia", "parasitically", "parenthetical", "parliamentary", "participating", "participation", "participators", "participatory", "particularity", "passionflower", "passivisation", "passivization", "paterfamilias", "paternalistic", "patriotically", "peculiarities", "pedagogically", "pediatricians", "perambulating", "perambulation", "perambulators", "percussionist", "peregrination", "perfectionism", "perfectionist", "perfunctorily", "perpendicular", "personalities", "perspicacious", "perturbations", "pervasiveness", "petrochemical", "pharmacopoeia", "phenobarbital", "phenomenology", "philanthropic", "philharmonics", "philodendrons", "philosophical", "photoelectric", "photographers", "photographing", "photostatting", "phrenologists", "physiognomies", "physiological", "physiologists", "physiotherapy", "picturesquely", "piezoelectric", "pigheadedness", "platitudinous", "pneumatically", "pointlessness", "policyholders", "poliomyelitis", "polypropylene", "polysyllables", "ponderousness", "pontificating", "pornographers", "possibilities", "postgraduates", "postmodernism", "postmodernist", "postoperative", "postponements", "powerlessness", "practitioners", "pragmatically", "precautionary", "precipitately", "precipitating", "precipitation", "precipitously", "preconceiving", "preconception", "preconditions", "predetermined", "predeterminer", "predetermines", "predicatively", "predilections", "predominantly", "predominately", "predominating", "prefabricated", "prefabricates", "preliminaries", "premeditating", "premeditation", "preoccupation", "preponderance", "preponderated", "preponderates", "prepositional", "prepositioned", "prepossessing", "preregistered", "prerequisites", "prescriptions", "presentations", "presentiments", "preservatives", "pretentiously", "preternatural", "prevaricating", "prevarication", "prevaricators", "preventatives", "primitiveness", "primogeniture", "prizefighters", "prizefighting", "probabilistic", "probabilities", "problematical", "processionals", "processioning", "proclamations", "procrastinate", "professionals", "professorship", "profitability", "prognosticate", "programmables", "progressively", "prohibitively", "projectionist", "proliferating", "proliferation", "prolongations", "promiscuously", "pronounceable", "pronouncement", "pronunciation", "propagandists", "prophetically", "prophylactics", "proportionals", "proportionate", "proportioning", "propositional", "propositioned", "proprietaries", "proprietorial", "proscriptions", "protectionism", "protectionist", "protectorates", "protestations", "protuberances", "provincialism", "provisionally", "provocatively", "psephologists", "psychiatrists", "psychoanalyst", "psychokinesis", "psychokinetic", "psychological", "psychologists", "psychopathics", "psychosomatic", "psychotherapy", "punctiliously", "puritanically", "purposelessly", "pusillanimity", "pusillanimous", "quadraphonics", "quadrilateral", "quadriplegics", "quadruplicate", "qualification", "qualitatively", "quarterbacked", "quarterfinals", "quartermaster", "questioningly", "questionnaire", "quintessences", "radioactivity", "radiographers", "radioisotopes", "ramifications", "rapaciousness", "rapprochement", "rationalistic", "reactionaries", "readabilities", "readjustments", "reaffirmation", "realistically", "reappearances", "reappointment", "reapportioned", "rearrangement", "reassessments", "recalcitrance", "recapitulated", "recapitulates", "receptionists", "receptiveness", "reciprocating", "reciprocation", "reclassifying", "recollections", "recombination", "recompilation", "reconditioned", "reconsidering", "reconstituted", "reconstitutes", "reconstructed", "recriminating", "recrimination", "recriminatory", "recrudescence", "rectification", "redevelopment", "rediscoveries", "rediscovering", "redistributed", "redistributes", "redistricting", "reestablished", "reestablishes", "reforestation", "reformatories", "reformulating", "refrigerating", "refrigeration", "refrigerators", "refurbishment", "regimentation", "registrations", "regurgitating", "regurgitation", "rehabilitated", "rehabilitates", "reimbursement", "reincarnating", "reincarnation", "reinforcement", "reinstatement", "reinterpreted", "relationships", "relinquishing", "reminiscences", "reminiscently", "remonstrances", "remonstrating", "remorselessly", "remunerations", "rendezvousing", "renegotiating", "renunciations", "repatriations", "repercussions", "replenishment", "repossessions", "reprehensible", "reprehensibly", "reproachfully", "reproducibles", "reproductions", "reprogramming", "republicanism", "repulsiveness", "requisitioned", "resentfulness", "resourcefully", "resplendently", "restaurateurs", "restrictively", "restructuring", "resurrections", "resuscitating", "resuscitation", "resuscitators", "retentiveness", "reticulations", "retrenchments", "retroactively", "retrogressing", "retrogression", "retrogressive", "retrospecting", "retrospection", "retrospective", "reunification", "reupholstered", "reverberating", "reverberation", "reverentially", "reversibility", "revolutionary", "revolutionist", "rhododendrons", "righteousness", "rollerblading", "rollerskating", "rubberneckers", "rubbernecking", "sacrificially", "sadomasochism", "sadomasochist", "salaciousness", "sanctimonious", "sarcastically", "sarsaparillas", "satisfactions", "scandalmonger", "scatterbrains", "schadenfreude", "schematically", "schizophrenia", "schizophrenic", "scholasticism", "schoolmarmish", "schoolmasters", "schoolteacher", "scintillating", "scintillation", "screenwriters", "screenwriting", "scriptwriters", "seaworthiness", "secessionists", "secretiveness", "sedimentation", "seductiveness", "seismographic", "seismological", "seismologists", "semiautomatic", "semiconductor", "semiconscious", "semifinalists", "semimonthlies", "semipermeable", "sensationally", "senselessness", "sensibilities", "sensitiveness", "sensitivities", "sententiously", "sentimentally", "sequestrating", "sequestration", "serendipitous", "sexagenarians", "shamelessness", "shapelessness", "sharecroppers", "shareholdings", "sharpshooters", "shepherdesses", "shiftlessness", "shortchanging", "shuffleboards", "shuttlecocked", "sidesplitting", "significantly", "signification", "singularities", "skateboarders", "skateboarding", "sledgehammers", "sleeplessness", "smallholdings", "socioeconomic", "solicitations", "somersaulting", "somnambulists", "sonsofbitches", "sophisticated", "sophisticates", "soporifically", "soundproofing", "southeasterly", "southeastward", "southwesterly", "southwestward", "spasmodically", "speakerphones", "specification", "spectacularly", "spectroscopes", "spectroscopic", "speculatively", "speechwriters", "speleologists", "spellcheckers", "spinelessness", "spiritualists", "spokespersons", "spontaneously", "sportscasters", "sportscasting", "sportsmanlike", "sportsmanship", "sprightliness", "squeamishness", "staphylococci", "statelessness", "statesmanlike", "statesmanship", "stationmaster", "statistically", "statisticians", "steadfastness", "steamrollered", "steeplechases", "stenographers", "stepdaughters", "steppingstone", "stereotypical", "stipendiaries", "straightaways", "straightedges", "straightening", "straitjackets", "strangleholds", "strangulating", "strangulation", "strategically", "stratospheres", "stratospheric", "streetwalkers", "strengthening", "strenuousness", "streptococcal", "streptococcus", "strikebreaker", "structuralism", "structuralist", "stylistically", "subcommittees", "subcontinents", "subcontracted", "subcontractor", "sublieutenant", "subordinating", "subordination", "subscriptions", "subserviently", "substantially", "substantiated", "substantiates", "substitutions", "substructures", "sumptuousness", "superabundant", "superannuated", "superannuates", "superchargers", "supercharging", "supercomputer", "superficially", "superfluously", "superhighways", "superimposing", "superintended", "superlatively", "supernaturals", "supernumerary", "superstitions", "superstitious", "supplementary", "supplementing", "supplications", "suppositories", "supranational", "surreptitious", "swashbucklers", "swashbuckling", "swordsmanship", "syllabication", "symbiotically", "symmetrically", "synchronicity", "synchronously", "syntactically", "synthetically", "tablespoonful", "talkativeness", "tastelessness", "technocracies", "technological", "technologists", "telecommuters", "telecommuting", "telemarketing", "televangelism", "televangelist", "temperamental", "tempestuously", "temporariness", "tendentiously", "tenderhearted", "tentativeness", "terminologies", "tessellations", "thanksgivings", "theatricality", "thenceforward", "theologically", "theoretically", "theoreticians", "thermodynamic", "thermonuclear", "thermoplastic", "thermostatics", "thoroughbreds", "thoroughfares", "thoroughgoing", "thoughtlessly", "threateningly", "thunderclouds", "thundershower", "thunderstorms", "thunderstruck", "tonsillectomy", "topographical", "topologically", "tortoiseshell", "totalitarians", "toxicological", "toxicologists", "tracheotomies", "traditionally", "tragicomedies", "trainspotters", "trainspotting", "transatlantic", "transcendence", "transcription", "transfiguring", "transgressing", "transgression", "transgressors", "transitioning", "transliterate", "transmigrated", "transmigrates", "transmissible", "transmissions", "transmittable", "transmutation", "transnational", "transparently", "transpiration", "transplanting", "transportable", "transposition", "transshipment", "transshipping", "transvestites", "traumatically", "treacherously", "triangulation", "triglycerides", "trigonometric", "troublemakers", "troubleshoots", "trustworthier", "turbochargers", "turbocharging", "typographical", "tyrannosaurus", "unaccompanied", "unaccountable", "unaccountably", "unadulterated", "unambiguously", "unanticipated", "unappreciated", "unceremonious", "uncertainties", "uncomfortable", "uncomfortably", "uncomplaining", "uncomplicated", "unconcernedly", "unconditional", "unconquerable", "unconsciously", "uncooperative", "uncoordinated", "underachieved", "underachiever", "underachieves", "underbrushing", "undercarriage", "undercharging", "underclassman", "underclassmen", "underclothing", "undercurrents", "underemployed", "underestimate", "underexposing", "undergarments", "undergraduate", "underhandedly", "underpinnings", "undershooting", "understanding", "understudying", "underwhelming", "undisciplined", "unembarrassed", "unemotionally", "unenforceable", "unenlightened", "unequivocally", "unexceptional", "unfamiliarity", "unfashionable", "unfashionably", "unflinchingly", "unforeseeable", "unforgettable", "unforgettably", "unfortunately", "unfriendliest", "ungentlemanly", "ungrammatical", "unilateralism", "unimaginative", "unimpeachable", "unimplemented", "uninformative", "uninhabitable", "unintelligent", "unintentional", "uninteresting", "uninterpreted", "uninterrupted", "unjustifiable", "unjustifiably", "unmentionable", "unnecessarily", "unobtrusively", "unprecedented", "unpredictable", "unpredictably", "unpretentious", "unpreventable", "unquestioning", "unrelentingly", "unreliability", "unremittingly", "unselfishness", "unsentimental", "unsightliness", "unspectacular", "unsubstantial", "unsupportable", "unsustainable", "unsympathetic", "untrustworthy", "unwillingness", "upperclassman", "upperclassmen", "valedictorian", "valedictories", "vegetarianism", "veggieburgers", "ventriloquism", "ventriloquist", "versification", "veterinarians", "videocassette", "viscountesses", "vitriolically", "vivaciousness", "voraciousness", "vulnerability", "waterproofing", "weatherboards", "weathercocked", "weatherproofs", "weightlifters", "weightlifting", "welterweights", "whippoorwills", "wholesomeness", "woolgathering", "worthlessness", "wrongheadedly", "yellowhammers" }; const char* w_14[] = { "abstractnesses", "accommodations", "accompaniments", "accomplishment", "accountability", "acupuncturists", "administrating", "administration", "administrative", "administrators", "advantageously", "adventitiously", "advertisements", "affectionately", "aforementioned", "agglomerations", "agglutinations", "aggressiveness", "agribusinesses", "alphabetically", "altruistically", "amateurishness", "ambassadorship", "ambidextrously", "ambulancewoman", "ambulancewomen", "amplifications", "anthropologist", "anticoagulants", "antidepressant", "antihistamines", "antiperspirant", "antiseptically", "antithetically", "apologetically", "appendectomies", "appreciatively", "apprehensively", "apprenticeship", "appropriations", "approximations", "archaeological", "archaeologists", "archbishoprics", "arithmetically", "aromatherapist", "articulateness", "assassinations", "astrologically", "astronomically", "astrophysicist", "asymmetrically", "asymptotically", "asynchronously", "attractiveness", "auspiciousness", "authenticating", "authentication", "authoritarians", "autocratically", "autosuggestion", "baccalaureates", "backscratching", "bacteriologist", "beatifications", "beautification", "benefactresses", "bibliographers", "bibliographies", "bloodthirstier", "boardinghouses", "boisterousness", "bougainvilleas", "bouillabaisses", "breathlessness", "breathtakingly", "brontosauruses", "bulletproofing", "campanologists", "cantankerously", "capriciousness", "cardiovascular", "certifications", "characteristic", "choreographers", "choreographing", "chrysanthemums", "cinematography", "circumferences", "circumlocution", "circumlocutory", "circumnavigate", "circumscribing", "circumspection", "circumstancing", "circumstantial", "clarifications", "classification", "claustrophobia", "claustrophobic", "clearinghouses", "climatologists", "coincidentally", "collaborations", "collaboratives", "colloquialisms", "combustibility", "commemorations", "commensurately", "commiserations", "commissionaire", "communications", "comprehensible", "comprehensibly", "comprehensions", "comprehensives", "compulsiveness", "concatenations", "concentrations", "concentrically", "concertmasters", "concessionaire", "confederations", "confidentially", "configurations", "conflagrations", "confrontations", "conglomerating", "conglomeration", "congratulating", "congratulation", "congratulatory", "congregational", "conjunctivitis", "conservatively", "conservatoires", "conservatories", "considerations", "consolidations", "conspiratorial", "constabularies", "constellations", "constituencies", "constitutional", "constructively", "contemplatives", "contemporaries", "contemptuously", "contortionists", "contraceptives", "contradictions", "contraventions", "convalescences", "conventionally", "conventioneers", "conversational", "convertibility", "coreligionists", "correspondence", "correspondents", "corroborations", "cosmetologists", "counteractions", "counterattacks", "counterbalance", "counterclaimed", "counterculture", "counterexample", "counterfeiters", "counterfeiting", "countermanding", "countermeasure", "counterpointed", "countersigning", "countersinking", "countervailing", "counterweights", "criminologists", "cryptographers", "daguerreotyped", "daguerreotypes", "decaffeinating", "decommissioned", "deconstructing", "deconstruction", "decontaminated", "decontaminates", "defibrillators", "democratically", "demonstrations", "demonstratives", "denominational", "dermatologists", "determinations", "detoxification", "diagnosticians", "differentiated", "differentiates", "diplomatically", "disadvantaging", "disafforesting", "disambiguation", "disappearances", "disappointment", "disapprobation", "disapprovingly", "disarrangement", "disassociating", "disbelievingly", "disciplinarian", "discombobulate", "disconnectedly", "disconnections", "disconsolately", "discontentedly", "discontentment", "discontinuance", "discountenance", "discouragement", "discouragingly", "discourteously", "discriminating", "discrimination", "discriminatory", "disembarkation", "disenchantment", "disencumbering", "disenfranchise", "disengagements", "disequilibrium", "disestablished", "disestablishes", "disfigurements", "disfranchising", "disillusioning", "disinclination", "disinformation", "disingenuously", "disintegrating", "disintegration", "disorderliness", "disorientating", "disorientation", "disproportions", "distinguishing", "distributional", "eccentricities", "ecclesiastical", "educationalist", "egalitarianism", "egocentrically", "electioneering", "electrocutions", "electromagnets", "electronically", "electroplating", "embarrassingly", "embarrassments", "embellishments", "emblematically", "emulsification", "encapsulations", "encouragements", "entertainingly", "entertainments", "epidemiologist", "establishments", "ethnologically", "etymologically", "exasperatingly", "excommunicated", "excommunicates", "excruciatingly", "exhibitionists", "existentialism", "existentialist", "experimentally", "exponentiation", "expostulations", "expressionists", "expressionless", "expressiveness", "expropriations", "extemporaneous", "exterminations", "extinguishable", "extortionately", "extraordinaire", "extrapolations", "falsifications", "farsightedness", "fastidiousness", "fatalistically", "featherbedding", "featherbrained", "featherweights", "fingerprinting", "flabbergasting", "foreshortening", "forthrightness", "fortifications", "frontierswoman", "frontierswomen", "functionalists", "fundamentalism", "fundamentalist", "genealogically", "generalissimos", "gentrification", "geographically", "gerontological", "gerontologists", "gerrymandering", "gesticulations", "granddaughters", "grandfathering", "grandiloquence", "gratifications", "gratuitousness", "gregariousness", "groundbreaking", "groundskeepers", "haberdasheries", "hallucinations", "hallucinogenic", "hardheadedness", "harmoniousness", "headmistresses", "headquartering", "hermaphrodites", "hermaphroditic", "heterosexually", "hierarchically", "hippopotamuses", "histrionically", "horticulturist", "hundredweights", "hyperinflation", "hypersensitive", "hyperventilate", "hypnotherapist", "hypoallergenic", "hypochondriacs", "hypocritically", "hypothetically", "hysterectomies", "idealistically", "identification", "idiosyncrasies", "illegitimately", "immaculateness", "impersonations", "implausibility", "implementation", "impolitenesses", "impoverishment", "impracticality", "impregnability", "impressionable", "impressionists", "impressiveness", "improvisations", "inarticulately", "inauspiciously", "incapacitating", "incarcerations", "incestuousness", "incommensurate", "incompleteness", "inconclusively", "inconsiderable", "inconsistently", "inconvenienced", "inconveniences", "inconveniently", "incorruptibles", "indecipherable", "indecisiveness", "indescribables", "indestructible", "indestructibly", "indeterminable", "indiscriminate", "indispensables", "indispositions", "indistinctness", "individualists", "indivisibility", "indoctrinating", "indoctrination", "industrialists", "inefficiencies", "infectiousness", "infinitesimals", "infrastructure", "ingratiatingly", "inscrutability", "inseparability", "insignificance", "insufficiently", "insurmountable", "intellectually", "intelligentsia", "interconnected", "interdependent", "intermarriages", "intermediaries", "intermittently", "internationals", "interpenetrate", "interplanetary", "interpolations", "interpretation", "interpretative", "interrelations", "interrogations", "interrogatives", "intractability", "intransigently", "intransitively", "investigations", "irreconcilable", "irreconcilably", "irregularities", "irreproachable", "irreproachably", "jollifications", "jurisdictional", "justifications", "juxtapositions", "knickerbockers", "knuckledusters", "lasciviousness", "laughingstocks", "legalistically", "lexicographers", "licentiousness", "lightheartedly", "linguistically", "longitudinally", "lugubriousness", "macroeconomics", "magnifications", "malfunctioning", "manifestations", "mathematically", "mathematicians", "meaningfulness", "mesdemoiselles", "metamorphosing", "metaphorically", "meteorological", "meteorologists", "methodological", "meticulousness", "microbiologist", "microcomputers", "microeconomics", "microorganisms", "microprocessor", "mindbogglingly", "misanthropists", "misapplication", "misapprehended", "misappropriate", "miscalculating", "miscalculation", "misconceptions", "misidentifying", "misinformation", "misinterpreted", "mispronouncing", "misrepresented", "misunderstands", "monocotyledons", "mountaineering", "multinationals", "multiplication", "multiplicative", "multiplicities", "municipalities", "mysteriousness", "neocolonialism", "neocolonialist", "newspaperwoman", "newspaperwomen", "noncommercials", "noncommittally", "noncompetitive", "nonconformists", "noncooperation", "nonrestrictive", "nonreturnables", "northeastwards", "northwestwards", "obsequiousness", "obstructionism", "obstructionist", "occupationally", "oceanographers", "oppressiveness", "optimistically", "orchestrations", "ornithological", "ornithologists", "ostentatiously", "osteoarthritis", "outlandishness", "overcompensate", "overdeveloping", "overestimating", "overestimation", "overindulgence", "overpopulating", "overpopulation", "overpoweringly", "overproduction", "overprotective", "oversimplified", "oversimplifies", "overstatements", "overstretching", "oversubscribed", "oversubscribes", "overvaluations", "overwhelmingly", "paediatricians", "paleontologist", "parallelograms", "paramilitaries", "parapsychology", "parsimoniously", "passionflowers", "pathologically", "penitentiaries", "perambulations", "perceptiveness", "percussionists", "peregrinations", "perfectionists", "permissiveness", "perpendiculars", "persuasiveness", "petrochemicals", "phantasmagoria", "pharmaceutical", "pharmacologist", "pharmacopoeias", "philanthropies", "philanthropist", "phlegmatically", "phosphorescent", "photosensitive", "photosynthesis", "polyunsaturate", "portentousness", "possessiveness", "postindustrial", "postmistresses", "postmodernists", "potentialities", "practicability", "practicalities", "prearrangement", "precariousness", "precipitations", "precociousness", "preconceptions", "preconditioned", "predestination", "predeterminers", "predetermining", "predictability", "predisposition", "prefabricating", "prefabrication", "preferentially", "preoccupations", "preponderances", "preponderantly", "preponderating", "prepositioning", "preposterously", "preregistering", "presumptuously", "presupposition", "prevarications", "principalities", "probationaries", "procrastinated", "procrastinates", "procrastinator", "productiveness", "professionally", "professorships", "prognosticated", "prognosticates", "prognosticator", "prohibitionist", "projectionists", "pronouncements", "pronunciations", "proportionally", "propositioning", "proprietorship", "proprietresses", "protectionists", "protectiveness", "providentially", "psychoanalysis", "psychoanalysts", "psychoanalytic", "psychosomatics", "purposefulness", "quadrilaterals", "quadruplicated", "quadruplicates", "qualifications", "quantification", "quantitatively", "quarterbacking", "quartermasters", "questionnaires", "quintessential", "radiotelephone", "radiotherapist", "rapprochements", "reaffirmations", "reapportioning", "rearrangements", "reasonableness", "rebelliousness", "rebroadcasting", "recapitulating", "recapitulation", "recommendation", "reconciliation", "reconditioning", "reconnaissance", "reconstituting", "reconstitution", "reconstructing", "reconstruction", "reconstructive", "recriminations", "rectifications", "redevelopments", "redistributing", "redistribution", "reestablishing", "refurbishments", "rehabilitating", "rehabilitation", "reimbursements", "reincarnations", "reinforcements", "reinterpreting", "relentlessness", "relinquishment", "representation", "representative", "repressiveness", "requisitioning", "respectability", "responsibility", "responsiveness", "restructurings", "retrospectives", "reupholstering", "reverberations", "revivification", "revolutionists", "ridiculousness", "sacrilegiously", "sadomasochists", "sanctification", "satisfactorily", "scandalmongers", "scaremongering", "scatterbrained", "schizophrenics", "scholastically", "schoolchildren", "schoolmistress", "schoolteachers", "scientifically", "segregationist", "semiautomatics", "semiconducting", "semiconductors", "sensationalism", "sensationalist", "sentimentalism", "sentimentalist", "sentimentality", "septuagenarian", "sequestrations", "servomechanism", "shortsightedly", "shuttlecocking", "significations", "simplification", "simplistically", "simultaneously", "slaughterhouse", "sledgehammered", "sociologically", "sociopolitical", "solicitousness", "solidification", "sophisticating", "sophistication", "southeastwards", "southwestwards", "specifications", "speechlessness", "spiritualistic", "staphylococcus", "stationmasters", "steamrollering", "steppingstones", "straitjacketed", "stratification", "strikebreakers", "strikebreaking", "structuralists", "stultification", "subconsciously", "subcontracting", "subcontractors", "subcutaneously", "sublieutenants", "submissiveness", "substantiating", "substantiation", "subversiveness", "superabundance", "superannuating", "superannuation", "superciliously", "supercomputers", "superconductor", "superficiality", "superintendent", "superintending", "supernaturally", "superstructure", "susceptibility", "sustainability", "systematically", "tablespoonfuls", "tautologically", "technicalities", "teleconference", "telepathically", "teletypewriter", "televangelists", "tercentenaries", "terminological", "territoriality", "thenceforwards", "thermodynamics", "thermoplastics", "thoughtfulness", "thundershowers", "tortoiseshells", "traditionalism", "traditionalist", "transcendental", "transcriptions", "transformation", "transgressions", "transliterated", "transliterates", "transmigrating", "transmigration", "transmogrified", "transmogrifies", "transmutations", "transnationals", "transparencies", "transportation", "transpositions", "troubleshooted", "troubleshooter", "trustworthiest", "ultrasonically", "unacknowledged", "unappreciative", "unapproachable", "unattractively", "uncompromising", "unconscionable", "unconscionably", "uncontaminated", "uncontrollable", "uncontrollably", "unconventional", "unconvincingly", "uncorroborated", "undecipherable", "underachievers", "underachieving", "undercarriages", "underdeveloped", "underestimated", "underestimates", "undergraduates", "undermentioned", "undernourished", "undersecretary", "understandable", "understandably", "understandings", "understatement", "undesirability", "unenthusiastic", "unexpectedness", "unfaithfulness", "unfriendliness", "ungratefulness", "unhesitatingly", "unidentifiable", "unidirectional", "unintelligible", "unintelligibly", "unmentionables", "unpleasantness", "unpremeditated", "unprofessional", "unquestionable", "unquestionably", "unsatisfactory", "unscrupulously", "unsuccessfully", "unsurprisingly", "utilitarianism", "valedictorians", "ventriloquists", "verisimilitude", "videocassettes", "vindictiveness", "vivisectionist", "voluptuousness", "weathercocking", "weatherproofed", "weightlessness", "whippersnapper", "wholeheartedly" }; const char* w_15[] = { "acclimatisation", "acclimatization", "accomplishments", "acquisitiveness", "administrations", "aerodynamically", "agriculturalist", "ambassadorships", "anthropocentric", "anthropological", "anthropologists", "anthropomorphic", "antidepressants", "antiperspirants", "apprenticeships", "appropriateness", "architecturally", "aromatherapists", "astrophysicists", "atherosclerosis", "atmospherically", "authentications", "authoritatively", "autobiographies", "bacteriological", "bacteriologists", "bibliographical", "bloodthirstiest", "cardiopulmonary", "characteristics", "chronologically", "cinematographer", "circumlocutions", "circumnavigated", "circumnavigates", "circumscription", "circumstantials", "classifications", "collaboratively", "commissionaires", "compassionately", "competitiveness", "comprehensively", "computationally", "concessionaires", "condescendingly", "confectioneries", "confidentiality", "confrontational", "conglomerations", "congratulations", "conscientiously", "consciousnesses", "consequentially", "conservationist", "conspicuousness", "constitutionals", "contemplatively", "contemporaneous", "contentiousness", "controversially", "conventionality", "correspondences", "correspondingly", "counterargument", "counterattacked", "counterbalanced", "counterbalances", "counterclaiming", "countercultures", "counterexamples", "countermeasures", "counterpointing", "crystallography", "daguerreotyping", "decommissioning", "deconstructions", "decontaminating", "decontamination", "demographically", "demonstrability", "demonstratively", "demystification", "desertification", "dessertspoonful", "destructiveness", "differentiating", "differentiation", "disadvantageous", "disappointingly", "disappointments", "disciplinarians", "discombobulated", "discombobulates", "disconcertingly", "discontinuances", "discontinuation", "discontinuities", "discountenanced", "discountenances", "discouragements", "disenfranchised", "disenfranchises", "disentanglement", "disestablishing", "disillusionment", "disinterestedly", "dispassionately", "disrespectfully", "dissatisfaction", "dissimilarities", "distastefulness", "distinctiveness", "distinguishable", "distributorship", "diversification", "educationalists", "electrification", "electrodynamics", "electromagnetic", "enfranchisement", "entrepreneurial", "environmentally", "epidemiological", "epidemiologists", "euphemistically", "excommunicating", "excommunication", "exemplification", "existentialists", "experimentation", "extracurricular", "extraordinaries", "extraordinarily", "flibbertigibbet", "flirtatiousness", "fundamentalists", "gastroenteritis", "gastronomically", "groundbreakings", "halfheartedness", "hallucinogenics", "hardheartedness", "heterosexuality", "horticulturists", "housemistresses", "humanitarianism", "hypercritically", "hyperventilated", "hyperventilates", "hypnotherapists", "identifications", "impecuniousness", "impenetrability", "implementations", "impossibilities", "impressionistic", "improbabilities", "inaccessibility", "inappropriately", "incompatibility", "incomprehension", "inconsequential", "inconsiderately", "inconsistencies", "inconspicuously", "inconveniencing", "incorrigibility", "indemnification", "indeterminately", "indissolubility", "individualistic", "industriousness", "ineffectiveness", "infinitesimally", "infrastructural", "infrastructures", "inquisitiveness", "insignificantly", "instantaneously", "instrumentalist", "instrumentality", "instrumentation", "insubordination", "insurrectionist", "intellectualism", "intelligibility", "intensification", "interchangeable", "interchangeably", "intercollegiate", "interconnecting", "interconnection", "interdependence", "internationally", "interpenetrated", "interpenetrates", "interpretations", "interrogatories", "interscholastic", "interventionism", "interventionist", "introspectively", "invulnerability", "lackadaisically", "levelheadedness", "maintainability", "meaninglessness", "mechanistically", "microbiological", "microbiologists", "microelectronic", "microprocessors", "microscopically", "millionairesses", "misapplications", "misapprehending", "misapprehension", "misappropriated", "misappropriates", "miscalculations", "mischievousness", "misconstruction", "misinterpreting", "misrepresenting", "multiplications", "multiprocessing", "nearsightedness", "nongovernmental", "noninterference", "nonintervention", "nonprescription", "nonprofessional", "nontransferable", "notwithstanding", "objectification", "obstructionists", "obstructiveness", "ophthalmologist", "overcompensated", "overcompensates", "oversimplifying", "oversubscribing", "palaeontologist", "paleontologists", "parenthetically", "parliamentarian", "parthenogenesis", "particularities", "perpendicularly", "personification", "pessimistically", "phantasmagorias", "pharmaceuticals", "pharmacological", "pharmacologists", "philanthropists", "philosophically", "phosphorescence", "photojournalism", "photojournalist", "phototypesetter", "physiologically", "physiotherapist", "picturesqueness", "plainclothesman", "plainclothesmen", "plenipotentiary", "polyunsaturated", "polyunsaturates", "preconditioning", "predispositions", "preregistration", "preservationist", "presuppositions", "pretentiousness", "preternaturally", "problematically", "procrastinating", "procrastination", "procrastinators", "professionalism", "prognosticating", "prognostication", "prognosticators", "prohibitionists", "proportionality", "proportionately", "proprietorially", "psychologically", "psychopathology", "psychotherapies", "psychotherapist", "punctiliousness", "purposelessness", "pusillanimously", "quadruplicating", "radiotelephones", "radiotherapists", "reafforestation", "reapportionment", "recapitulations", "recommendations", "reconciliations", "reconfiguration", "reconnaissances", "reconsideration", "reconstructions", "representations", "representatives", "resourcefulness", "retrospectively", "revolutionaries", "ritualistically", "sadomasochistic", "sanctimoniously", "segregationists", "sensationalists", "sentimentalists", "septuagenarians", "servomechanisms", "simplifications", "slaughterhouses", "sledgehammering", "straightforward", "straitjacketing", "substantiations", "superabundances", "superconductors", "superfluousness", "superintendence", "superintendency", "superintendents", "supernumeraries", "superstitiously", "superstructures", "supplementation", "surreptitiously", "syllabification", "sympathetically", "technologically", "teleconferenced", "teleconferences", "teletypewriters", "temperamentally", "tempestuousness", "tendentiousness", "therapeutically", "thoughtlessness", "tonsillectomies", "topographically", "totalitarianism", "traditionalists", "transfiguration", "transformations", "transliterating", "transliteration", "transmogrifying", "transplantation", "trigonometrical", "troubleshooters", "troubleshooting", "trustworthiness", "typographically", "tyrannosauruses", "unacceptability", "unauthenticated", "unceremoniously", "uncommunicative", "uncomplainingly", "uncomplimentary", "uncomprehending", "unconditionally", "unconsciousness", "uncontroversial", "undemonstrative", "underestimating", "underestimation", "underprivileged", "understandingly", "understatements", "undistinguished", "unexceptionable", "unimplementable", "unintentionally", "uninterruptedly", "unobjectionable", "unprecedentedly", "unprepossessing", "unpronounceable", "unquestioningly", "unrealistically", "unreconstructed", "unsophisticated", "unsportsmanlike", "unsubstantiated", "upperclasswoman", "upperclasswomen", "vivisectionists", "vulnerabilities", "weatherboarding", "weatherproofing", "whatchamacallit", "whippersnappers", "wrongheadedness" }; const char* w_16[] = { "acquaintanceship", "administratively", "agriculturalists", "antagonistically", "anthropomorphism", "apprehensiveness", "archaeologically", "aristocratically", "arteriosclerosis", "authoritarianism", "autobiographical", "bloodthirstiness", "bureaucratically", "cantankerousness", "catastrophically", "chauvinistically", "cinematographers", "circumnavigating", "circumnavigation", "circumscriptions", "circumstantially", "collaborationist", "conservationists", "conspiratorially", "constitutionally", "contraindication", "conversationally", "counterarguments", "counterattacking", "counterbalancing", "counterclockwise", "counterespionage", "counteroffensive", "creditworthiness", "crystallographic", "declassification", "dessertspoonfuls", "diagrammatically", "discombobulating", "discontinuations", "discountenancing", "disenfranchising", "disestablishment", "disfranchisement", "disproportionate", "disqualification", "distributorships", "electromagnetism", "enthusiastically", "entrepreneurship", "environmentalism", "environmentalist", "ethnographically", "excommunications", "exemplifications", "expressionlessly", "extemporaneously", "extracurriculars", "extraterrestrial", "extraterritorial", "flibbertigibbets", "gastrointestinal", "horticulturalist", "hydroelectricity", "hypersensitivity", "hyperventilating", "hyperventilation", "immunodeficiency", "imperturbability", "implausibilities", "impracticability", "inarticulateness", "incomprehensible", "incomprehensibly", "incontrovertible", "incontrovertibly", "incorruptibility", "indemnifications", "indiscriminately", "indispensability", "inextinguishable", "instrumentalists", "insurrectionists", "interconnections", "intercontinental", "internationalism", "internationalist", "interpenetrating", "interpenetration", "interventionists", "irresponsibility", "lightheartedness", "melodramatically", "methodologically", "microelectronics", "misapprehensions", "misappropriating", "misappropriation", "misconstructions", "mispronunciation", "misunderstanding", "multiculturalism", "multidimensional", "multifariousness", "multimillionaire", "neurotransmitter", "nonprofessionals", "nonproliferation", "obstreperousness", "ophthalmologists", "orthographically", "overcompensating", "overcompensation", "overenthusiastic", "palaeontologists", "paraprofessional", "parliamentarians", "personifications", "phantasmagorical", "phenomenological", "photographically", "photojournalists", "phototypesetting", "physiotherapists", "praiseworthiness", "predetermination", "preservationists", "presumptuousness", "prognostications", "psychotherapists", "quintessentially", "rambunctiousness", "reinterpretation", "representational", "responsibilities", "schoolmistresses", "semiprofessional", "shortsightedness", "straightforwards", "superciliousness", "susceptibilities", "teleconferencing", "thermostatically", "tintinnabulation", "transcendentally", "transcontinental", "transliterations", "uncharacteristic", "uncompromisingly", "unconstitutional", "unconventionally", "underachievement", "underestimations", "undernourishment", "undersecretaries", "undiscriminating", "unpredictability", "unprofessionally", "unreasonableness", "unrepresentative", "unscrupulousness", "whatchamacallits" }; const char* w_17[] = { "anachronistically", "authoritativeness", "circumnavigations", "comprehensibility", "comprehensiveness", "conscientiousness", "constitutionalism", "constitutionality", "contemporaneously", "contradistinction", "contraindications", "conversationalist", "counterinsurgency", "counteroffensives", "counterproductive", "counterrevolution", "deconstructionism", "deconstructionist", "disadvantageously", "disproportionated", "disproportionates", "disqualifications", "electrocardiogram", "environmentalists", "extraterrestrials", "horticulturalists", "inappropriateness", "incompatibilities", "inconsequentially", "inconsiderateness", "inconspicuousness", "indestructibility", "indistinguishable", "interdepartmental", "interdisciplinary", "intergovernmental", "internationalists", "interrelationship", "kaleidoscopically", "maladministration", "materialistically", "misappropriations", "misinterpretation", "mispronunciations", "misrepresentation", "misunderstandings", "multimillionaires", "neurotransmitters", "nondenominational", "opportunistically", "paraprofessionals", "philanthropically", "plenipotentiaries", "reinterpretations", "sanctimoniousness", "semiprofessionals", "socioeconomically", "straightforwardly", "superconductivity", "surreptitiousness", "telecommunication", "tintinnabulations", "transcendentalism", "transcendentalist", "ultraconservative", "uncomprehendingly", "videoconferencing" }; const char* w_18[] = { "characteristically", "chlorofluorocarbon", "contradistinctions", "conversationalists", "counterrevolutions", "deconstructionists", "disenfranchisement", "disproportionately", "disproportionating", "electrocardiograms", "electrocardiograph", "hypersensitivities", "interchangeability", "intercommunication", "interrelationships", "misinterpretations", "misrepresentations", "oversimplification", "psychoanalytically", "telecommunications", "transcendentalists", "transubstantiation", "ultraconservatives", "unconstitutionally" }; const char* w_19[] = { "chlorofluorocarbons", "counterintelligence", "electrocardiographs", "incomprehensibility", "individualistically", "interdenominational", "nonrepresentational", "oversimplifications", "straightforwardness" }; const char* w_20[] = { "counterrevolutionary", "electroencephalogram", "uncharacteristically" }; const char* w_21[] = { "electroencephalograms", "electroencephalograph" }; const char* w_22[] = { "counterrevolutionaries", "electroencephalographs" }; /// Maximal word length const unsigned int max_word_len = 22; /// Number of words per given length const int n_words[] = { 1, 26, 66, 633, 2443, 4763, 7585, 10380, 10974, 9724, 7704, 5313, 3361, 1905, 849, 405, 162, 67, 24, 9, 3, 2, 2 }; /// Dictionary of all word lists const char** s_words[] = { &w_0[0], &w_1[0], &w_2[0], &w_3[0], &w_4[0], &w_5[0], &w_6[0], &w_7[0], &w_8[0], &w_9[0], &w_10[0], &w_11[0], &w_12[0], &w_13[0], &w_14[0], &w_15[0], &w_16[0], &w_17[0], &w_18[0], &w_19[0], &w_20[0], &w_21[0], &w_22[0] }; } inline FileSizeOptions::FileSizeOptions(const char* s) : Gecode::SizeOptions(s), _file("-file","file name of dictionary") { add(_file); } inline const char* FileSizeOptions::file(void) const { return _file.value(); } inline Dictionary::Dictionary(void) : max_len(0), n_all_words(0), chunk(NULL) { for (int i=max_len; i--; ) { n_words[i]=0; s_words[i]=NULL; } } inline void Dictionary::init(const char* fn) { if (fn == NULL) { // Initialize from predefined dictionary // Set up information max_len = ::max_word_len; n_all_words = 0; size_t sz = 0; for (int l=max_len+1; l--; ) { n_words[l]=::n_words[l]; n_all_words += n_words[l]; sz += n_words[l] * (l+1); // Leave room for terminating zero } chunk = static_cast(Gecode::heap.ralloc(sz)); // Copy words char* c = chunk; for (int l=max_len+1; l--; ) { s_words[l] = c; for (int i=n_words[l]; i--; ) { for (int j=0; j= limit_len) goto skip1; for (int i=s.size(); i--; ) if (!isalpha(s[i]) || !islower(s[i])) goto skip1; // Found a legal word n_all_words++; n_words[s.size()]++; sz += s.size()+1; if (max_len < s.size()) max_len = s.size(); skip1: ; } f.close(); } chunk = static_cast(Gecode::heap.ralloc(sz)); { // Initialize start information in chunk char* c = chunk; for (unsigned int l=0; l<=max_len; l++) { s_words[l] = c; c += (l+1)*n_words[l]; } } { std::string s; std::ifstream f; f.open(fn); if (!f.is_open()) throw Gecode::Exception("Dictionary", "Unable to open file"); while (!f.eof()) { getline(f,s); if (s.size() >= limit_len) goto skip2; for (int i=s.size(); i--; ) if (!isalpha(s[i]) || !islower(s[i])) goto skip2; // Found a legal word, copy it for (unsigned int i=0; i(l) > max_len) ? 0 : n_words[l]; } inline const char* Dictionary::word(int l, int i) const { return s_words[l]+i*(l+1); } template std::basic_ostream& Dictionary::print(std::basic_ostream& os) const { os << "Total number of words: " << n_all_words << std::endl << "Maximal length: " << max_len << std::endl; for (int i=1; i<=max_len; i++) os << "\t#words of length " << i << ": " << n_words[i] << std::endl; return os; } template inline std::basic_ostream& operator <<(std::basic_ostream& os, const Dictionary& d) { return d.print(os); } inline Dictionary::~Dictionary(void) { Gecode::heap.rfree(chunk); } // STATISTICS: example-ignore /* * The original SCOWL README: * * Spell Checking Oriented Word Lists (SCOWL) * Revision 6 * August 10, 2004 * by Kevin Atkinson * * The SCOWL is a collection of word lists split up in various sizes, and * other categories, intended to be suitable for use in spell checkers. * However, I am sure it will have numerous other uses as well. * * The latest version can be found at http://wordlist.sourceforge.net/ * * The directory final/ contains the actual word lists broken up into * various sizes and categories. The r/ directory contains Readmes from * the various sources used to create this package. * * The other directories contain the necessary information to recreate the * word lists from the raw data. Unless you are interested in improving the * words lists you should not need to worry about what's here. See the * section on recreating the words lists for more information on what's * there. * * Except for the special word lists the files follow the following * naming convention: * -. * Where the spelling category is one of * english, american, british, british_z, canadian, * variant_0, varaint_1, variant_2 * Classification is one of * abbreviations, contractions, proper-names, upper, words * And size is one of * 10, 20, 35 (small), 40, 50 (medium), 55, 60, 70 (large), * 80 (huge), 95 (insane) * The special word lists follow are in the following format: * special-. * Where description is one of: * roman-numerals, hacker * * When combining the words lists the "english" spelling category should * be used as well as one of "american", "british", "british_z" (british * with ize spelling), or "canadian". Great care has been taken so that * that only one spelling for any particular word is included in the main * list. When two variants were considered equal I randomly picked one * for inclusion in the main word list. Unfortunately this means that my * choice in how to spell a word may not match your choice. If this is * the case you can try including the "variant_0" spelling category which * includes most variants which are considered almost equal. The * "variant_1" spelling category include variants which are also * generally considered acceptable, and "variant_2" contains variants * which are seldom used. * * The "abbreviation" category includes abbreviations and acronyms which * are not also normal words. The "contractions" category should be self * explanatory. The "upper" category includes upper case words and proper * names which are common enough to appear in a typical dictionary. The * "proper-names" category included all the additional uppercase words. * Final the "words" category contains all the normal English words. * * To give you an idea of what the words in the various sizes look like * here is a sample of 25 random words found only in that size: * * 10: began both buffer cause collection content documenting easiest * equally examines expecting first firstly hence inclining * irrelevant justified little logs necessarily ought sadly six * thing visible * * 20: chunks commodity contempt contexts cruelty crush dictatorship * disgusted dose elementary evolved frog god hordes notion overdraft * overlong overlook phoning poster recordings sand skull substituted * throughput * * 35: aliasing blackouts blowout bluntness corroborated derrick * dredging elopements entrancing excising fellowship flagpole * germination glimpse gondola guidebook madams minimalism minnows * partisans petitions shelling swarmed throng welding * * 40: altercation blender castigation chump coffeehouse determiners * doggoning exhibitor finders flophouse gazebo lumbering masochism * mopeds poetically pubic refinance reggae scragglier softhearted * stubbornness teargassed township underclassman whoosh * * 50: accumulative adulterant allegorically amorousness astrophysics * camphor coif dickey elusiveness enviousness fakers fetishistic * flippantly headsets liefs midyears myna pacification persiflage * phosphoric pinhole sappy seres unrealistically unworldly * * 55: becquerel brickie centralist cine conveyancing courgette * disarmingly garçon gobstopper infilling insipidity * internationalist kabuki lyrebirds obscurantism rejigged * revisionist satsuma slapper sozzled sublieutenants teletext vino * wellness wracking * * 60: absorber acceptableness adventurousness antifascists arrhythmia * audiology cartage cruses fontanel forelimbs granter hairlike * installers jugglery lappets libbers mandrels micrometeorite * mineshaft reconsecrates saccharides smellable spavined sud timbrel * * 70: atomisms benedict carven coxa cyanite detraining diazonium * dogberry dogmatics entresol fatherlessnesses firestone imprecator * laterality legitimisms maxwell microfloppies nonteaching pelerine * pentane pestiferousness piscator profascist tusche twirp * * 80: cotransfers embrangled forkednesses giftwrapped globosity hatpegs * hepsters hermitess interspecific inurbanities lamiae * literaehumaniores literatures masulas misbegun plook prerupt * quaalude rosanilin sabbatism scowder subreptive thumbstalls * understrata yakows * * 95: anatropal anientise bakshi brouzes corsie daimiote dhaw dislikened * ectoretina fortuitisms guardeen hyperlithuria nonanachronistic * overacceleration pamphletic parma phytolith starvedly * trophoplasmic ulorrhagia undared undertide unplunderously * unworkmanly vasoepididymostomy * * And here is a rough count on the number of words in the "english" * spelling category for each size: * * Size Words Proper Names Running Total * * 10 5,000 5,000 * 20 8,700 14,000 * 35 34,500 200 48,000 * 40 6,000 500 55,000 * 50 23,200 17,200 95,000 * 55 7,500 103,000 * 60 16,000 12,800 132,000 * 70 45,100 34,300 211,000 * 80 137,000 30,400 379,000 * 95 198,000 51,800 628,000 * * (The "Words" column does not include the proper name count.) * * Size 35 is the recommended small size, 50 the medium and 70 the large. * Sizes 70 and below contain words found in most dictionaries while the * 80 size contains all the strange and unusual words people like to use * in word games such as Scrabble (TM). While a lot of the the words in * the 80 size are not used very often, they are all generally considered * valid words in the English language. The 95 contains just about every * English word in existence and then some. Many of the words at the 95 * level will probally not be considered valid english words by most * people. I don't recommend anyone use levels above 70 for spell * checking as they contain rarely used words which can hide misspellings * of similar more commonly used words. For example the word "ort" can * hide a common typo of "or". No one should need to use a size larger * than 80, the 95 size is labeled insane for a reason. * * Accents are present on certain words such as café in iso8859-1 format. * * CHANGES: * * From Revision 5 to 6 (August 10, 2004) * * Updated to version 4.0 of the 12dicts package. * * Included the 3esl, 2of4brif, and 5desk list from the new 12dicts * package. The 3esl was included in the 40 size, the 2of4brif in the * 55 size and the 5desk in the 70 size. * * Removed the Ispell word list as it was a source of too many errors. * This eliminated the 65 size. * * Removed clause 4 from the Ispell copyright with permission of Geoff * Kuenning. * * Updated to version 4.1 of VarCon. * * Added the "british_z" spelling category which it British using the * "ize" spelling. * * From Revision 4a to 5 (January 3, 2002) * * Added variants that were not really spelling variants (such as * forwards) back into the main list. * * Fixed a bug which caused variants of words to incorrectly appear in * the non-variant lists. * * Moved rarly used inflections of a word into higher number lists. * * Added other inflections of a words based on the following criteria * If the word is in the base form: only include that word. * If the word is in a plural form: include the base word and the plural * If the word is a verb form (other than plural): include all verb forms * If the word is an ad* form: include all ad* forms * If the word is in a possessive form: also include the non-possessive * * Updated to the latest version of many of the source dictionaries. * * Removed the DEC Word List due to the questionable licence and * because removing it will not seriously decrese the quality of SCOWL * (there are a few less proper names). * * From Revision 4 to 4a (April 4, 2001) * * Reran the scripts on a never version of AGID (3a) which fixes a bug * which caused some common words to be improperly marked as variants. * * From Revision 3 to 4 (January 28, 2001) * * Split the variant "spelling category" up into 3 different levels. * * Added words in the Ispell word list at the 65 level. * * Other changes due to using more recent versions of various sources * included a more accurete version of AGID thanks to the word of * Alan Beale * * From Revision 2 to 3 (August 18, 2000) * * Renamed special-unix-terms to special-hacker and added a large * number of communly used words within the hacker (not cracker) * community. * * Added a couple more signature words including "newbie". * * Minor changes due to changes in the inflection database. * * From Revision 1 to 2 (August 5, 2000) * * Moved the male and female name lists from the mwords package and the * DEC name lists form the 50 level to the 60 level and moved Alan's * name list from the 60 level to the 50 level. Also added the top * 1000 male, female, and last names from the 1990 Census report to the * 50 level. This reduced the number of names in the 50 level from * 17,000 to 7,000. * * Added a large number of Uppercase words to the 50 level. * * Properly accented the possessive form of some words. * * Minor other changes due to changes in my raw data files which have * not been released yet. Email if you are interested in these files. * * COPYRIGHT, SOURCES, and CREDITS: * * The collective work is Copyright 2000-2004 by Kevin Atkinson as well * as any of the copyrights mentioned below: * * Copyright 2000-2004 by Kevin Atkinson * * Permission to use, copy, modify, distribute and sell these word * lists, the associated scripts, the output created from the scripts, * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appears in all copies and * that both that copyright notice and this permission notice appear in * supporting documentation. Kevin Atkinson makes no representations * about the suitability of this array for any purpose. It is provided * "as is" without express or implied warranty. * * Alan Beale also deserves special credit as he has, * in addition to providing the 12Dicts package and being a major * contributor to the ENABLE word list, given me an incredible amount of * feedback and created a number of special lists (those found in the * Supplement) in order to help improve the overall quality of SCOWL. * * The 10 level includes the 1000 most common English words (according to * the Moby (TM) Words II [MWords] package), a subset of the 1000 most * common words on the Internet (again, according to Moby Words II), and * frequently class 16 from Brian Kelk's "UK English Wordlist * with Frequency Classification". * * The MWords package was explicitly placed in the public domain: * * The Moby lexicon project is complete and has * been place into the public domain. Use, sell, * rework, excerpt and use in any way on any platform. * * Placing this material on internal or public servers is * also encouraged. The compiler is not aware of any * export restrictions so freely distribute world-wide. * * You can verify the public domain status by contacting * * Grady Ward * 3449 Martha Ct. * Arcata, CA 95521-4884 * * grady@netcom.com * grady@northcoast.com * * The "UK English Wordlist With Frequency Classification" is also in the * Public Domain: * * Date: Sat, 08 Jul 2000 20:27:21 +0100 * From: Brian Kelk * * > I was wondering what the copyright status of your "UK English * > Wordlist With Frequency Classification" word list as it seems to * > be lacking any copyright notice. * * There were many many sources in total, but any text marked * "copyright" was avoided. Locally-written documentation was one * source. An earlier version of the list resided in a filespace called * PUBLIC on the University mainframe, because it was considered public * domain. * * Date: Tue, 11 Jul 2000 19:31:34 +0100 * * > So are you saying your word list is also in the public domain? * * That is the intention. * * The 20 level includes frequency classes 7-15 from Brian's word list. * * The 35 level includes frequency classes 2-6 and words appearing in at * least 11 of 12 dictionaries as indicated in the 12Dicts package. All * words from the 12Dicts package have had likely inflections added via * my inflection database. * * The 12Dicts package and Supplement is in the Public Domain. * * The WordNet database, which was used in the creation of the * Inflections database, is under the following copyright: * * This software and database is being provided to you, the LICENSEE, * by Princeton University under the following license. By obtaining, * using and/or copying this software and database, you agree that you * have read, understood, and will comply with these terms and * conditions.: * * Permission to use, copy, modify and distribute this software and * database and its documentation for any purpose and without fee or * royalty is hereby granted, provided that you agree to comply with * the following copyright notice and statements, including the * disclaimer, and that the same appear on ALL copies of the software, * database and documentation, including modifications that you make * for internal use or for distribution. * * WordNet 1.6 Copyright 1997 by Princeton University. All rights * reserved. * * THIS SOFTWARE AND DATABASE IS PROVIDED "AS IS" AND PRINCETON * UNIVERSITY MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR * IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PRINCETON * UNIVERSITY MAKES NO REPRESENTATIONS OR WARRANTIES OF MERCHANT- * ABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE * LICENSED SOFTWARE, DATABASE OR DOCUMENTATION WILL NOT INFRINGE ANY * THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. * * The name of Princeton University or Princeton may not be used in * advertising or publicity pertaining to distribution of the software * and/or database. Title to copyright in this software, database and * any associated documentation shall at all times remain with * Princeton University and LICENSEE agrees to preserve same. * * The 40 level includes words from Alan's 3esl list found in version 4.0 * of his 12dicts package. Like his other stuff the 3esl list is also in the * public domain. * * The 50 level includes Brian's frequency class 1, words words appearing * in at least 5 of 12 of the dictionaries as indicated in the 12Dicts * package, and uppercase words in at least 4 of the previous 12 * dictionaries. A decent number of proper names is also included: The * top 1000 male, female, and Last names from the 1990 Census report; a * list of names sent to me by Alan Beale; and a few names that I added * myself. Finally a small list of abbreviations not commonly found in * other word lists is included. * * The name files form the Census report is a government document which I * don't think can be copyrighted. * * The file special-jargon.50 uses common.lst and word.lst from the * "Unofficial Jargon File Word Lists" which is derived from "The Jargon * File". All of which is in the Public Domain. This file also contain * a few extra UNIX terms which are found in the file "unix-terms" in the * special/ directory. * * The 55 level includes words from Alan's 2of4brif list found in version * 4.0 of his 12dicts package. Like his other stuff the 2of4brif is also * in the public domain. * * The 60 level includes Brian's frequency class 0 and all words * appearing in at least 2 of the 12 dictionaries as indicated by the * 12Dicts package. A large number of names are also included: The 4,946 * female names and the 3,897 male names from the MWords package. * * The 70 level includes the 74,550 common dictionary words and the * 21,986 names list from the MWords package The common dictionary words, * like those from the 12Dicts package, have had all likely inflections * added. The 70 level also included the 5desk list from version 4.0 of * the 12Dics package which is the public domain * * The 80 level includes the ENABLE word list, all the lists in the * ENABLE supplement package (except for ABLE), the "UK Advanced Cryptics * Dictionary" (UKACD), the list of signature words in from YAWL package, * and the 10,196 places list from the MWords package. * * The ENABLE package, mainted by M\Cooper , * is in the Public Domain: * * The ENABLE master word list, WORD.LST, is herewith formally released * into the Public Domain. Anyone is free to use it or distribute it in * any manner they see fit. No fee or registration is required for its * use nor are "contributions" solicited (if you feel you absolutely * must contribute something for your own peace of mind, the authors of * the ENABLE list ask that you make a donation on their behalf to your * favorite charity). This word list is our gift to the Scrabble * community, as an alternate to "official" word lists. Game designers * may feel free to incorporate the WORD.LST into their games. Please * mention the source and credit us as originators of the list. Note * that if you, as a game designer, use the WORD.LST in your product, * you may still copyright and protect your product, but you may *not* * legally copyright or in any way restrict redistribution of the * WORD.LST portion of your product. This *may* under law restrict your * rights to restrict your users' rights, but that is only fair. * * UKACD, by J Ross Beresford , is under the * following copyright: * * Copyright (c) J Ross Beresford 1993-1999. All Rights Reserved. * * The following restriction is placed on the use of this publication: * if The UK Advanced Cryptics Dictionary is used in a software package * or redistributed in any form, the copyright notice must be * prominently displayed and the text of this document must be included * verbatim. * * There are no other restrictions: I would like to see the list * distributed as widely as possible. * * The 95 level includes the 354,984 single words and 256,772 compound * words from the MWords package, ABLE.LST from the ENABLE Supplement, * and some additional words found in my part-of-speech database that * were not found anywhere else. * * Accent information was taken from UKACD. * * My VARCON package was used to create the American, British, and * Canadian word list. * * Since the original word lists used used in the VARCON package came * from the Ispell distribution they are under the Ispell copyright: * * Copyright 1993, Geoff Kuenning, Granada Hills, CA * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All modifications to the source code must be clearly marked as * such. Binary redistributions based on modified source code * must be clearly marked as modified versions in the documentation * and/or other materials provided with the distribution. * (clause 4 removed with permission from Geoff Kuenning) * 5. The name of Geoff Kuenning may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY GEOFF KUENNING AND CONTRIBUTORS ``AS * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GEOFF * KUENNING OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * The variant word lists were created from a list of variants found in * the 12dicts supplement package as well as a list of variants I created * myself. * * The Readmes for the various packages used can be found in the * appropriate directory under the r/ directory. * * FUTURE PLANS: * * There is a very nice frequency analyse of the BNC corpus done by * Adam Kilgarriff. Unlike Brain's word lists the BNC lists include part * of speech information. I plan on somehow using these lists as Adam * Kilgarriff has given me the OK to use it in SCOWL. These lists will * greatly reduce the problem of inflected forms of a word appearing at * different levels due to the part-of-speech information. * * I also plan on perhaps putting the data in a database and use SQL * queries to create the wordlists instead of tons of "sort"s, "comm"s, * and Perl scripts. * * RECREATING THE WORD LISTS: * * In order to recreate the word lists you need a modern version of * Perl, bash, the traditional set of shell utilities, a system that * supports symbolic links, and quite possibly GNU Make. Once you * have downloaded all the necessary raw data in the r/ directory you * should be able to type "rm -r final && mkdir final && make all" and * the word lists in the final/ directory should be recreated. If you * have any problems fell free to contact me; however, unless you are * interested in improving the scripts used, I will likely ignore you * as there should be little need for anyone not interested in * improving the word list to do so. * * The src/ directory contains the numerous scripts used in the creation * of the final product. * * The r/ directory contains the raw data used to * create the final product. In order for the scripts to work various * word lists and databases need to be created and put into this * directory. See the README file in the r/ directory for more * information. * * The l/ directory contains symbolic links used by the actual scripts. * * Finally, the working/ directory is where all the intermittent files go * that are not specific to one source. * */ gecode-4.2.1/examples/sports-league.cpp0000644000175000010010000002275012166527420017210 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Patrick Pekczynski * * Contributing authors: * Christian Schulte * * Copyright: * Patrick Pekczynski, 2004 * Christian Schulte, 2007 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include #include using namespace Gecode; /// Entry in round robin schedule class Play { public: int h; ///< home team int a; ///< away team int g; ///< game number /// Default constructor Play(void) : h(0), a(0), g(0) {} }; /// Round robin schedule class RRS { protected: /// Number of teams const int teams; /// Play information Play* plays; /// Return number of weeks int weeks(void) const { return teams-1; } /// Return number of periods int periods(void) const { return teams/2; } /// Game number for game between home team \a h and away team \a a int gn(int h, int a) const { return teams*(h-1) + a; } /// Play for period \a p and week \a w Play& play(int p, int w) { return plays[p*weeks() + w]; } public: /** * \brief Build a feasible schedule * * The games of the first week are fixed as: * \f$ \langle 1,2 \rangle \cup * \{\langle p + 2, t - p + 1\rangle | p \geq 1\}\f$. \n * The remaining games are computed by transforming a game * \f$ \langle h, a, g \rangle \f$ from the previous week * in a new game \f$ \langle h', a'\rangle \f$, where: \n * \f$ h' = \left\{ * \begin{tabular}{l c l} * 1 & & if $h = 1$ \\ * 2 & & if $h = t$ \\ * $h + 1$ & & otherwise * \end{tabular}\right. * \f$ and * \f$ a' = \left\{ * \begin{tabular}{l c l} * 2 & & if $h = t$ \\ * a + 1 & & otherwise * \end{tabular}\right. * \f$ * * */ RRS(int t) : teams(t), plays(new Play[periods()*weeks()]) { // Determine the first game (week 0 period 0) play(0,0).h = 1; play(0,0).a = 2; play(0,0).g = 2; // Determine the other games of the first week for (int p=1; p play(p,w).a) std::swap(play(p,w).h,play(p,w).a); play(p,w).g = gn(play(p,w).h,play(p,w).a); } } } /// Home, away, and game information void hag(int w, IntArgs& h, IntArgs& a, IntArgs& g) { for (int p=0; p(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/steel-mill.cpp0000644000175000010010000005012212166527420016457 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Mikael Lagerkvist * * Copyright: * Mikael Lagerkvist, 2008 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include using namespace Gecode; /** \brief Order-specifications * * Used in the \ref SteelMill example. * */ //@{ typedef int (*order_t)[2]; ///< Type of the order-specification extern const int order_weight; ///< Weight-position in order-array elements extern const int order_color; ///< Color-position in order-array elements //@} /** \brief Constants for CSPLib instance of the Steel Mill Slab Design Problem. * * Used in the \ref SteelMill example. */ //@{ extern int csplib_capacities[]; ///< Capacities extern unsigned int csplib_ncapacities; ///< Number of capacities extern unsigned int csplib_maxcapacity; ///< Maximum capacity extern int csplib_loss[]; ///< Loss for all sizes extern int csplib_orders[][2]; ///< Orders extern unsigned int csplib_ncolors; ///< Number of colors extern unsigned int csplib_norders; ///< Number of orders //@} /** \brief %SteelMillOptions for examples with size option and an additional * optional file name parameter. * * Used in the \ref SteelMill example. */ class SteelMillOptions : public Options { private: unsigned int _size; ///< Size value int* _capacities; ///< Capacities int _ncapacities; ///< Number of capacities int _maxcapacity; ///< Maximum capacity int* _loss; ///< Loss for all sizes order_t _orders; ///< Orders int _ncolors; ///< Number of colors unsigned int _norders; ///< Number of orders public: /// Initialize options for example with name \a n SteelMillOptions(const char* n) : Options(n), _size(csplib_norders), _capacities(csplib_capacities), _ncapacities(csplib_ncapacities), _maxcapacity(csplib_maxcapacity), _loss(csplib_loss), _orders(&(csplib_orders[0])), _ncolors(csplib_ncolors), _norders(csplib_norders) {} /// Print help text virtual void help(void); /// Parse options from arguments \a argv (number is \a argc) bool parse(int& argc, char* argv[]); /// Return size unsigned int size(void) const { return _size; } /// Return capacities int* capacities(void) const { return _capacities; } /// Return number of capacities int ncapacities(void) const { return _ncapacities; } /// Return maximum of capacities int maxcapacity(void) const { return _maxcapacity; } /// Return loss values int* loss(void) const { return _loss; } /// Return orders order_t orders(void) const { return _orders; } /// Return number of colors int ncolors(void) const { return _ncolors; } /// Return number of orders int norders(void) const { return _norders; } }; /// Sort orders by weight class SortByWeight { public: /// The orders order_t orders; /// Initialize orders SortByWeight(order_t _orders) : orders(_orders) {} /// Sort order bool operator() (int i, int j) { // Order i comes before order j if the weight of i is larger than // the weight of j. return (orders[i][order_weight] > orders[j][order_weight]) || (orders[i][order_weight] == orders[j][order_weight] && iCSPLib). The model is from Gargani * and Refalo, "An efficient model and strategy for the steel mill * slab design problem.", CP 2007, except that a decomposition of the * packing constraint is used. The symmetry-breaking search is from * Van Hentenryck and Michel, "The Steel Mill Slab Design Problem * Revisited", CPAIOR 2008. * * The program accepts an optional argument for a data-file containing * an instance of the problem. The format for the data-file is the following: *
 * "number of slab capacities" "sequence of capacities in increasing order"
 * "number of colors"
 * "number of orders"
 * "size order 1" "color of order 1"
 * "size order 2" "color of order 2"
 * ...
 * 
* Hard instances are available from * http://becool.info.ucl.ac.be/steelmillslab. * * \ingroup Example * */ class SteelMill : public IntMinimizeScript { protected: /** \name Instance specification */ //@{ int* capacities; ///< Capacities int ncapacities; ///< Number of capacities int maxcapacity; ///< Maximum capacity int* loss; ///< Loss for all sizes int ncolors; ///< Number of colors order_t orders; ///< Orders unsigned int norders; ///< Number of orders unsigned int nslabs; ///< Number of slabs //@} /** \name Problem variables */ //@{ IntVarArray slab, ///< Slab assigned to order i slabload, ///< Load of slab j slabcost; ///< Cost of slab j IntVar total_cost; ///< Total cost //@} public: /// Branching variants enum { SYMMETRY_NONE, ///< Simple symmetry SYMMETRY_BRANCHING, ///< Breaking symmetries with symmetry SYMMETRY_LDSB ///< Use LDSB for symmetry breaking }; /// Actual model SteelMill(const SteelMillOptions& opt) : // Initialize instance data capacities(opt.capacities()), ncapacities(opt.ncapacities()), maxcapacity(opt.maxcapacity()), loss(opt.loss()), ncolors(opt.ncolors()), orders(opt.orders()), norders(opt.size()), nslabs(opt.size()), // Initialize problem variables slab(*this, norders, 0,nslabs-1), slabload(*this, nslabs, 0,45), slabcost(*this, nslabs, 0, Int::Limits::max), total_cost(*this, 0, Int::Limits::max) { // Boolean variables for slab[o]==s BoolVarArgs boolslab(norders*nslabs); for (unsigned int i = 0; i < norders; ++i) { BoolVarArgs tmp(nslabs); for (int j = nslabs; j--; ) { boolslab[j + i*nslabs] = tmp[j] = BoolVar(*this, 0, 1); } channel(*this, tmp, slab[i]); } // Packing constraints for (unsigned int s = 0; s < nslabs; ++s) { IntArgs c(norders); BoolVarArgs x(norders); for (int i = norders; i--; ) { c[i] = orders[i][order_weight]; x[i] = boolslab[s + i*nslabs]; } linear(*this, c, x, IRT_EQ, slabload[s]); } // Redundant packing constraint int totalweight = 0; for (unsigned int i = norders; i-- ; ) totalweight += orders[i][order_weight] ; linear(*this, slabload, IRT_EQ, totalweight); // Color constraints IntArgs nofcolor(ncolors); for (int c = ncolors; c--; ) { nofcolor[c] = 0; for (int o = norders; o--; ) { if (orders[o][order_color] == c) nofcolor[c] += 1; } } BoolVar f(*this, 0, 0); for (unsigned int s = 0; s < nslabs; ++s) { BoolVarArgs hascolor(ncolors); for (int c = ncolors; c--; ) { if (nofcolor[c]) { BoolVarArgs hasc(nofcolor[c]); int pos = 0; for (int o = norders; o--; ) { if (orders[o][order_color] == c) hasc[pos++] = boolslab[s + o*nslabs]; } assert(pos == nofcolor[c]); hascolor[c] = BoolVar(*this, 0, 1); rel(*this, BOT_OR, hasc, hascolor[c]); } else { hascolor[c] = f; } } linear(*this, hascolor, IRT_LQ, 2); } // Compute slabcost IntArgs l(maxcapacity, loss); for (int s = nslabs; s--; ) { element(*this, l, slabload[s], slabcost[s]); } linear(*this, slabcost, IRT_EQ, total_cost); // Add branching if (opt.symmetry() == SYMMETRY_BRANCHING) { // Symmetry breaking branching SteelMillBranch::post(*this); } else if (opt.symmetry() == SYMMETRY_NONE) { branch(*this, slab, INT_VAR_MAX_MIN(), INT_VAL_MIN()); } else { // opt.symmetry() == SYMMETRY_LDSB // There is one symmetry: the values (slabs) are interchangeable. Symmetries syms; syms << ValueSymmetry(IntArgs::create(nslabs,0)); // For variable order we mimic the custom brancher. We use // min-size domain, breaking ties by maximum weight (preferring // to label larger weights earlier). To do this, we first sort // (stably) by maximum weight, then use min-size domain. SortByWeight sbw(orders); IntArgs indices(norders); for (unsigned int i = 0 ; i < norders ; i++) indices[i] = i; Support::quicksort(&indices[0],norders,sbw); IntVarArgs sorted_orders(norders); for (unsigned int i = 0 ; i < norders ; i++) { sorted_orders[i] = slab[indices[i]]; } branch(*this, sorted_orders, INT_VAR_SIZE_MIN(), INT_VAL_MIN(), syms); } } /// Print solution virtual void print(std::ostream& os) const { os << "What slab=" << slab << std::endl; os << "Slab load=" << slabload << std::endl; os << "Slab cost=" << slabcost << std::endl; os << "Total cost=" << total_cost << std::endl; int nslabsused = 0; int nslabscost = 0; bool unassigned = false; for (int i = nslabs; i--; ) { if (!slabload[i].assigned() || !slabcost[i].assigned()) { unassigned = true; break; } if (slabload[i].min()>0) ++nslabsused; if (slabcost[i].min()>0) ++nslabscost; } if (!unassigned) os << "Number of slabs used=" << nslabsused << ", slabs with cost=" << nslabscost << std::endl; os << std::endl; } /// Constructor for cloning \a s SteelMill(bool share, SteelMill& s) : IntMinimizeScript(share,s), capacities(s.capacities), ncapacities(s.ncapacities), maxcapacity(s.maxcapacity), loss(s.loss), ncolors(s.ncolors), orders(s.orders), norders(s.norders), nslabs(s.nslabs) { slab.update(*this, share, s.slab); slabload.update(*this, share, s.slabload); slabcost.update(*this, share, s.slabcost); total_cost.update(*this, share, s.total_cost); } /// Copy during cloning virtual Space* copy(bool share) { return new SteelMill(share,*this); } /// Return solution cost virtual IntVar cost(void) const { return total_cost; } /** \brief Custom brancher for steel mill slab design * * This class implements a custom brancher for SteelMill that * considers all slabs with no order assigned to it currently to be * symmetric. * * \relates SteelMill */ class SteelMillBranch : Brancher { protected: /// Cache of first unassigned value mutable int start; /// %Choice class Choice : public Gecode::Choice { public: /// Position of variable int pos; /// Value of variable int val; /** Initialize choice for brancher \a b, number of * alternatives \a a, position \a pos0, and value \a val0. */ Choice(const Brancher& b, unsigned int a, int pos0, int val0) : Gecode::Choice(b,a), pos(pos0), val(val0) {} /// Report size occupied virtual size_t size(void) const { return sizeof(Choice); } /// Archive into \a e virtual void archive(Archive& e) const { Gecode::Choice::archive(e); e << alternatives() << pos << val; } }; /// Construct brancher SteelMillBranch(Home home) : Brancher(home), start(0) {} /// Copy constructor SteelMillBranch(Space& home, bool share, SteelMillBranch& b) : Brancher(home, share, b), start(b.start) { } public: /// Check status of brancher, return true if alternatives left. virtual bool status(const Space& home) const { const SteelMill& sm = static_cast(home); for (unsigned int i = start; i < sm.norders; ++i) if (!sm.slab[i].assigned()) { start = i; return true; } // No non-assigned orders left return false; } /// Return choice virtual Gecode::Choice* choice(Space& home) { SteelMill& sm = static_cast(home); assert(!sm.slab[start].assigned()); // Find order with a) minimum size, b) largest weight unsigned int size = sm.norders; int weight = 0; unsigned int pos = start; for (unsigned int i = start; i weight) { weight = sm.orders[i][order_weight]; pos = i; } else if (sm.slab[i].size() < size) { size = sm.slab[i].size(); weight = sm.orders[i][order_weight]; pos = i; } } } unsigned int val = sm.slab[pos].min(); // Find first still empty slab (all such slabs are symmetric) unsigned int firstzero = 0; while (firstzero < sm.nslabs && sm.slabload[firstzero].min() > 0) ++firstzero; assert(pos < sm.nslabs && val < sm.norders); return new Choice(*this, (val> alt >> pos >> val; return new Choice(*this, alt, pos, val); } /// Perform commit for choice \a _c and alternative \a a virtual ExecStatus commit(Space& home, const Gecode::Choice& _c, unsigned int a) { SteelMill& sm = static_cast(home); const Choice& c = static_cast(_c); if (a) return me_failed(Int::IntView(sm.slab[c.pos]).nq(home, c.val)) ? ES_FAILED : ES_OK; else return me_failed(Int::IntView(sm.slab[c.pos]).eq(home, c.val)) ? ES_FAILED : ES_OK; } /// Print explanation virtual void print(const Space&, const Gecode::Choice& _c, unsigned int a, std::ostream& o) const { const Choice& c = static_cast(_c); o << "slab[" << c.pos << "] " << ((a == 0) ? "=" : "!=") << " " << c.val; } /// Copy brancher virtual Actor* copy(Space& home, bool share) { return new (home) SteelMillBranch(home, share, *this); } /// Post brancher static BrancherHandle post(Home home) { return *new (home) SteelMillBranch(home); } /// Delete brancher and return its size virtual size_t dispose(Space&) { return sizeof(*this); } }; }; /** \brief Main-function * \relates SteelMill */ int main(int argc, char* argv[]) { SteelMillOptions opt("Steel Mill Slab design"); opt.symmetry(SteelMill::SYMMETRY_BRANCHING); opt.symmetry(SteelMill::SYMMETRY_NONE,"none"); opt.symmetry(SteelMill::SYMMETRY_BRANCHING,"branching"); opt.symmetry(SteelMill::SYMMETRY_LDSB,"ldsb"); opt.solutions(0); if (!opt.parse(argc,argv)) return 1; Script::run(opt); return 0; } void SteelMillOptions::help(void) { Options::help(); std::cerr << "\t(string), optional" << std::endl << "\t\tBenchmark to load." << std::endl << "\t\tIf none is given, the standard CSPLib instance is used." << std::endl; std::cerr << "\t(unsigned int), optional" << std::endl << "\t\tNumber of orders to use, in the interval [0..norders]." << std::endl << "\t\tIf none is given, all orders are used." << std::endl; } bool SteelMillOptions::parse(int& argc, char* argv[]) { Options::parse(argc,argv); // Check number of arguments if (argc >= 4) { std::cerr << "Too many arguments given, max two allowed (given={"; for (int i = 1; i < argc; ++i) { std::cerr << "\"" << argv[i] << "\""; if (i < argc-1) std::cerr << ","; } std::cerr << "})." << std::endl; return false; } // Parse options while (argc >= 2) { bool issize = true; for (int i = strlen(argv[argc-1]); i-- && issize; ) issize &= (isdigit(argv[argc-1][i]) != 0); if (issize) { _size = atoi(argv[argc-1]); } else { std::ifstream instance(argv[argc-1]); if (instance.fail()) { std::cerr << "Argument \"" << argv[argc-1] << "\" is neither an integer nor a readable file" << std::endl; return false; } // Read file instance instance >> _ncapacities; _capacities = new int[_ncapacities]; _maxcapacity = -1; for (int i = 0; i < _ncapacities; ++i) { instance >> _capacities[i]; _maxcapacity = std::max(_maxcapacity, _capacities[i]); } instance >> _ncolors >> _norders; _orders = new int[_norders][2]; for (unsigned int i = 0; i < _norders; ++i) { instance >> _orders[i][order_weight] >> _orders[i][order_color]; } } --argc; } // Compute loss { _loss = new int[_maxcapacity+1]; _loss[0] = 0; int currcap = 0; for (int c = 1; c < _maxcapacity; ++c) { if (c > _capacities[currcap]) ++currcap; _loss[c] = _capacities[currcap] - c; } } // Set size, if none given if (_size == 0) { _size = _norders; } // Check size reasonability if (_size == 0 || _size > _norders) { std::cerr << "Size must be between 1 and " << _norders << std::endl; return false; } return true; } // Positions in order array const int order_weight = 0; const int order_color = 1; // CSPLib instance int csplib_capacities[] = {12, 14, 17, 18, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 32, 35, 39, 42, 43, 44}; unsigned int csplib_ncapacities = 20; unsigned int csplib_maxcapacity = 44; int csplib_loss[45]; unsigned int csplib_ncolors = 89; unsigned int csplib_norders = 111; int csplib_orders[][2] = { {4, 1}, {22, 2}, {9, 3}, {5, 4}, {8, 5}, {3, 6}, {3, 4}, {4, 7}, {7, 4}, {7, 8}, {3, 6}, {2, 6}, {2, 4}, {8, 9}, {5, 10}, {7, 11}, {4, 7}, {7, 11}, {5, 10}, {7, 11}, {8, 9}, {3, 1}, {25, 12}, {14, 13}, {3, 6}, {22, 14}, {19, 15}, {19, 15}, {22, 16}, {22, 17}, {22, 18}, {20, 19}, {22, 20}, {5, 21}, {4, 22}, {10, 23}, {26, 24}, {17, 25}, {20, 26}, {16, 27}, {10, 28}, {19, 29}, {10, 30}, {10, 31}, {23, 32}, {22, 33}, {26, 34}, {27, 35}, {22, 36}, {27, 37}, {22, 38}, {22, 39}, {13, 40}, {14, 41}, {16, 27}, {26, 34}, {26, 42}, {27, 35}, {22, 36}, {20, 43}, {26, 24}, {22, 44}, {13, 45}, {19, 46}, {20, 47}, {16, 48}, {15, 49}, {17, 50}, {10, 28}, {20, 51}, {5, 52}, {26, 24}, {19, 53}, {15, 54}, {10, 55}, {10, 56}, {13, 57}, {13, 58}, {13, 59}, {12, 60}, {12, 61}, {18, 62}, {10, 63}, {18, 64}, {16, 65}, {20, 66}, {12, 67}, {6, 68}, {6, 68}, {15, 69}, {15, 70}, {15, 70}, {21, 71}, {30, 72}, {30, 73}, {30, 74}, {30, 75}, {23, 76}, {15, 77}, {15, 78}, {27, 79}, {27, 80}, {27, 81}, {27, 82}, {27, 83}, {27, 84}, {27, 79}, {27, 85}, {27, 86}, {10, 87}, {3, 88} }; // STATISTICS: example-any gecode-4.2.1/examples/steiner.cpp0000644000175000010010000001220512166527420016061 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * * Copyright: * Guido Tack, 2004 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /** * \brief %Example: %Steiner triples * * See also problem 044 at http://www.csplib.org/. * * \ingroup Example * */ class Steiner : public Script { public: /// Model variants enum { MODEL_NONE, ///< Use simple relation constraint MODEL_MATCHING, ///< Use matching constraints MODEL_SEQ ///< Use sequence constraints }; /// Order of the Steiner problem int n; /// Number of Steiner triples int noOfTriples; /// The steiner triples SetVarArray triples; /// Actual model Steiner(const SizeOptions& opt) : n(opt.size()), noOfTriples((n*(n-1))/6), triples(*this, noOfTriples, IntSet::empty, 1, n, 3, 3) { for (int i=0; i(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/sudoku.cpp0000755000175000010010000015727712166527420015750 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Mikael Lagerkvist * Guido Tack * Christian Schulte * * Copyright: * Mikael Lagerkvist, 2005 * Guido Tack, 2005 * Christian Schulte, 2005 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #ifdef GECODE_HAS_SET_VARS #include #endif #include #include #include using namespace Gecode; namespace { extern const char* examples[]; extern const unsigned int n_examples; int example_size(const char *s); int sudokuField(const char *s, int n, int i, int j); } /// Base class for %Sudoku puzzles class Sudoku : public Script { protected: /// The size of the problem const int n; public: #ifdef GECODE_HAS_SET_VARS /// Model variants enum { MODEL_INT, ///< Use integer constraints MODEL_SET, ///< Use set constraints MODEL_MIXED ///< Use both integer and set constraints }; #endif // Branching variants enum { BRANCH_NONE, ///< Use lexicographic ordering BRANCH_SIZE, ///< Use minimum size BRANCH_SIZE_DEGREE, ///< Use minimum size over degree BRANCH_SIZE_AFC, ///< Use minimum size over afc BRANCH_AFC ///< Use maximum afc }; /// Constructor Sudoku(const SizeOptions& opt) : n(example_size(examples[opt.size()])) {} /// Constructor for cloning \a s Sudoku(bool share, Sudoku& s) : Script(share,s), n(s.n) {} }; /** * \brief %Example: Solving %Sudoku puzzles using integer constraints * * \ingroup Example */ class SudokuInt : virtual public Sudoku { protected: /// Values for the fields IntVarArray x; public: #ifdef GECODE_HAS_SET_VARS /// Propagation variants enum { PROP_NONE, ///< No additional constraints PROP_SAME, ///< Use "same" constraint with integer model }; #endif /// Constructor SudokuInt(const SizeOptions& opt) : Sudoku(opt), x(*this, n*n*n*n, 1, n*n) { const int nn = n*n; Matrix m(x, nn, nn); // Constraints for rows and columns for (int i=0; i m, int bc, int i, int j) { return m.slice(bc*n+i, bc*n+i+1, j*n, (j+1)*n); } /// Extract row \a br from block starting at (\a i,\a j) IntVarArgs block_row(Matrix m, int br, int i, int j) { return m.slice(j*n, (j+1)*n, br*n+i, br*n+i+1); } #endif }; #ifdef GECODE_HAS_SET_VARS /** * \brief %Example: Solving %Sudoku puzzles using set constraints * * \ingroup Example */ class SudokuSet : virtual public Sudoku { protected: /// The fields occupied by a certain number SetVarArray y; public: /// Constructor SudokuSet(const SizeOptions& opt) : Sudoku(opt), y(*this,n*n,IntSet::empty,1,n*n*n*n,n*n,n*n) { const int nn = n*n; Region r(*this); IntSet* row = r.alloc(nn); IntSet* col = r.alloc(nn); IntSet* block = r.alloc(nn); // Set up the row and column set constants int* dsc = r.alloc(nn); for (int i=0; i(nn); for (int i=0; i= n_examples) { std::cerr << "Error: size must be between 0 and " << n_examples-1 << std::endl; return 1; } #ifdef GECODE_HAS_SET_VARS switch (opt.model()) { case Sudoku::MODEL_INT: Script::run(opt); break; case Sudoku::MODEL_SET: Script::run(opt); break; case Sudoku::MODEL_MIXED: Script::run(opt); break; } #else Script::run(opt); #endif return 0; } namespace { /** \name %Sudoku specifications * * Each specification gives the initial positions that are filled in, * with blank squares represented as zeroes. * * \relates Sudoku */ //@{ /// The specifications const char* examples[] = { // 0 "...2.5..." ".9....73." "..2..9.6." "2.....4.9" "....7...." "6.9.....1" ".8.4..1.." ".63....8." "...6.8..." , // 1 "3..9.4..1" "..2...4.." ".61...79." "6..247..5" "........." "2..836..4" ".46...23." "..9...6.." "5..3.9..8" , // 2 "....1...." "3.14..86." "9..5..2.." "7..16...." ".2.8.5.1." "....97..4" "..3..4..6" ".48..69.7" "....8...." , // 3 // Fiendish puzzle April 21 2005 Times London "..4..3.7." ".8..7...." ".7...82.5" "4.....31." "9.......8" ".15.....4" "1.69...3." "....2..6." ".2.4..5.." , // 4 // This one requires search ".43.8.25." "6........" ".....1.94" "9....4.7." "...6.8..." ".1.2....3" "82.5....." "........5" ".34.9.71." , // 5 // Hard one from http://www.cs.mu.oz.au/671/proj3/node5.html ".....3.6." ".......1." ".975...8." "....9.2.." "..8.7.4.." "..3.6...." ".1...289." ".4......." ".5.1....." , // Puzzle 1 from http://www.sudoku.org.uk/bifurcation.htm // 6 "1..9.7..3" ".8.....7." "..9...6.." "..72.94.." "41.....95" "..85.43.." "..3...7.." ".5.....4." "2..8.6..9" , // Puzzle 2 from http://www.sudoku.org.uk/bifurcation.htm // 7 "...3.2..." ".5.798.3." "..7...8.." "..86.73.." ".7.....6." "..35.41.." "..5...6.." ".2.419.5." "...8.6..." , // Puzzle 3 from http://www.sudoku.org.uk/bifurcation.htm // 8 "...8....6" "..162.43." "4...71..2" "..72...8." "....1...." ".1...62.." "1..73...4" ".26.481.." "3....5..." , // Puzzle 4 from http://www.sudoku.org.uk/bifurcation.htm // 9 "3.5..4.7." ".7......1" ".4.9...3." "4...51..6" ".9.....4." "2..84...7" ".2...7.6." "8......9." ".6.4..2.8" , // Puzzle 5 from http://www.sudoku.org.uk/bifurcation.htm // 10 "...7..3.." ".6....57." ".738..41." "..928...." "5.......9" "....936.." ".98..715." ".54....6." "..1..9..." , // Puzzle 6 from http://www.sudoku.org.uk/bifurcation.htm // 11 "...6....4" ".3..9..2." ".6.8..7.." "..5.6...1" "67.3.1.58" "9...5.4.." "..6..3.9." ".1..8..6." "2....6..." , // Puzzle 7 from http://www.sudoku.org.uk/bifurcation.htm // 12 "8....1.4." "2.6.9..1." "..9..6.8." "124.....9" "........." "9.....824" ".5.4..1.." ".8..7.2.5" ".9.5....7" , // Puzzle 8 from http://www.sudoku.org.uk/bifurcation.htm // 13 "652.48..7" ".7.2.54.." "........." ".641...7." "....8...." ".8...456." "........." "..86.7.2." "2..89.751" , // Puzzle 9 from http://www.sudoku.org.uk/bifurcation.htm // 14 "..6..2..9" "1..5...2." ".473.6..1" ".....8.4." ".3.....7." ".1.6....." "4..8.321." ".6...1..4" "3..4..9.." , // Puzzle 10 from http://www.sudoku.org.uk/bifurcation.htm // 15 "..4.5.9.." "....7...6" "37......2" "..95...8." "..12.43.." ".6...92.." "2......93" "1...4...." "..6.2.7.." , // Puzzle 11 from http://www.sudoku.org.uk/bifurcation.htm // 16 "....3.79." "3.......5" "...4.73.6" ".53.94.7." "....7...." ".1.82.64." "7.19.8..." "8.......1" ".94.1...." , // From http://www.sudoku.org.uk/discus/messages/29/51.html?1131034031 // 17 "2581.4.37" "936827514" "47153.28." "7152.3.4." "849675321" "36241..75" "1249..753" "593742168" "687351492" , // 18 // The following minimal 25*25 Sudokus are from Alain Frisch // Sudoku website http://www.eleves.ens.fr/home/frisch/sudoku.html "...G...9..4.....6F..L8..." "CEIN.HDM.OF.1L..A..9PJ.4." ".....A...L..JBN.2.D.1...H" "P49...JB23.AD..7E..C5F..." "A1H....F.N5....I.BL...26." "....7..C.6...H4B..1....I5" ".F.P...I..B..7.5.L...9..." ".L6A...5OF.8P...K.NE..734" "B2.E..L...1J.5....O7.K.AP" "O.5.CB1.P....3EM....2L.H." "2..MJ.A...9.3.7......P.8C" ".....CF.DPG62N.E...OH.M.J" ".DL..OM..IE.B8..NH...3..K" ".CO1F.B.N.AH..P.78.JE...D" "E..6.....H......4M.KIB9.." "N.J..6......C..1.5.G..H.." "...75LG...6..1..CI..4.E.." "9K..6.....HGN.O2P.4......" ".OA..IP849...2.K3...7GN.." "..G....N...P.D9....A...C1" "J...M.NAFE.4..23.7....8L." ".....J.H9CD1LP..GO....4ME" "48NK..5.M......JL.......9" ".I.OG....835.A.DH..P....." "35......L.J..E....8IG.67B" , // 19 ".N..JG..O7591...8I....L.." "FG.M.B8...P.E...CJ..H...." "...........G.4.H.D.O.NJA2" ".....J.EN4.L6MA.B.2......" "HE..2..DC.....F4KMA.B.9O8" "M....62...47C19......E5.." ".I2.8M.JGL...ADN..K..3.F7" "..H3.5..89....I.J.....NL." "1B..9.FAP.6.N....537.H..O" "......1..N...O...LC.68.PG" "KOA.FNBH.....7.C.....M..6" "45.ECP.I..N.F.J1...MK.79." "I.L..8.O..9.P...A...2.1J." "..621.D.M.....B8LG..P..CH" ".HP.N7E.L1....3..B..O.G45" "....BIO....5.C.P...FN48E." "...FL.....2.DH..17..59O.." "..I.MF..2G.N...A6O.HC.PB." "72.1..L...IM.96E.45G....." "..9...7M..A.O...I...L...." ".C.JA.........1.....E.48." "O.BI.......PHL.6..1....5C" "G6M...N4FI8...K..H.E....." ".L..4.917....BE.G8F.M.I.." "8F......5.O3..4...9.....K" , // 20 "5.PC..7..J..I...3..H.M.2L" "H.......F..DA..N.G...9..P" "...3LCP2.54.71.B....J.8.." "76M8...3A...H..C.D.FO...." "...DK..GI..B.L.6.8.14...." "A......M....D.6.N.P....O2" "...E5BLF..92..3AJC..6I..." ".PNJ.6..E7A.8..IM.OL1.G.C" ".L3...O.N.5.KI.46.....9E." ".I.G.A..28.MBP...E..HJ3.7" "J.74.L..D1O96.A3.M...GI.." "E...1...K....J...P6.7.C.9" "8M..A9JO.F.P..1...4.E3N6." "...I.3.7.......EL.CD..H.." "....DE2..P...N.........K." ".O.7.FKI1..GJ.N.....9.P8." ".89..H..BNM73D.KFJ..I.6.A" "PDBN...9M..C.....O.6..7.." ".F.K...4..LA9B..C.E75..GN" "G.A.....7.8.....H....O.3." "B...C...4......8K.3.P...." "DHE5..FA...J.3..B.2.KC.98" "...F...5....N..J9......I." ".J...P..O.BK....I.M.3..5." "9...8.B.6.D.M.I..H.5G.J4." , // 21 "..6F.....5..3.....H..A.M2" ".....3....I8.A.MC.KJ.LNG." ".I.7N..K.2..6...3D..B.O85" ".3A.PF.D8OBK7.2....L6.9H4" ".K..CBML.....O.A8.G4.D..." "1.4.AGL..M5..F.O.9....P2." "..I.........8......N4E..." "J.C8.1.6.3.LO.K7AG2P9.H.." ".2.3BH..9.A...G......O..L" ".H..M8.J.....NI1.LEF....B" "I5..4.....G.27..K..3.M..H" "P..E..I.A..3B.8....G.2..." "AJ......NFK.I.O9476..G.1." ".976...E3H....M5.F......O" ".F.M3.5.GKC4.HJ.N.....ID7" "..L1K..9.J37.ID..B..E6..." ".82OH.1..PNML...E..C...J." "....JLFN.B..G..6M..H..D.9" "...C.A...I.6.......K.5..." "E.G.I.....O....J.8F......" "..M4..9.D.7.K.FE.3O......" "H.N.....14E..B3L..8I...AG" "K.O.62.PM...N..H...18C.9." "LC..8.3...2...H.G...J..4E" ".B..9NK.E....C6.P.4D.71OI" , // 22 "A..F.N......M28DC.LI7..OJ" "..B...D.M.6....9.....2A.." ".2..I.56.B...J.MEH......." "O7...HE...BA..G2........L" ".H6J.2...G.7NDP.A...8..C." ".PN35..B..869.2.GA..K.C.." "....EM13OD.N...49K...7..." "9G..C....IJF5.B..7.3....." "HD.....JN....7...EF....9." "1.OA..G.KL....H..B.CP...." "..CE.......2..9I....3...." "FJ..83P.E..K7.NL15H..I2.." ".4..GJ...6DIB...P...AHL.C" ".1I.2.M....83.F..4.NBE..." "L3M.OD.H.AG..4.....69...F" ".8...5H.3.....M...D..K..4" "3..4..AEDO7J...5..9..G1.." "..2N9.8F.P.OIGC.L6..E.H.." "C...1.7..K.L6.4EO.8.5...N" ".IG.H..M..E...1A2N4..8.F." "6..5J..N1...2..H.IGA...P8" ".L...O...H...C....M5G..A." "..F...3C.7.P..5N..B..DMH9" "291D..6..M..H.7.3.J.N..B." "....MK..29F.G.DO4...6.E35" , // 23 "....B12O3..D..F..KPL.E4.7" "1M..GL..H..K.A.....39.P.." ".8.3.4.....7..6.F.....CK." "P.O...758.2..MC.....1L.A." "...HFK6.A..8...9B...2...J" "91.KJE..L.5O..GD.....4..." ".I..3..D.2.....C4MLAK..N." ".4..6IA.P7.....B9......3." "M.F...4.J...8....N.H.1G7." "..5P.N.....C.731.I.E.9A.." ".....GO.KDL......BA......" ".3A..F...9..K.EI5.7..6.DN" ".G.54.L.....PH..3F6....2." "....P.....G..2D.OH.1B...C" "6.EM.7N....3.B4..DC..K1P." "B.9.....I..5N...7OGK...46" "OF.GD6HP..JM..BA8.I.C...." "8.L7...........P.3M5...92" ".EM.....45IF7....2.CJ8DL." ".6.4.8..NA.2......9....GI" "2..A1DCN..3G.F5.L..I..O6H" "..BIO..1.H.L...G........." "C.P.....M8.9O..5A..N.JK.D" "H...N...FOA4..73....5..CM" ".D4..3...6BE..N.2JH8..L.." , // 24 "LJ.FH2...K....359.E.B6.N." "...EML1FC.PJ.A.8I....2.K4" "9........G1..6..K...PAL3C" "P...C34..8.N7.........DE." "...7....E..IO...124.J5.F." ".8.L.PA.2..31FG....N..C.I" "F.G......M........2.K..1." "....2KH6.JOD..9.L..G...B." ".6O3..G...4.NJ.H.PB...5.9" "I...K..LBN...E.76.A....8." "D.B.L......8.3.C.KM.6...." ".C593.I.N4.26MB..1..L.K.." "M.F6......DA45.9..N.I3..B" ".G..79.H...KJ...4...AN.2." ".KH...BC....LON..7..D.8.F" "2..B...MP....7OEJ4....6.1" ".4....2O.9......N..1....G" ".....G.JF.2..L.6.5......." "C9A.G...H1...PJ..L.3.8.MN" "...1......M.....O.P8.K3J." "...N.HP.K25G3..JC8..1M..." "..2K.FC34.A....N7..9.LB.." "..65DJ..L..C.4.1...BGF..." "OF..E..7.B.......634...D." "G.3..N.I9D7PM8KF2....4..." , // 25 ".1..I8.P..6.N...BD...3O.." ".9.6...E.M43.8..AK.2J.1.." "...JKL...FA...P.I4...DB.." "E...P.I.B.7.1..J.HC...98." "..5M8GJ.KD.O...N3..1AI..." "K.2C4.M.N..J..I.......H.5" "N..B9O.D...KH6.E...C...7I" "DE..JK4.....L.1B7..68PN2." ".....P...C..F.7...L.O9..." "...35.H......92..M.4.EC.1" "P..IL..H.........1..3.D.." "....B9..8.3I5.C...K...F1." "FH....2O..D.4M.P...A...GC" "JA.......KF.......4.EOMIP" "3.7GNF...A.2OB9C.E5.HJ..." "2.I.1.......AO5.P...K.3.." "..H....L..M.CIJ..7...4..." "GO.9..KF.I.P3...E.HJ...N7" "5.37...B.E...4N..O.8....." "4B...7.9O.HL..E2C3.K51.M." "L.O42...D..AJ.8...GH.N..E" "9M.8.H..LG1..N..5.E..F7B." "......FAC..5M..I6J.B4...G" "...F..82..P.E......36HK.L" "B.J.G5...O.H2..98.7......" , // 26 ".CNPHK.53.O9F..D.78..J..." "J.....F.DB...7.G..PAE...L" ".6.........5.4A......I..." "A..L.6.E.1JG....5.H.2...9" "..G4..P...E2N.M...C..FB.1" "..PKJ...G41O..C.N..H....." ".M..I5L97J.3H...E2.8...D." "1.4..ON.83G.P.D59..C.BH.." "..2.9.......4.F.3.6..O.7." "3F.7.MEC..5...2..4K.LN8.." "...I........MF7.6AOG..LE." "C1.3..JG..D.9...4..N...68" "...M7L9..NHA...FJ.I..3.C." ".A...P...5...E3.8M..K4OFG" ".....C.6KIP...8..3.DJ...." ".2.J...3C..7.D.9A.EF6L..." "4...3.6N.....L9.H..P8...2" ".9.C.4H.......P....1..FJ3" ".LD.K87.1.BM5AJN....4H.G." ".B..MAI........47O.LD...." ".G....3....F..1..9..M..K6" "P7.A..B8.......2....I.3.." "M..O....9K2..6..1.N.FE.L." "....E...A..N.J.IG8...C.9." "6KL.4...FCI.A.....5J.2D.N" , // 27 "E..I...M......L....D...BK" "F..BH9.K.A2.7..E4.P.6..M." ".6.J..PD8FE.IM...K...54.." "L...8E...IA..HC........7J" ".....7H.4.JK..DOFC....9I." "9...7A.5.B.M34E.KDJ8....." "8...BD....O..7....CP.E.6." ".1.3..8....D...2.ML.B..5A" ".E2.A.O.7..1..I.659..8LD." "KF..M2...PL......A.G..N3." "...76N.1..CBG...DPK..O.J2" ".JK...6B.9..P.7.N.EMFDG.5" "N....G.F.8....OH9.2...E.7" "....4.3....F9.....5.NC.A." "M.A.GL.J......5..4.7.91.." "C.8NE.5..6..M.....BJ17..H" "7.6...NL.41.AC.I8...GJ3.." "...53P.GM2.L..F.....K.68." "J.4.D..H..IG..8K..35.N.FL" "P.F...93.D.....A.1......M" "..7.I...1...DF..PJ.4.MA.." ".KN.....5H..O.63.E.2....4" "....1...O..A2..DCH8B..KE." "3.HA.6BP.....J1957O..28.." "42JO.I...K5C......6.P.B.." , // 28 "...G87..O..F.N..CH6..D..2" "C16..N....DL.3.E........." ".LN.EK..D..O.G6.412....5H" "K...2........59M...P..3.." "..A9.M.6....8.E7O3..K..LB" "7..8B.1.EP.....4.L.6.C.9." ".3.6...9.85.A2F.....B.EP." ".D4K.L..NA....C.M.E..7..." "L..P.3H.CG.7....DKF..I6.." "5EH.G.7.6.1....J....D3K.O" ".6.....G.K.E..I2.4J......" "..ICFP.8H7.2.O.B.NM5..G.." ".M..D9..BE..J..F..I7..LAK" ".BE.L...31.M7FK..C9..8.DN" ".2O......D38C...E...F.P.." ".A.....M..NB..3.J.7E8..2." "...O...B..6..C.8KG4..5D7M" "....M8..I..9..AL1.O.3HBNG" ".C..4....L.....D.F......." "J..5NF..G...H..6..C..1..." "D..N..O....G9.J.A..I...8." ".F.H1BN.K.O.4.8.6.3.9.M.." "B...I....9K..6..2...G.H1." "O...7.CJMI25N...HDKBPFAE." ".....28.F..C........O.JK." , // 29 "9.K..6D.I5...........H..." ".I.E..BK...GN...6.L...3.." "7....2..L8E.K.D1.P5I.6..A" "..N.LEH.A32..CM9........." "..2....9N...3.IC...J.KF8." "......GA..C.7JPNI3....6L." "....E.J.8K..I.....97NG2.B" "O7..3HI...M.....DCF5..914" "L.M.4.3.19.D..2......F.K." "B....F...O9.6ANG.2.PH.E.5" "8KDM...5.1....G......P..6" ".4.H.L.C..J2....G..3ION.." "C.A..J..E...1K......92.5." ".9O.NP.2...IA....H..G..7." "...I5..O.N4.H...2DCKJ...E" "56....1.D..AJ.....7.L.O.." "K.8.H.7.9.5....AC..O..G6F" "3..........O..C.F.P6K.5.." "...OC.4J2.3E.9...N.H7..P1" ".B.7.K.....6.MH.LJ..A...." "I..4.........P..E7D9O.B.H" "E.3G.OP...I1CBL..FN4..82." ".A..9N.8.E...73O..H....4." ".M.C.3....DK..EI......JG." ".HP..D..FB...NO.1KJ8.AL.." , // 30 "....L.1.8H.CO..P....FA..." "P1.2.4CO...K..A..3H8...7." "I..H.G.5.B.6.M..A24.K..9." "....6I.KF9..5.P.J1.BDCE.M" ".A....2...F..L..E.M.6.5O3" "7..1.C...8.L9..4P.5.G.K.." "JO.5H.M2.I.7.F.6D..A4..NE" "E.3.NO....K2...LG..7JM..." ".9F.CJ.H....A.NKB.1..2.5." "2LB...5..7.P36H.M..N...1D" ".....P..B....46.HJ......." "B4..7LI.C.GD2...KA.3H...." "K5......6J1.........27O8P" "LP...5K.G..JB3.......1.M." "..EG...4.F.NKC...O..9.B.." "..MI...D32AGP..5O...74.BN" "FC74.....1..LO..8...5.D.J" "..JN....H...E.I...DPA3.6." "AE.......O3F..5.........H" "...8..6......24.9G....I.1" ".M....8.9..O1.F.C.EL3...A" ".N...E.3.....I7M1...ODG.K" "1......P.N9..D..5........" ".I.P..FGOCMA.......J.5..2" ".GK....7...3.....92..B.L4" , // 31 "...H....GKM.43..B.D......" "15I.C....8B.6D.7G....A.H4" ".7...F..B...J.E16.N....3." "...D.1...6L7.H.5K....P98F" "KJ.AF.5CHO...NP2M.....B.." "4..K..I9.M.DNP..A.3..E5O6" "PGC...HE.....I5..M...7..J" ".B.EJ..G.5..L....D.48.2.." ".D....N.4.J.2A..H..5..F1." "8....AJLD.7..OM...1B....P" "CH...N..7.........B3....." "I..O.JL..P5...3......KH.8" "D.259.E......6.......L3.." "...3K6.B.AE..74N25H..G1.." ".L.B..41.HC...G.OIP8..MN7" ".........2.C.4.L....69.I5" "N...7.C...69.5.A......PKL" "....L.G...13.BOMP.82..D7H" "...C.H..5.P.E.K...I7....." "JO..P.96ABI8.....C..N..4G" ".NA8H.32..O4..IB..L9G..J." "..4.GD..M.3..27INJ.O....." ".C9L..A..J.....6.2..I..F." "BK...4..F.A.CL..87.1.O.M." "6..P.I.5...M..N....F....D" , // 32 ".6OL.3GB.I.1F.EP..9..24.." "..1.P.....K....N.2.....ID" "2.8.K7..J...6..1F.......A" "...D.8.4..29..LJ7.HMKPF.." "..I.9N...A..P.M.DK...E5.." "94.N...5..F..E.C182..BG3." "8D..3HC....6G.....P.F.72I" "C..I.E.7D....8BG.F...6..." "......L....N.24..I..1K.DJ" ".27HG.NF......I..L..E.A.." "L...N.I8F6.H.9K.3O..B..5P" ".9...L..25.B14F.N.JE...7K" ".1...9B....GJ.8.A.5C....." "....CPK..J....5.M.7.6.H.3" "..F7..3..O..N..B8....421." "AM.8....P...71..26N...3G." "P....D.2.78.O..5CJ.GA.BH." "6..4.F...3...K9A..1...J.M" ".I2.E......JM.N...B98..P." "FC..7..6.EI.D.G...3H5..KN" "I8NO.4F.9..DB....5......." "5..1...G3.MIH.A.9..N....." "KG.62..1.....L3.....IJE.F" "....D.6.AC4.9.....OL.HP.." "..EA.5O.L.6.......D...9N." , // 33 ".CH3.L..D4F..I.........1." "G..K.....7.O.......L.42N." "A.D...5O8B...39G.4..I...L" "1E2OB....A8N..6FCD9.H...G" "IN..4..3.....J..5OM....9." "...JEMP..9G8..D7......BA." "B.M9..L....6...2.FI.KJ..." ".LN.386A..BH....O.J.2..7." "7A6..2..3N.....4KP..G8HIC" ".1.....J.CK3....HB..5L4.." ".H......P.I.57....G..21B4" "....7.....EP1....3.2..A.." ".59.1FI.L8.MJG.B..AH....E" "NI..D....O3K..A.P9..8F..." ".O....A..E2.8.HN.J7.P...." ".MC..P....H2...A7..ID...1" ".6.....M.J.14.BDG.3.O9F2." ".......CG.........4...M.." "HDL...8N7.......FK2C.E..B" "..KP2I.F.3...N7J.E.6..L85" "D.E...C.4.7B..I....A.1..M" "J..M..7..D.A..4...ONBG..2" "9.7.6..K..P..O....D...8.." ".2IN..GE1.D..8...MK.CPJH." "FG..8B.2.L..KH.....1.5E..", // 55 16x16 instances (mostly harmless) from janko.at // http://janko.at/Raetsel/Sudoku/301.a.htm // 34 "D92.....G...43.." "4CF.....9D.2.6EB" ".E.1....F.8BC..A" "G56.....A3C....1" ".7G5A8....61...." "2...C....B7....." "..AE.964..G....." ".F9.5.7.4......." ".....29....A.C.." "........645D.1.." "....D....1.C.B7F" ".....E.C2G...8A9" "B..9.G52.....EF6" ".256..F.....D.B." "E13.6.D........7" "A...8BC3....954." , // http://janko.at/Raetsel/Sudoku/302.a.htm // 35 ".DG1.C.BE..3.4.A" "..7B.62..41...59" ".......D.....G.." "..49.7.3.B6..FD." ".9..G...C......4" "G..46....9F.3.B." ".C5.1...BE.86..G" ".B.....E2G...D.." "..3...596.....1." "F..C2.76...B.E3." ".1.8.4D....7F..5" "E......F...D..9." ".AB..FG.1.3.C8.." "..2.....F......." "8F...BC..62.97.." "1.6.A..59.C.GB2." , // http://janko.at/Raetsel/Sudoku/303.a.htm // 36 ".....D.3..7F.A.." "...B1.F8....26.." ".F.3...6D..AC..." "AGC.9.5..8....BD" "E.FG5...7...A.9." "2.7.....89A36.F5" "...1.9...CBE...." ".3....A.....BG2." ".1B2.....7....6." "....B16...3.9..." "5D.4F3EA.....2.B" ".E.A...9...D83.C" "4A....B..E.8.FC9" "...EA..G1...D.4." "..GC....FD.B1..." "..D.47..6.C....." , // http://janko.at/Raetsel/Sudoku/304.a.htm // 37 "....9...5...3B.." "...D13.7.4.....F" "637...2..81AC9.." ".2G..5.......18D" "...F4...3...8C.." "E.D.7..6..G...A5" "C5.6..3....F.2.." "4.A...1D72.9..B." ".E..D.9CA6...F.1" "..9.5....E..D.26" "B6...4..D..5.7.A" "..F4...A...C9..." "AB4.......2..G6." "..68FBD..5...A47" "1.....6.9.E4B..." "..32...5...B...." , // http://janko.at/Raetsel/Sudoku/305.a.htm // 38 "..16.E.8.BF.4..." ".5...9D......A73" "..3...B.78.D.6.." "......1...9...BE" "C..1D..6B5..7.A4" "...5.F.98..32.DG" "3.....C..D.A5.E." "....3B5.F7...9.." "..5...6C.2AE...." ".3.BE.2..4.....9" "F9.2A..B5.7.G..." "EA.G..756..BD..1" "6C...8...9......" "..9.6.47.E...D.." "2GE......C6...F." "...3.CG.2.D.65.." , // http://janko.at/Raetsel/Sudoku/306.a.htm // 39 ".....D5..7.169.." "..4..2BE8.G..A.." "8DA....752..BGF." "G.9EA.86..3F2..." "C..4G1.....7F..." ".G.A...315.6..C8" "E.5..F7.4G..1.A2" ".91..BE...D.54G." ".68D.3...C5..B9." "4E.5..9B.31..F.G" "3B..E.G1A...C.4." "...95.....F83..7" "...C9G..F1.5D8.B" ".468..DFC....3E5" "..2..E.A7DB..C.." "..EFB.3..86....." , // http://janko.at/Raetsel/Sudoku/307.a.htm // 40 ".BC..32...9..D.." ".3..CB...52A.9E4" "7E.A...D8.6B2..5" "..9F..A.DC7.B6.." ".15..2.E..3...4." "4GD81.3C...7..6F" ".C.9....E.4.G..1" "..E3..59G.FD.B.." "..A.2E.FC9..84.." "B..E.9.4....F.A." "16..A...57.F3E9B" ".9...6..4.E..7G." "..64.C85.2..DA.." "E..DB1.23...6.59" "C5G.9D4...1E..2." "..2..F...DA..CB." , // http://janko.at/Raetsel/Sudoku/308.a.htm // 41 "G.E37..1.....6.." "96..E..3..G5D.F." ".7..64.CF31..29E" "....F...8.9E437." "6AF...D.3..1...." "..1...B5.8F47..3" ".83B2.47.G....61" "..79.6...EC..8.G" "E.C..2A...8.FG.." "25....C.GA.78B4." "7..AD3F.24...E.." "....G..B.1...C52" ".4A2B5.D...8...." "FE8..G2A1.73..C." ".C.78F..4..2..E5" "..9.....E..G34.8" , // http://janko.at/Raetsel/Sudoku/309.a.htm // 42 ".G.4..1E6.9...2." ".D..4G.C.....9F7" "..79.D...5C.B.G." ".EFC7...G..D.5.3" "5...C...E6BFD..." "...1...5..D.CB.2" "7.CG29.D3...E8.F" "94...EGB.2.C...." "....E.2.583...CD" "3.D5...89.FB7G.E" "4.1E.F..A...3..." "...F1B3G...E...9" "F.9.8..1...G23D." ".A.B.4D...7.5F.." "8CE.....1.25..7." ".7...5.3F9..G.8." , // http://janko.at/Raetsel/Sudoku/310.a.htm // 43 "...4.1.9..7...B5" "6E..2.8....CGA.." ".51....B.D....6." "B.9..E..G..A...7" "..7.5F9G..48...." "..29..3..F..5.7." "G.BD...837.E..94" "......7E.1.6A2G3" "94GA7.2.63......" "5B..A.E18...79.2" ".1.8..6..4..BD.." "....G8..EB92.4.." "D...9..A..1..G.6" ".3....4.C....1E." "..4B6....E.7..2A" "F9...5..A.3.4..." , // http://janko.at/Raetsel/Sudoku/361.a.htm // 44 ".G..5.2.E.FA.4C." "AB..G....35.17D9" "53..4AC..DB....." ".6.C3B..2.8.5..." "1...A....E.D9CG3" "GDA9.4..B.1.6E.." ".FB.1..E9....D.8" "C..3.59G48......" "......F38G2.7..4" "6.3....A7..9.8E." "..CE.9.1..4.DG35" "89GD2.4....6...C" "...G.C.4..958.7." ".....1A..F78..42" "4871.3G....2..9A" ".C9.72.8.6.4..1." , // http://janko.at/Raetsel/Sudoku/362.a.htm // 45 "A...18..79..C..6" ".37.A2...FD...E9" "G14D..5...8C.A.." ".268.E7.3A....D5" "3...D1...7A2.8.4" "7CF.9..4....D.2." "5..63.A28...1CF." "...1.6...3FD..5." ".A..FC6...9.3..." ".D2F...3A5.1E..8" ".9.G....D..7.F1C" "E.C.G9D...3F...7" "17....9B.2E.43C." "..9.E3...C..5D7F" "FE...AC...G5.29." "D..C..2F..73...E" , // http://janko.at/Raetsel/Sudoku/363.a.htm // 46 "3.8.BD..5F72E..6" "..G..4.7E..6F5.." ".AF.2..C....9G73" "59C...FE.AG....." "C5..1..F.4.G.E.7" "F..2.C..B13...GD" "4..B73.D....C..." "GD...A...C.7B48." ".G5FD.3...9...BE" "...C....6.E1G..9" "28...7E1..B.6..4" "1.B.5.C.3..8..AF" ".....ED.16...345" "9C21....7..A.8E." "..EA9..3F.8..7.." "6..5827A..4D.F.C" , // http://janko.at/Raetsel/Sudoku/364.a.htm // 47 "1.....6C.4G.9BA." ".G6..F.9A.D1...2" "...D7G.3F...41.." ".3A.2..1.759.E.G" "B8..D.F.C.2.A..." "C....1..DBFA2..5" "..FG.E.....58C9." ".25A3.C.G..E...1" "3...4..B.G.DE78." ".C78A.....3.12.." "5..1FC37..E....9" "...4.2.8.F.B..CA" "A.4.6B7.5..F.9D." "..8C...DB.975..." "9...85.E3.A..46." ".5D7.A9.E2.....8" , // http://janko.at/Raetsel/Sudoku/365.a.htm // 48 "..D.2...5A1....F" "E21F..9..6.D...G" "7A.9G1..2E.4D..8" ".B64.3FA...8.E.2" "...3...F...G2A.." ".F7...5.8D4.B.3." "4....C.....F8.D1" ".G....B3A2.....6" "3.....4CF8....6." "94.B1.....D....E" ".C.A.E8D.B...15." "..G8B...1...C..." "B.A.8...6F2.3DE." "2..16.E5..A39.84" "6...9.3..5..1C2B" "8....D12...9.6.." , // http://janko.at/Raetsel/Sudoku/366.a.htm // 49 "3....2A.4F.6..G1" "ADF4..3..5....E." "..5G..1E....FAB." "..E.GF75..B..93." "B...17...A629..." "...EFG..7.516..C" "63..D...G...E42F" "2....8639...1G.." "..B8...76G2....E" "5C32...4...E..1G" "G..62E.9..D4B..." "...D5CG...A3...7" ".G7..5..84F9.B.." ".F6B....5E..21.." ".5....B..6..7EF9" "E4..A.9F.BC....5" , // http://janko.at/Raetsel/Sudoku/367.a.htm // 50 "B........45DC.6A" "4.F...639.CA.E.." ".9A...CD26.8F1B." "6.C3.7.8.F..9..." "D68.E..B...5...." "73...8A5..9.2..." "A.G1..9..26..D8." ".C9.......81A6E." ".574FA.......G1." ".AD..37..G..4F.E" "...9.G..452...CD" "....B...F..9.725" "...B..G.C.F.12.9" ".16AC.5FG3...8D." "..2.36.759...C.F" "F8.C194........6" , // http://janko.at/Raetsel/Sudoku/368.a.htm // 51 "C..B61..G...F.AE" "4E8F...A.....DG." ".D..F3.E1.5A..6." "5.....GBE9FC..82" "..5EB.D8...1.F.6" "..AD.72...6..3.8" "...3..E.9FB85..." "6.B4..1....2CAE." ".3E9C....G..D1.7" "...CEG3D.7..A..." "A.F..B...CD.EG.." "D.7.1...B2.348.." "FG..8EB17A.....3" ".4..D6.G3.CE..5." ".62.....D...74CA" "3B.A...4..9F8..G" , // http://janko.at/Raetsel/Sudoku/369.a.htm // 52 "...E.6DB...2.8.." "....5G.3.9F8C1.." "981....FG....7.." ".3.F8....65.2..9" "3G....4A5D..7.F." ".A.D...2......64" ".2.4C.F..A.G...3" "..F.D.....6C.21E" "1F9.B2.....E.D.." "4...E.3..B.DF.2." "5E......9...3.C." ".D.3..8142....5A" "2..5.D6....F1.A." "..4....86....EDG" "..3CGFB.E.DA...." "..G.3...279.6..." , // http://janko.at/Raetsel/Sudoku/370.a.htm // 53 "3....1G..5.7.A4." "FE7C.3.9.......G" ".8.....5D9G.C..3" "5G.A6....38.FD7." "...5G.94.8.27C.." ".98.E.5C.G......" "4....7.25.CB.6.A" "2A.F.......6.5G." ".F3.5.......4.DB" "C.B.98.AF.7....6" "......6.2D.C.9E." "..6G4.B.81.9A..." ".D53.C8....E6.97" "A..2.D467.....5." "8.......4.9.32B1" ".4F.2.3..61....C" , // http://janko.at/Raetsel/Sudoku/501.a.htm // 54 "..E3.7.1.5.6.B.." "....G85B92.FE..." "C...4.36A......2" ".4.BA......G7..C" "48.2E...5G.9ADB." ".....B...C4...9E" "9A..F42.E1...5C." ".5C.7.9G8....413" "BE8....26A.C.G3." ".FD...7E.931..56" "AC...G6...2....." ".1369.85...BD.A7" "E..A6......5C.7." "3......A7F.E...5" "...51.G7CDA2...." "..G.C.B.3.1.9A.." , // http://janko.at/Raetsel/Sudoku/502.a.htm // 55 "G..B..12....73.C" "..8DB.7CG9A....." "6.3...D...4E.8B." "4...38G.21....AD" "..F.........E.6." ".E6..75DFG3.B..." ".7.G.F916EB.4583" ".B.3.E2..89...F1" "74...3E..62.5.1." "9852.CB7DFE.3.G." "...A.56F431..C9." ".F.6.........E.." "C1....F4.B5G...E" ".D4.EG...2...9.8" ".....D8974.1CA.." "B.A7....ED..F..4" , // http://janko.at/Raetsel/Sudoku/503.a.htm // 56 "7B..9C.3..6.A.2E" "4.2...67A..53..D" ".....ADE.CB.4.5." "AD8....B7.F....." ".C...1.A.9.....8" "F.E8...C.4.D.6.2" "..D.59.......1A." ".1.2......7FBDC3" "BF6EC4......2.7." ".53.......C2.E.." "D.G.2.A.5...F3.C" "2.....1.B.3...8." ".....F.43....CD7" ".8.G.E7.C25....." "C..DG..1F7...2.A" "E7.A.6..9.18..B5" , // http://janko.at/Raetsel/Sudoku/504.a.htm // 57 ".21..BD...EF6G.." "..6.5.F....D.8.E" "G4.....EB.7.1.D3" "C.D..37G..61...." "AB.D8..9.1.E..F." "6.F4..G..D..8..B" "....BD.1F.8.7.C9" "..3...6..G.BED.." "..B91.C..E...A.." "47.2.6.A3.1G...." "8..3..E..B..F1.G" ".1..7.3.D..C9.25" "....GF..28B..4.A" "5A.8.4.B1.....GF" "D.2.C....F.6.7.." "..41DA...7G..C9." , // http://janko.at/Raetsel/Sudoku/505.a.htm // 58 ".B...7..4D..E13." "D......6G.E7...F" "8.6F....B....7.." "7...91D..F8C.B.." ".F.G8.1.3..27..." ".1.6.4329.7.F..D" "3..7..5..GBD8..." "48D.CE....A...9." ".3...G....C4.9EB" "...148C..3..A..2" "9..4.6.7FA5.C.G." "...EF..5.1.B6.D." "..5.ABG..7F9...6" "..3....F....18.E" "G...E5.32......9" ".6FB..89..3...C." , // http://janko.at/Raetsel/Sudoku/506.a.htm // 59 "...FDAE..6.1.3B." "1..C...9.D34.6.." "8A3.4.....2E7C.." "..DG.3......8.5E" "3F2.C.....8B.5.9" ".DE.8..B2C..A..4" "C8...1.........6" ".....D.31.5...E." ".G...E.84.D....." "A.........1...43" "D..E..17C..2.FG." "2.5.AF.....9.D7B" "73.2......6.B4.." "..483B.....D.A61" "..A.14F.B...5..C" ".1C.6.D..24A9..." , // http://janko.at/Raetsel/Sudoku/507.a.htm // 60 "4.8CB9G...D..FA2" "G..18..A96...E.." "F9....ED..8....B" "...D73...2F.G.81" ".......2....C.F9" "3.D7.E6...9.4..A" ".C.4..D9.GA..3.7" ".2.......7.3.65." ".3B.5.2.......D." "6.4..G8.FC..B.2." "E..G.B...D2.18.F" "CD.2....3......." "D1.B.8F...C9E..." "2....D..1B....G5" "..5...17D..G9..C" "7E9..C...468FD.3" , // http://janko.at/Raetsel/Sudoku/508.a.htm // 61 "D.B.8.4..5G..2.9" ".C..6.3...D1.7B." "GE4.B..52A..FD.C" "..7.2..E.F9....." ".2..4....3.D9GEF" "43.7..A..8......" "5.ABGD.F..1...37" "..E......7..6B.." "..2E..G......3.." "C5...B..D.F971.8" "......5..2..C.GE" "348GD.C....7..5." ".....91.8..F.6.." "1.G2..F65..E.89B" ".8C.54...1.G..F." "F.5..87..9.A.C.1" , // http://janko.at/Raetsel/Sudoku/509.a.htm // 62 // problems "..EF96...8.5B.C." "D...FE....1.2A.." ".86..2..C...57.1" "C21...BD9..E...3" "5..1.C...6....DA" ".G.....7.E.1.5BC" "B...D1..8...7..." "..9D..A27.3.E..." "...3.A.E5B..6F.." "...5...C..83...B" "FDB.2.9.6.....5." "61....5...E.G..9" "4...8..3B7...EA2" "E.26...A..G..CF." "..58.D....4F...G" ".B.7C.2...5AD9.." , // http://janko.at/Raetsel/Sudoku/510.a.htm // 63 "..2..DA6.38.14.." "...5.F..2......." "6.8.2.G.....7A.B" "A.F.....65.G..D." "...6.8E.52...B.." "7....2.F.G39..8E" "8..3679..4.C.1.G" ".B.EG..18.A....7" "1....A.8C..FG.3." "E.A.1.3..D42B..5" "97..CG6.1.B....4" "..3...2D.E6.A..." ".C..B.74.....5.A" "B.68.....C.7.D.F" ".......A..1.2..." "..4A.C8.E6G..7.." , // http://janko.at/Raetsel/Sudoku/511.a.htm // 64 "A..95.B.G...8.FD" "G.D...6FB...A5.." ".B...1D83.A9G.7." "F68....G5..1...C" "..28DA9..5FC...G" "..G.87.2.A4D.6.." "....3F.....E.CD9" "9C5D......G.FA8." ".71B.6......5842" "D5F.B.....26...." "..9.127.F.85.D.." "2...E35..CB719.." "6...F..BE....734" ".F.ECD.3479...2." "..AG...9C1...F.8" "39.5...1.D.FB..A" , // http://janko.at/Raetsel/Sudoku/512.a.htm // 65 "....G5D.C1...B2." "6...E.BC.G..D8.." "D13C..7..4..5G.." ".72B48..5.6.C9.." "....B9E....F4.12" "...A..FD7B.C8..3" "E6F..1....G3.DB9" "B..4.2.89.1...G." ".5...7.ED.C.G..8" "C9D.14....E..A35" "8..2D.591A..6..." "7G.36....259...." "..6D.E.5..B4A27." "..95..2..8..B3D4" "..7G..4.6E.5...F" ".B8...97.C32...." , // http://janko.at/Raetsel/Sudoku/513.a.htm // 66 "D...9A..6.F4.3.C" "....B6..5A.E9D.." "6E5......D..7F.." ".3G9..FDC...4..." "16..AF4..C.7..58" "G....1..A.B8..F9" ".7C.3..8...F6..." "A8.F.G.C43..2..." "...7..9E3.D.8.4F" "...8G...9..5.6C." "59..F3.4..C....G" "4F..6.D..B7A..2E" "...D...BE9..G86." "..2G..3......BE5" "..E48.6A..2C...." "3.8.E5.F..AD...4" , // http://janko.at/Raetsel/Sudoku/514.a.htm // 67 "...B562E.1G....." ".D27A...4...56B." ".G6..B.C..2..E7." ".1.C..7.DB..3.42" "....37.2E..G..64" "D.3..5..C.A8.G.1" "C..A...F9...D..3" ".2.FDG8..3.4.5.E" "2.8.F.4..CEBG.5." "E..D...G5...C..B" "1.5.2C.D..9..F.8" "FC..E..5G.81...." "A3.5..G8.9..6.E." ".F4..A..2.1..39." ".E16...3...C42G." ".....E1.763AF..." , // http://janko.at/Raetsel/Sudoku/515.a.htm // 68 "A.5.FB.C...7..3." "G38....D.C.EB5.." "..F...3.9G8..D7." "...E.2.4.A.59.FG" "8..A..6.3F7D5..." "B..4....5...DEA." "61..BD75..E....." ".5C.1E.A.8....62" "C8....E.7.62.GD." ".....A..D95F..84" ".D41...6....2..7" "...928D1.E..3..C" "57.3E.A.8.9.C..." ".21..C58.4...F.." "..6C9.1.2....AEB" ".A..D...G.1C.4.5" , // http://janko.at/Raetsel/Sudoku/516.a.htm // 69 "...E9.5..6.G...F" ".6.4.3.G...7.1.B" ".37A.E..49.5C..." "9....C76.32E.548" ".E...4..DG9.2..." ".4...562C...G8.." ".G93..1B5F.2.C.7" "C1.639.A.......5" "D.......2.496.8G" "6.3.F.9EG5..B2C." "..AB...86EC...3." "...9.2C1..B...D." "7A1.462.3B5....D" "...D5.89..G.1BA." "E.5.G...9.6.F.2." "4...B.E..D.87..." , // http://janko.at/Raetsel/Sudoku/517.a.htm // 70 ".FE6.A.8......1." "145..7.E..F...68" "...C.4..EG82..5F" "....5FD.7B1..C.4" "..4.82A.C..1B..." ".8C7..5....AD24G" "..1F..9.G83BA..." "..A9F.E6D.....71" "F9.....53C.718.." "...321CD.6..74.." "A1726....4..GFC." "...49..F.1A8.E.." "D.F..62B.593...." "4B..D83A..2.5..." "87...5..B.4..936" ".6......8.7.CBD." , // http://janko.at/Raetsel/Sudoku/518.a.htm // 71 "...84......D.1F7" ".6.C..A.4G.....9" "..945.G.8.F..3A." "...7CFD2.3...E.G" "..6B..58..G....." "8.7..G.C9.4A1..E" "C..EA3.9...5.GD." ".F...2.....B3.8A" "AB.6F.....C...9." ".7E.B...5.16G..3" "1..G79.3A.D..C.5" ".....1..7E..AB.." "3.4...8.E792B..." ".E8..D.B.A.359.." "5.....1A.D..E.3." "69D.2......C7..." , // http://janko.at/Raetsel/Sudoku/519.a.htm // 72// problems "CD.E9.8......6.." ".62..3...E..85.7" ".G...6...AF5...D" "....D54.39.8...E" "6FB..ED4...G.1.." "4.A.5..2D......G" ".C.1...GF53A2..6" ".2.3.A.1....F..." "...2....4.B.9.6." "3..6G8E95...4.2." "G......D9..3.F.8" "..4.2...68A..GC3" "A...1.3E.D9C...." "E...49C...5...1." "2.9D..A...8..3F." "..8......2.7A.E5" , // http://janko.at/Raetsel/Sudoku/520.a.htm // 73 "D..6..1.2C3....8" "..1..386..5..9.." ".8C2......DGBF1." "..5.G......1.A.D" "..A876..4..C5..." "64F...AD.2.5..C." "E....1B9.6A...24" "B...4....8G...7." ".7...BD....6...9" "FG...C9.1D4....A" ".5..E.6.G7...1DC" "...BF..G..2A37.." "5.8.6......D.3.." ".E2D5A......7CF." "..7..9..A51..4.." "9....DC1.4..E..5" , // http://janko.at/Raetsel/Sudoku/586.a.htm // 74 "8D...6E...A2...." "E9.6....4..D.537" "..539C.2..7.A4.." "..B2G..5......6D" ".F....G9CB84...." "21.D.F5..7.EB.G6" "983..47.65...A.2" ".7.C6....A..3954" "C698..1....54.7." "F.A...46.82..D9G" "42.5B.C..3G.6.8F" "....5E28F9....A." "7B......G..1C3.." "..F4.5..B.3AG6.." "35E.C..A....7.49" "....D1...FC...25" , // http://janko.at/Raetsel/Sudoku/587.a.htm // 75 "6D.5F.B83..7...." ".F.761...854.A.." "39.8.D..B..EF.6." "..E.3.956F...CB1" "F65......GBA...2" "...3.6C7D9...8.B" "..DE..82F.7...5." "B.7.DF....3.619." ".A9B.5....81.F.6" ".3...E.BG5..12.." "C.G...DF7B9.A..." "5...1C6......B84" "7E6...F91A.B.3.." ".5.9A..D..6.B.2E" "..A.BG5...F97.1." "....2..65E.8C.AF" , // http://janko.at/Raetsel/Sudoku/588.a.htm // 76 "F.....8.43..BGD6" "6E..G29....C3.7." "2.1..D7.5.E..C.." "89.4...C7.612..." ".1.F..DAEB5...8." "..6AF34...D..E1." "E...B..5..8G.493" "7.892....4.3D..." "...1E.A....F63.C" "D6E.89..G..5...1" ".G3..F...91E78.." ".F...1GB36..E.A." "...87G.6C...4.FA" "..7..8.1.FB..6.2" ".D.GA....134..CE" "C2A6..F3.5.....D" , // http://janko.at/Raetsel/Sudoku/589.a.htm // 77 "...439.27..5..G." "5C67...A93...2D." ".3B...1D...2.78." "...2.G7.8EA.3.5F" "E.C.A23....D...7" "...D.B..G7F81..6" ".G.1.68.2A.ECD.." "F8.6.4G......AE5" "643......DB.F.2E" "..586.4C.F2.D.B." "B..F8A2G..3.7..." "7...E....894.C.A" "D7.3.1B4.CE.9..." ".F4.9...B2...6C." ".BG...67D...4E13" ".6..F..31.4AB..." , // http://janko.at/Raetsel/Sudoku/590.a.htm // 78 ".1B.....2.59F.6G" "G.2341A...BF...." "C.E8....3..D.24." "F....9E..1...B38" "..1.F45.6.3.2..9" "3..E.8C.5D..1..." "....DB..A8...FE3" ".4.93.1.E..G.8D." ".GF.C..7.5.69.8." "BDC...F1..A8...." "...5..94.21.G..C" "E..1.5.8.FC3.D.." "1B4...8..92....6" ".A8.9..C....45.B" "....12...6853A.F" "5C.27A.B.....91." , // http://janko.at/Raetsel/Sudoku/591.a.htm // 79 "A57...8E4......9" ".4C85.6....9.E3B" ".E1...3G657..AC8" "...F.1.9.8EA5.7." ".8.5.7...4F...2." "..9316....BG8..." "..E2A..4.....D97" "F.4....856..G1.3" "6.84..ECB....F.5" "5FA.....C..637.." "...7F4....1528.." ".2...35...8.C.1." ".9.13E2.8.4.A..." "BD2..G4FAC...98." "8G5.C....D.EF3B." "4......57B...2G6" , // http://janko.at/Raetsel/Sudoku/592.a.htm // 80 "..8.A.F.B97.1.6." "1B79...6.....8E." "..E3..928...D.5." "26..8.B....17..." "91..6A2..B3..D.." ".F..37.52.GD.4.." "3.679...5.EF...A" "4.B..FC..16...G5" "73...8A..5D..F.1" "5...FC.3...98G.E" "..F.D5.13.A8..B." "..A..B6..2FG..7D" "...6B....E.2..1C" ".4.F...A1D..GE.." ".A2.....G...4638" ".7.G.28F.6.3.A.." , // http://janko.at/Raetsel/Sudoku/593.a.htm // 81 ".2ED.4...C...F.." ".8.FE.6.1.....A4" "A..7.8F.29.B...C" "....3GCB...5.87D" "..45DA..B7F3C.6." "....G...4..CA2.5" "2.7.F..CG...34B." ".ED.B54381..G..." "...4..825GBE.3F." ".B5G...63..F.C.1" "1.F27..E...4...." ".D.84FG5..167B.." "3C1.2...DB8G...." "D...6.59.F3.8..2" "4G.....F.A.71.C." "..8...B...9.ED3." , // http://janko.at/Raetsel/Sudoku/594.a.htm // 82 "5....E...7B..CF2" "AF.467....3...D." "D.E.C.3....8.7.." "....8..DA6.E..5." "..3B....4.A.EF1." "69..B.D.3.....C7" "1..G...49.C..6.." "...D12G5FE..B..." "...7..93285AF..." "..8..4.76...2..G" "96.....F.3.B..84" ".AB3.G.6....95.." ".1..F.69E..2...." "..9.G....F.3.2.E" ".E...D....95G.BF" "2G7..C5...4....3" , // http://janko.at/Raetsel/Sudoku/595.a.htm // 83 ".3.B8..C61...2.." ".E.2...F..4.1A67" "71D...A...C..B.." ".6...92D.B.3..45" "...8A...C.F4...3" ".F9.75E4..B.6..." "5..1...8..6.4F.." "4...C....EA.B.2G" "2D.7.E5....6...1" "..BA.D..9...G..8" "...E.1..G2DF.59." "6...4C.B...73..." "A2..B.C.46E...7." "..1..2...9...8AD" "DC75.A..3...E.B." "..8...GEA..C2.5." , // http://janko.at/Raetsel/Sudoku/596.a.htm // 84 "B62...9...1...G7" "C.....7.6..A.1.9" ".1....A8..7.2..3" "..A831.CG2..E..." ".8..92.A..GD4..." "G.C.D8..F.529..." "...4.........D6A" ".5.B.C.17..3G8.." "..E12..9D.B.6.8." "9C7.........5..." "...A54.7..2C.F.G" "...FCD..4.A5..9." "...9..1E2.F83C.." "1..7.9..A3....D." "2.3.8..B.5.....6" "EB...3...7...G12" , // http://janko.at/Raetsel/Sudoku/597.a.htm // 85 "..6..1..4..F3.A." "7E..6G.3....FC.." "BC3..FD.6.9.G..2" ".....4E.CG3.B..." "1.E..C.....2.A.." "...AE6...4F..9.3" ".8.2..3F.C.1...." "34..8...B57..EC." ".B9..3CD...8..E5" "....9.F.GA..4.1." "A.4..E2...6BC..." "..8.A.....E..7.B" "...C.2A6.EB....." "E..8.9.5.3C..62G" "..B9....2.GD..5C" ".3.5C..E..1..4.." , // http://janko.at/Raetsel/Sudoku/598.a.htm // 86 ".FA..5...B7..E.6" "18....4B...C..G." "..G.7..CF....8.5" ".B9CG8.........." ".D..A.G..85....E" "69..3...1...C5.." "7.4B....G.A.2..F" "..8.5B6D..27...." "....8G..EC61.D.." "3..6.C.7....91.8" "..DF...5...9..73" "8....6B..2.5..E." "..........14EFD." "9.6....AD..F.7.." ".E..6...29....1C" "G.2..EF...C..4B." , // http://janko.at/Raetsel/Sudoku/599.a.htm // 87 ".3..6GF..C8....." "G..9.B.8...5.A74" "7..8.2..B..D...." ".EA.....3.6..9B." "..F.2....3AG...." "E7...........39G" ".9.A..31E6..FC.." "4.3..D.9C.B....E" "6....8.4A.2..G.C" "..G3..CFD9..4.A." "A85...........FB" "....5A7....6.2.." ".24..7.D.....16." "....1..3..C.2..8" "1A7.C...6.3.E..9" ".....6E..1F2..3." , // http://janko.at/Raetsel/Sudoku/600.a.htm // 88 "....47.....9B.1." "..5..9F2.6....43" "B..3.....E24..9." "..9.....A57..2.." ".DA4E..7...C.F.." ".1.6..4.E....8.B" "....81BF..4.5..7" "...F9A....D..E.4" "5.2..3....A71..." "6..C.B..G9FE...." "7.8....9.D..C.3." "..G.6...1..3E45." "..F..E8D.....A.." ".2..741.....3..8" "D6....5.92B..1.." ".A.EB.....C6....", // 89 //".N..JG..O7591...8I....L.." "BNDAJG62O7591KHF8IP34CLME" "FG.M.B8...P.E...CJ..H...." "...........G.4.H.D.O.NJA2" ".....J.EN4.L6MA.B.2......" "HE..2..DC.....F4KMA.B.9O8" "M....62...47C19......E5.." ".I2.8M.JGL...ADN..K..3.F7" "..H3.5..89....I.J.....NL." "1B..9.FAP.6.N....537.H..O" "......1..N...O...LC.68.PG" "KOA.FNBH.....7.C.....M..6" "45.ECP.I..N.F.J1...MK.79." "I.L..8.O..9.P...A...2.1J." "..621.D.M.....B8LG..P..CH" ".HP.N7E.L1....3..B..O.G45" "....BIO....5.C.P...FN48E." "...FL.....2.DH..17..59O.." "..I.MF..2G.N...A6O.HC.PB." "72.1..L...IM.96E.45G....." "..9...7M..A.O...I...L...." ".C.JA.........1.....E.48." "O.BI.......PHL.6..1....5C" "G6M...N4FI8...K..H.E....." ".L..4.917....BE.G8F.M.I.." "8F......5.O3..4...9.....K", // 90 //".N..JG..O7591...8I....L.." ".ND.JG6.O7591..F8IP.4.LM." "FG.M.B8...P.E...CJ..H...." "...........G.4.H.D.O.NJA2" ".....J.EN4.L6MA.B.2......" "HE..2..DC.....F4KMA.B.9O8" "M....62...47C19......E5.." ".I2.8M.JGL...ADN..K..3.F7" "..H3.5..89....I.J.....NL." "1B..9.FAP.6.N....537.H..O" "......1..N...O...LC.68.PG" "KOA.FNBH.....7.C.....M..6" "45.ECP.I..N.F.J1...MK.79." "I.L..8.O..9.P...A...2.1J." "..621.D.M.....B8LG..P..CH" ".HP.N7E.L1....3..B..O.G45" "....BIO....5.C.P...FN48E." "...FL.....2.DH..17..59O.." "..I.MF..2G.N...A6O.HC.PB." "72.1..L...IM.96E.45G....." "..9...7M..A.O...I...L...." ".C.JA.........1.....E.48." "O.BI.......PHL.6..1....5C" "G6M...N4FI8...K..H.E....." ".L..4.917....BE.G8F.M.I.." "8F......5.O3..4...9.....K" }; /// The number of instances const unsigned int n_examples = sizeof(examples)/sizeof(char*); /// The size of an instance int example_size(const char *s) { int l = std::strlen(s); int res = static_cast(std::sqrt(std::sqrt(static_cast(l)))); assert(res*res*res*res == l); return res; } /// Return value at position (\a i,\a j) in the example \a s of size \a n int sudokuField(const char *s, int n, int i, int j) { assert(example_size(s) == std::sqrt(static_cast(n))); assert(i >= 0 && i < n); assert(j >= 0 && j < n); char c = s[j*n + i]; if (!std::isalnum(c)) return 0; if (std::isdigit(c)) return c - '0'; if (std::islower(c)) c = static_cast(std::toupper(c)); // std::alpha(c) == true && std::isupper(c) int res = (c - 'A') + 10; if (res > n) return 0; else return res; } //@} } // STATISTICS: example-any gecode-4.2.1/examples/tsp.cpp0000755000175000010010000002703012166527420015223 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2007 * * Bugfixes provided by: * Geoffrey Chu * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include using namespace Gecode; /// Support for %TSP instances namespace { /// This instance is taken from SICStus Prolog const int PA_n = 7; const int PA_d[PA_n*PA_n] = { 0,205,677,581,461,878,345, 205,0,882,427,390,1105,540, 677,882,0,619,316,201,470, 581,427,619,0,412,592,570, 461,390,316,412,0,517,190, 878,1105,201,592,517,0,691, 345,540,470,570,190,691,0 }; /// This instance is taken from SICStus Prolog const int PB_n = 10; const int PB_d[PB_n*PB_n] = { 2,4,4,1,9,2,4,4,1,9, 2,9,5,5,5,2,9,5,5,5, 1,5,2,3,3,1,5,2,3,3, 2,6,8,9,5,2,6,8,9,5, 3,7,1,6,4,3,7,1,6,4, 1,2,4,1,7,1,2,4,1,7, 3,5,2,7,6,3,5,2,7,6, 2,7,9,5,5,2,7,9,5,5, 3,9,7,3,4,3,9,7,3,4, 4,1,5,9,2,4,1,5,9,2 }; /// This instance is br17.atsp from TSPLIB const int PC_n = 17; const int PC_d[PC_n*PC_n] = { 0,3,5,48,48,8,8,5,5,3,3,0,3,5,8,8,5, 3,0,3,48,48,8,8,5,5,0,0,3,0,3,8,8,5, 5,3,0,72,72,48,48,24,24,3,3,5,3,0,48,48,24, 48,48,74,0,0,6,6,12,12,48,48,48,48,74,6,6,12, 48,48,74,0,0,6,6,12,12,48,48,48,48,74,6,6,12, 8,8,50,6,6,0,0,8,8,8,8,8,8,50,0,0,8, 8,8,50,6,6,0,0,8,8,8,8,8,8,50,0,0,8, 5,5,26,12,12,8,8,0,0,5,5,5,5,26,8,8,0, 5,5,26,12,12,8,8,0,0,5,5,5,5,26,8,8,0, 3,0,3,48,48,8,8,5,5,0,0,3,0,3,8,8,5, 3,0,3,48,48,8,8,5,5,0,0,3,0,3,8,8,5, 0,3,5,48,48,8,8,5,5,3,3,0,3,5,8,8,5, 3,0,3,48,48,8,8,5,5,0,0,3,0,3,8,8,5, 5,3,0,72,72,48,48,24,24,3,3,5,3,0,48,48,24, 8,8,50,6,6,0,0,8,8,8,8,8,8,50,0,0,8, 8,8,50,6,6,0,0,8,8,8,8,8,8,50,0,0,8, 5,5,26,12,12,8,8,0,0,5,5,5,5,26,8,8,0 }; /// This instance is ftv33.atsp from TSPLIB const int PD_n = 34; const int PD_d[PD_n*PD_n] = { 0,26,82,65,100,147,134,69,117,42,89,125,38,13,38,31,22,103, 143,94,104,123,98,58,38,30,67,120,149,100,93,162,62,66,66,0, 56,39,109,156,140,135,183,108,155,190,104,79,104,97,88,130,176,121, 131,150,125,85,65,57,94,147,160,80,67,189,128,40,43,57,0,16, 53,100,84,107,155,85,132,168,81,56,81,74,65,146,186,137,147,166, 141,101,81,73,110,163,164,102,71,205,105,62,27,41,62,0,97,144, 131,96,144,69,116,152,65,40,65,58,49,130,170,121,131,150,125,85, 65,57,94,147,166,86,73,189,89,46,109,135,161,174,0,47,34,54, 102,67,114,175,97,96,128,135,131,198,193,203,213,232,207,167,147,139, 176,229,222,204,148,235,60,175,157,171,114,130,60,0,40,114,162,127, 174,235,157,156,188,188,179,258,253,251,239,258,203,215,195,187,172,207, 175,157,101,295,120,133,143,169,132,148,34,31,0,88,133,101,148,209, 131,130,162,169,165,232,227,237,247,266,221,201,181,173,190,225,193,175, 119,269,94,151,95,121,177,160,54,101,88,0,48,53,100,158,83,82, 114,121,117,184,179,189,199,218,193,153,133,125,162,215,244,195,188,221, 46,161,79,105,161,144,91,138,125,37,0,37,53,114,67,66,98,105, 101,137,132,149,183,202,177,137,117,109,146,199,228,179,172,174,57,145, 42,68,124,107,67,114,101,27,75,0,47,108,30,29,61,68,64,131, 126,136,146,165,140,100,80,72,109,162,191,142,135,168,20,108,83,109, 165,148,108,155,142,68,88,41,0,61,71,70,102,109,105,84,79,96, 144,163,175,141,121,113,150,203,232,183,176,121,61,149,204,230,286,269, 216,255,237,162,125,162,123,0,192,191,223,230,226,144,139,156,184,165, 215,249,242,234,251,282,332,297,297,113,182,270,38,64,120,103,88,135, 122,57,105,30,77,87,0,25,31,38,47,110,105,122,142,161,136,96, 76,68,105,158,187,138,131,147,50,104,13,39,95,78,87,134,121,56, 104,29,76,112,25,0,32,39,35,116,130,107,117,136,111,71,51,43, 80,133,162,113,106,172,49,79,38,48,104,87,119,166,153,88,136,61, 108,118,31,32,0,7,16,123,136,114,124,143,118,78,58,50,87,140, 169,120,115,178,81,88,31,41,97,80,115,162,149,84,132,57,104,114, 27,28,7,0,9,116,132,107,117,136,111,71,51,43,80,133,162,113, 108,174,77,81,22,32,88,71,122,169,156,91,139,64,111,123,36,35, 16,9,0,107,141,98,108,127,102,62,42,34,71,124,153,104,99,166, 84,72,108,134,190,173,133,180,167,93,113,66,85,60,96,95,127,134, 130,0,46,63,116,135,147,166,146,138,175,221,257,208,201,120,86,174, 127,153,209,192,152,199,186,112,132,85,104,79,115,114,146,153,149,19, 0,17,70,89,101,135,148,157,137,175,219,183,220,85,105,193,153,179, 235,218,178,225,212,138,158,111,130,105,141,140,172,179,175,45,57,0, 53,72,84,118,131,183,120,158,202,166,241,68,131,214,179,165,199,204, 243,290,277,203,223,176,195,165,206,192,199,192,183,110,112,82,0,19, 31,65,78,149,67,105,149,113,188,95,196,161,212,205,239,244,237,284, 271,197,217,170,189,146,200,199,231,232,223,104,93,63,40,0,71,105, 118,189,107,117,167,153,228,76,190,201,148,134,168,173,212,259,246,172, 192,145,164,139,175,161,168,161,152,79,125,70,36,55,0,34,47,118, 36,89,118,82,157,131,165,130,153,146,180,185,178,225,212,138,158,111, 130,105,141,140,172,173,164,45,91,36,46,65,77,0,59,130,48,101, 130,94,169,104,131,142,173,166,200,205,198,245,232,158,178,131,150,125, 161,160,192,193,184,65,111,56,66,85,97,20,0,150,68,121,150,114, 189,124,151,162,30,16,72,55,125,172,156,99,147,72,119,133,68,43, 50,43,34,73,119,64,74,93,68,28,8,0,37,90,119,70,83,132, 92,56,112,98,132,137,185,232,216,181,223,154,195,170,150,125,132,125, 116,110,156,101,67,86,31,65,78,82,0,53,82,46,121,162,174,94, 144,130,164,169,217,256,225,213,261,186,233,234,182,157,164,157,148,174, 209,165,131,116,95,129,122,114,93,0,50,78,147,192,206,126,94,80, 114,119,167,214,198,163,211,136,183,197,132,107,114,107,98,137,183,128, 110,129,74,92,72,64,43,57,0,28,103,196,156,76,66,52,101,91, 154,201,185,135,183,108,155,169,104,79,86,79,70,109,155,100,82,101, 46,64,44,36,15,68,97,0,90,168,128,63,113,108,70,86,84,131, 115,138,186,151,198,225,151,126,142,135,126,165,211,156,138,157,102,120, 100,92,71,124,93,56,0,224,144,32,146,172,228,211,171,218,205,131, 151,104,123,80,134,133,165,172,168,38,27,44,75,76,106,140,153,176, 142,180,224,188,239,0,124,212,102,128,184,167,61,108,95,7,55,60, 107,165,90,89,121,128,124,191,186,196,206,225,200,160,140,132,169,222, 251,202,195,228,0,168,81,95,38,54,91,138,122,145,193,123,170,206, 119,94,119,112,103,184,224,175,165,184,129,139,119,111,98,151,120,83, 27,243,143,0 }; /// Problem instance class Problem { private: const int _n; ///< Size const int* _d; ///< Distances public: /// Initialize problem instance Problem(const int n, const int* d); /// Return size of instance int size(void) const; /// Return distance between node \a i and \a j int d(int i, int j) const; /// Return distances const int* d(void) const; /// Return estimate for maximal cost of a path int max(void) const; }; inline Problem::Problem(const int n, const int* d) : _n(n), _d(d) {} inline int Problem::size(void) const { return _n; } inline int Problem::d(int i, int j) const { return _d[i*_n+j]; } inline const int* Problem::d(void) const { return _d; } inline int Problem::max(void) const { int m=0; for (int i=_n*_n; i--; ) m = std::max(m,_d[i]); return m*_n; } Problem PA(PA_n,PA_d); Problem PB(PB_n,PB_d); Problem PC(PC_n,PC_d); Problem PD(PD_n,PD_d); Problem ps[] = {PA,PB,PC,PD}; const unsigned int ps_n = sizeof(ps) / sizeof(Problem); } /** * \brief %Example: Travelling salesman problem (%TSP) * * Simple travelling salesman problem instances. Just meant * as a test for circuit. * * \ingroup Example * */ class TSP : public IntMinimizeScript { protected: /// Problem instance to be solved Problem p; /// Successor edges IntVarArray succ; /// Total cost of travel IntVar total; public: /// Actual model TSP(const SizeOptions& opt) : p(ps[opt.size()]), succ(*this, p.size(), 0, p.size()-1), total(*this, 0, p.max()) { int n = p.size(); // Cost matrix IntArgs c(n*n, p.d()); for (int i=n; i--; ) for (int j=n; j--; ) if (p.d(i,j) == 0) rel(*this, succ[i], IRT_NQ, j); // Cost of each edge IntVarArgs costs(*this, n, Int::Limits::min, Int::Limits::max); // Enforce that the succesors yield a tour with appropriate costs circuit(*this, c, succ, costs, total, opt.icl()); // Just assume that the circle starts forwards { IntVar p0(*this, 0, n-1); element(*this, succ, p0, 0); rel(*this, p0, IRT_LE, succ[0]); } // First enumerate cost values, prefer those that maximize cost reduction branch(*this, costs, INT_VAR_REGRET_MAX_MAX(), INT_VAL_SPLIT_MIN()); // Then fix the remaining successors branch(*this, succ, INT_VAR_MIN_MIN(), INT_VAL_MIN()); } /// Return solution cost virtual IntVar cost(void) const { return total; } /// Constructor for cloning \a s TSP(bool share, TSP& s) : IntMinimizeScript(share,s), p(s.p) { succ.update(*this, share, s.succ); total.update(*this, share, s.total); } /// Copy during cloning virtual Space* copy(bool share) { return new TSP(share,*this); } /// Print solution virtual void print(std::ostream& os) const { bool assigned = true; for (int i=0; i "; i=succ[i].val(); } while (i != 0); os << 0 << std::endl; os << "\tCost: " << total << std::endl; } else { os << "\tTour: " << std::endl; for (int i=0; i " << succ[i] << std::endl; } os << "\tCost: " << total << std::endl; } } }; /** \brief Main-function * \relates TSP */ int main(int argc, char* argv[]) { SizeOptions opt("TSP"); opt.solutions(0); opt.icl(ICL_DOM); opt.parse(argc,argv); if (opt.size() >= ps_n) { std::cerr << "Error: size must be between 0 and " << ps_n-1 << std::endl; return 1; } IntMinimizeScript::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/warehouses.cpp0000755000175000010010000001253412166527420016605 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2005 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace Gecode; /// Number of warehouses const int n_warehouses = 5; /// Number of stores const int n_stores = 10; /// Fixed cost for one warehouse const int c_fixed = 30; /// Capacity of a single warehouse const int capacity[n_warehouses] = { 1, 4, 2, 1, 3 }; /// Cost for supply a store by a warehouse const int c_supply[n_stores][n_warehouses] = { {20, 24, 11, 25, 30}, {28, 27, 82, 83, 74}, {74, 97, 71, 96, 70}, { 2, 55, 73, 69, 61}, {46, 96, 59, 83, 4}, {42, 22, 29, 67, 59}, { 1, 5, 73, 59, 56}, {10, 73, 13, 43, 96}, {93, 35, 63, 85, 46}, {47, 65, 55, 71, 95} }; /** * \brief %Example: Locating warehouses * * A company needs to construct warehouses to supply stores with * goods. Each warehouse possibly to be constructed has a certain * capacity defining how many stores it can supply. Constructing a * warehouse incurs a fixed cost. Costs for transportation from * warehouses to stores depend on the locations of warehouses and * stores. * * Determine which warehouses should be constructed and which * warehouse should supply which store such that overall cost * (transportation cost plus construction cost) is smallest. * * Taken from: * Pascal Van Hentenryck, The OPL Optmization Programming Language, * The MIT Press, 1999. * * See also problem 34 at http://www.csplib.org/. * * Note that "Modeling and Programming with Gecode" uses this example * as a case study. * * \ingroup Example * */ class Warehouses : public IntMinimizeScript { protected: /// Which warehouse supplies a store IntVarArray supplier; /// Is a warehouse open (warehouse needed) BoolVarArray open; /// Cost of a store IntVarArray c_store; /// Total cost IntVar c_total; public: /// Actual model Warehouses(const Options&) : supplier(*this, n_stores, 0, n_warehouses-1), open(*this, n_warehouses, 0, 1), c_store(*this, n_stores) { // A warehouse is open, if it supplies to a store for (int s=0; s(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/examples/word-square.cpp0000644000175000010010000001172712166527420016671 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Håkan Kjellerstrand * Mikael Lagerkvist * Christian Schulte * * Copyright: * Håkan Kjellerstrand, 2009 * Mikael Lagerkvist, 2009 * Christian Schulte, 2009 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include "examples/scowl.hpp" using namespace Gecode; /** * \brief %Example: Word-square puzzle * * From http://en.wikipedia.org/wiki/Word_square: * A word square is a special case of acrostic. It consists of a set of words, * all having the same number of letters as the total number of words (the * "order" of the square); when the words are written out in a square grid * horizontally, the same set of words can be read vertically. * * \ingroup Example * */ class WordSquare : public Script { protected: /// Length of words const int w_l; /// The array of letters IntVarArray letters; public: /// Branching variants enum { BRANCH_WORDS, ///< Branch on word variables BRANCH_LETTERS, ///< Branch on letter variables }; /// Actual model WordSquare(const SizeOptions& opt) : w_l(opt.size()), letters(*this, w_l*w_l) { // Initialize letters Matrix ml(letters, w_l, w_l); for (int i=0; i ml(letters, w_l, w_l); for (int i=0; i(ml(i,j).val()); } else { os << "."; } os << std::endl; } os << std::endl; } }; /** \brief Main-function * \relates WordSquare */ int main(int argc, char* argv[]) { FileSizeOptions opt("WordSquare"); opt.size(6); opt.branching(WordSquare::BRANCH_LETTERS); opt.branching(WordSquare::BRANCH_WORDS, "words"); opt.branching(WordSquare::BRANCH_LETTERS, "letters"); opt.parse(argc,argv); dict.init(opt.file()); if (opt.size() > static_cast(dict.len())) { std::cerr << "Error: size must be between 0 and " << dict.len() << std::endl; return 1; } Script::run(opt); return 0; } // STATISTICS: example-any gecode-4.2.1/gecode/0000755000175000010010000000000012236131710013303 5ustar schulteNonegecode-4.2.1/gecode/driver/0000755000175000010010000000000012236131677014612 5ustar schulteNonegecode-4.2.1/gecode/driver/options.cpp0000755000175000010010000003176612227071620017020 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2004 * * Last modified: * $Date: 2013-10-15 00:43:28 +0200 (Tue, 15 Oct 2013) $ by $Author: tack $ * $Revision: 14024 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include #include namespace Gecode { namespace Driver { /* * Option baseclass * */ char* BaseOption::strdup(const char* s) { if (s == NULL) return NULL; char* d = heap.alloc(static_cast(strlen(s)+1)); (void) strcpy(d,s); return d; } void BaseOption::strdel(const char* s) { if (s == NULL) return; heap.rfree(const_cast(s)); } char* BaseOption::argument(int argc, char* argv[]) const { if ((argc < 2) || strcmp(argv[1],opt)) return NULL; if (argc == 2) { std::cerr << "Missing argument for option \"" << opt << "\"" << std::endl; exit(EXIT_FAILURE); } return argv[2]; } BaseOption::BaseOption(const char* o, const char* e) : opt(strdup(o)), exp(strdup(e)) {} BaseOption::~BaseOption(void) { strdel(opt); strdel(exp); } StringValueOption::StringValueOption(const char* o, const char* e, const char* v) : BaseOption(o,e), cur(strdup(v)) {} void StringValueOption::value(const char* v) { strdel(cur); cur = strdup(v); } int StringValueOption::parse(int argc, char* argv[]) { if (char* a = argument(argc,argv)) { cur = strdup(a); return 2; } return 0; } void StringValueOption::help(void) { std::cerr << '\t' << opt << " (string) default: " << ((cur == NULL) ? "NONE" : cur) << std::endl << "\t\t" << exp << std::endl; } StringValueOption::~StringValueOption(void) { strdel(cur); } void StringOption::add(int v, const char* o, const char* h) { Value* n = new Value; n->val = v; n->opt = strdup(o); n->help = strdup(h); n->next = NULL; if (fst == NULL) { fst = n; } else { lst->next = n; } lst = n; } int StringOption::parse(int argc, char* argv[]) { if (char* a = argument(argc,argv)) { for (Value* v = fst; v != NULL; v = v->next) if (!strcmp(a,v->opt)) { cur = v->val; return 2; } std::cerr << "Wrong argument \"" << a << "\" for option \"" << opt << "\"" << std::endl; exit(EXIT_FAILURE); } return 0; } void StringOption::help(void) { if (fst == NULL) return; std::cerr << '\t' << opt << " ("; const char* d = NULL; for (Value* v = fst; v != NULL; v = v->next) { std::cerr << v->opt << ((v->next != NULL) ? ", " : ""); if (v->val == cur) d = v->opt; } std::cerr << ")"; if (d != NULL) std::cerr << " default: " << d; std::cerr << std::endl << "\t\t" << exp << std::endl; for (Value* v = fst; v != NULL; v = v->next) if (v->help != NULL) std::cerr << "\t\t " << v->opt << ": " << v->help << std::endl; } StringOption::~StringOption(void) { Value* v = fst; while (v != NULL) { strdel(v->opt); strdel(v->help); Value* n = v->next; delete v; v = n; } } int IntOption::parse(int argc, char* argv[]) { if (char* a = argument(argc,argv)) { cur = atoi(a); return 2; } return 0; } void IntOption::help(void) { std::cerr << '\t' << opt << " (int) default: " << cur << std::endl << "\t\t" << exp << std::endl; } int UnsignedIntOption::parse(int argc, char* argv[]) { if (char* a = argument(argc,argv)) { cur = static_cast(atoi(a)); return 2; } return 0; } void UnsignedIntOption::help(void) { std::cerr << '\t' << opt << " (unsigned int) default: " << cur << std::endl << "\t\t" << exp << std::endl; } int DoubleOption::parse(int argc, char* argv[]) { if (char* a = argument(argc,argv)) { cur = atof(a); return 2; } return 0; } void DoubleOption::help(void) { using namespace std; cerr << '\t' << opt << " (double) default: " << cur << endl << "\t\t" << exp << endl; } int BoolOption::parse(int argc, char* argv[]) { if ((argc < 2) || strcmp(argv[1],opt)) return 0; if (argc == 2) { // Option without argument cur = true; return 1; } else if (!strcmp(argv[2],"true") || !strcmp(argv[2],"1")) { cur = true; return 2; } else if (!strcmp(argv[2],"false") || !strcmp(argv[2],"0")) { cur = false; return 2; } else { // Option without argument cur = true; return 1; } return 0; } void BoolOption::help(void) { using namespace std; cerr << '\t' << opt << " (optional: false, 0, true, 1) default: " << (cur ? "true" : "false") << endl << "\t\t" << exp << endl; } } void BaseOptions::add(Driver::BaseOption& o) { o.next = NULL; if (fst == NULL) { fst=&o; } else { lst->next=&o; } lst=&o; } BaseOptions::BaseOptions(const char* n) : fst(NULL), lst(NULL), _name(Driver::BaseOption::strdup(n)) {} void BaseOptions::name(const char* n) { Driver::BaseOption::strdel(_name); _name = Driver::BaseOption::strdup(n); } void BaseOptions::help(void) { std::cerr << "Gecode configuration information:" << std::endl << " - Version: " << GECODE_VERSION << std::endl << " - Variable types: "; #ifdef GECODE_HAS_INT_VARS std::cerr << "BoolVar IntVar "; #endif #ifdef GECODE_HAS_SET_VARS std::cerr << "SetVar "; #endif #ifdef GECODE_HAS_FLOAT_VARS std::cerr << "FloatVar " << std::endl << " - Trigonometric and transcendental float constraints: "; #ifdef GECODE_HAS_MPFR std::cerr << "enabled"; #else std::cerr << "disabled"; #endif #endif std::cerr << std::endl; std::cerr << " - Thread support: "; #ifdef GECODE_HAS_THREADS if (Support::Thread::npu() == 1) std::cerr << "enabled (1 processing unit)"; else std::cerr << "enabled (" << Support::Thread::npu() << " processing units)"; #else std::cerr << "disabled"; #endif std::cerr << std::endl << " - Gist support: "; #ifdef GECODE_HAS_GIST std::cerr << "enabled"; #else std::cerr << "disabled"; #endif std::cerr << std::endl << std::endl << "Options for " << name() << ":" << std::endl << "\t-help, --help, -?" << std::endl << "\t\tprint this help message" << std::endl; for (Driver::BaseOption* o = fst; o != NULL; o = o->next) o->help(); } void BaseOptions::parse(int& argc, char* argv[]) { int c = argc; char** v = argv; next: for (Driver::BaseOption* o = fst; o != NULL; o = o->next) if (int a = o->parse(c,v)) { c -= a; v += a; goto next; } if (c >= 2) { if (!strcmp(v[1],"-help") || !strcmp(v[1],"--help") || !strcmp(v[1],"-?")) { help(); exit(EXIT_SUCCESS); } } // Copy remaining arguments argc = c; for (int i=1; i(atoi(argv[1]))); } InstanceOptions::InstanceOptions(const char* e) : Options(e), _inst(NULL) {} void InstanceOptions::instance(const char* s) { Driver::BaseOption::strdel(_inst); _inst = Driver::BaseOption::strdup(s); } void InstanceOptions::help(void) { Options::help(); std::cerr << "\t(string) default: " << instance() << std::endl << "\t\twhich instance for script" << std::endl; } void InstanceOptions::parse(int& argc, char* argv[]) { Options::parse(argc,argv); if (argc < 2) return; instance(argv[1]); } InstanceOptions::~InstanceOptions(void) { Driver::BaseOption::strdel(_inst); } } // STATISTICS: driver-any gecode-4.2.1/gecode/driver/options.hpp0000755000175000010010000002341712166527420017025 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2004 * * Last modified: * $Date: 2013-07-08 14:22:40 +0200 (Mon, 08 Jul 2013) $ by $Author: schulte $ * $Revision: 13820 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include namespace Gecode { namespace Driver { /* * String option * */ inline const char* StringValueOption::value(void) const { return cur; } /* * String option * */ inline StringOption::StringOption(const char* o, const char* e, int v) : BaseOption(o,e), cur(v), fst(NULL), lst(NULL) {} inline void StringOption::value(int v) { cur = v; } inline int StringOption::value(void) const { return cur; } /* * Integer option * */ inline IntOption::IntOption(const char* o, const char* e, int v) : BaseOption(o,e), cur(v) {} inline void IntOption::value(int v) { cur = v; } inline int IntOption::value(void) const { return cur; } /* * Unsigned integer option * */ inline UnsignedIntOption::UnsignedIntOption(const char* o, const char* e, unsigned int v) : BaseOption(o,e), cur(v) {} inline void UnsignedIntOption::value(unsigned int v) { cur = v; } inline unsigned int UnsignedIntOption::value(void) const { return cur; } /* * Double option * */ inline DoubleOption::DoubleOption(const char* o, const char* e, double v) : BaseOption(o,e), cur(v) {} inline void DoubleOption::value(double v) { cur = v; } inline double DoubleOption::value(void) const { return cur; } /* * Bool option * */ inline BoolOption::BoolOption(const char* o, const char* e, bool v) : BaseOption(o,e), cur(v) {} inline void BoolOption::value(bool v) { cur = v; } inline bool BoolOption::value(void) const { return cur; } } /* * Options * */ inline const char* BaseOptions::name(void) const { return _name; } /* * Model options * */ inline void Options::model(int v) { _model.value(v); } inline void Options::model(int v, const char* o, const char* h) { _model.add(v,o,h); } inline int Options::model(void) const { return _model.value(); } inline void Options::symmetry(int v) { _symmetry.value(v); } inline void Options::symmetry(int v, const char* o, const char* h) { _symmetry.add(v,o,h); } inline int Options::symmetry(void) const { return _symmetry.value(); } inline void Options::propagation(int v) { _propagation.value(v); } inline void Options::propagation(int v, const char* o, const char* h) { _propagation.add(v,o,h); } inline int Options::propagation(void) const { return _propagation.value(); } inline void Options::icl(IntConLevel i) { _icl.value(i); } inline IntConLevel Options::icl(void) const { return static_cast(_icl.value()); } inline void Options::branching(int v) { _branching.value(v); } inline void Options::branching(int v, const char* o, const char* h) { _branching.add(v,o,h); } inline int Options::branching(void) const { return _branching.value(); } inline void Options::decay(double d) { _decay.value(d); } inline double Options::decay(void) const { return _decay.value(); } /* * Search options * */ inline void Options::search(int v) { _search.value(v); } inline void Options::search(int v, const char* o, const char* h) { _search.add(v,o,h); } inline int Options::search(void) const { return _search.value(); } inline void Options::solutions(unsigned int n) { _solutions.value(n); } inline unsigned int Options::solutions(void) const { return _solutions.value(); } inline void Options::threads(double n) { _threads.value(n); } inline double Options::threads(void) const { return _threads.value(); } inline void Options::c_d(unsigned int d) { _c_d.value(d); } inline unsigned int Options::c_d(void) const { return _c_d.value(); } inline void Options::a_d(unsigned int d) { _a_d.value(d); } inline unsigned int Options::a_d(void) const { return _a_d.value(); } inline void Options::node(unsigned int n) { _node.value(n); } inline unsigned int Options::node(void) const { return _node.value(); } inline void Options::fail(unsigned int n) { _fail.value(n); } inline unsigned int Options::fail(void) const { return _fail.value(); } inline void Options::time(unsigned int t) { _time.value(t); } inline unsigned int Options::time(void) const { return _time.value(); } inline void Options::restart(RestartMode rm) { _restart.value(rm); } inline RestartMode Options::restart(void) const { return static_cast(_restart.value()); } inline void Options::restart_base(double n) { _r_base.value(n); } inline double Options::restart_base(void) const { return _r_base.value(); } inline void Options::restart_scale(unsigned int n) { _r_scale.value(n); } inline unsigned int Options::restart_scale(void) const { return _r_scale.value(); } inline void Options::nogoods(bool b) { _nogoods.value(b); } inline bool Options::nogoods(void) const { return _nogoods.value(); } inline void Options::nogoods_limit(unsigned int l) { _nogoods_limit.value(l); } inline unsigned int Options::nogoods_limit(void) const { return _nogoods_limit.value(); } inline void Options::interrupt(bool b) { _interrupt.value(b); } inline bool Options::interrupt(void) const { return _interrupt.value(); } /* * Execution options * */ inline void Options::mode(ScriptMode sm) { _mode.value(sm); } inline ScriptMode Options::mode(void) const { return static_cast(_mode.value()); } inline void Options::samples(unsigned int s) { _samples.value(s); } inline unsigned int Options::samples(void) const { return _samples.value(); } inline void Options::iterations(unsigned int i) { _iterations.value(i); } inline unsigned int Options::iterations(void) const { return _iterations.value(); } inline void Options::print_last(bool p) { _print_last.value(p); } inline bool Options::print_last(void) const { return _print_last.value(); } inline void Options::out_file(const char *f) { _out_file.value(f); } inline const char* Options::out_file(void) const { return _out_file.value(); } inline void Options::log_file(const char* f) { _log_file.value(f); } inline const char* Options::log_file(void) const { return _log_file.value(); } #ifdef GECODE_HAS_GIST forceinline Options::_I::_I(void) : _click(heap,1), n_click(0), _solution(heap,1), n_solution(0), _move(heap,1), n_move(0), _compare(heap,1), n_compare(0) {} forceinline void Options::_I::click(Gist::Inspector* i) { _click[static_cast(n_click++)] = i; } forceinline void Options::_I::solution(Gist::Inspector* i) { _solution[static_cast(n_solution++)] = i; } forceinline void Options::_I::move(Gist::Inspector* i) { _move[static_cast(n_move++)] = i; } forceinline void Options::_I::compare(Gist::Comparator* i) { _compare[static_cast(n_compare++)] = i; } forceinline Gist::Inspector* Options::_I::click(unsigned int i) const { return (i < n_click) ? _click[i] : NULL; } forceinline Gist::Inspector* Options::_I::solution(unsigned int i) const { return (i < n_solution) ? _solution[i] : NULL; } forceinline Gist::Inspector* Options::_I::move(unsigned int i) const { return (i < n_move) ? _move[i] : NULL; } forceinline Gist::Comparator* Options::_I::compare(unsigned int i) const { return (i < n_compare) ? _compare[i] : NULL; } #endif /* * Options with additional size argument * */ inline void SizeOptions::size(unsigned int s) { _size = s; } inline unsigned int SizeOptions::size(void) const { return _size; } /* * Options with additional string argument * */ inline const char* InstanceOptions::instance(void) const { return _inst; } } // STATISTICS: driver-any gecode-4.2.1/gecode/driver/script.cpp0000755000175000010010000000563012111176400016612 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2004 * * Last modified: * $Date: 2013-02-20 17:42:40 +0100 (Wed, 20 Feb 2013) $ by $Author: schulte $ * $Revision: 13341 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include namespace Gecode { namespace Driver { void stop(Support::Timer& timer, std::ostream& os) { double t = timer.stop(); unsigned int sec = static_cast(floor(t / 1000.0)); unsigned int o_msec = static_cast (t - 1000.0*static_cast(sec)); unsigned int min = sec / 60; unsigned int o_sec = sec - 60 * min; unsigned int hour = min / 60; unsigned int o_min = min - 60 * hour; unsigned int day = hour / 24; unsigned int o_hour = hour - 24 * day; if (day) os << day << " days, "; if (o_hour) os << o_hour << ":"; if (o_hour || o_min) { if (o_hour) { os.width(2); os.fill('0'); } os << o_min << ":"; os.width(2); os.fill('0'); } os << o_sec << "."; os.width(3); os.fill('0'); os << o_msec << " (" << std::showpoint << std::fixed << std::setprecision(3) << t << " ms)"; } double am(double t[], int n) { if (n < 1) return 0.0; double s = 0; for (int i=n; i--; ) s += t[i]; return s / n; } double dev(double t[], int n) { if (n < 2) return 0.0; double m = am(t,n); double s = 0.0; for (int i=n; i--; ) { double d = t[i]-m; s += d*d; } return ::sqrt(s / (n-1)) / m; } bool CombinedStop::sigint; }} // STATISTICS: driver-any gecode-4.2.1/gecode/driver/script.hpp0000755000175000010010000003753612170643464016647 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2004 * * Last modified: * $Date: 2013-07-15 02:49:56 +0200 (Mon, 15 Jul 2013) $ by $Author: tack $ * $Revision: 13879 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include #ifndef GECODE_THREADS_WINDOWS #include #endif namespace Gecode { namespace Driver { /** * \brief Stop object based on nodes, failures, and time * */ class CombinedStop : public Search::Stop { private: Search::NodeStop* ns; ///< Used node stop object Search::FailStop* fs; ///< Used fail stop object Search::TimeStop* ts; ///< Used time stop object GECODE_DRIVER_EXPORT static bool sigint; ///< Whether search was interrupted using Ctrl-C /// Initialize stop object CombinedStop(unsigned int node, unsigned int fail, unsigned int time) : ns((node > 0) ? new Search::NodeStop(node) : NULL), fs((fail > 0) ? new Search::FailStop(fail) : NULL), ts((time > 0) ? new Search::TimeStop(time) : NULL) { sigint = false; } public: /// Reason why search has been stopped enum { SR_NODE = 1 << 0, ///< Node limit reached SR_FAIL = 1 << 1, ///< Fail limit reached SR_TIME = 1 << 2, ///< Time limit reached SR_INT = 1 << 3 ///< Interrupted by user }; /// Test whether search must be stopped virtual bool stop(const Search::Statistics& s, const Search::Options& o) { return sigint || ((ns != NULL) && ns->stop(s,o)) || ((fs != NULL) && fs->stop(s,o)) || ((ts != NULL) && ts->stop(s,o)); } /// Report reason why search has been stopped int reason(const Search::Statistics& s, const Search::Options& o) { return (((ns != NULL) && ns->stop(s,o)) ? SR_NODE : 0) | (((fs != NULL) && fs->stop(s,o)) ? SR_FAIL : 0) | (((ts != NULL) && ts->stop(s,o)) ? SR_TIME : 0) | (sigint ? SR_INT : 0); } /// Create appropriate stop-object static Search::Stop* create(unsigned int node, unsigned int fail, unsigned int time, bool intr) { if ( (!intr) && (node == 0) && (fail == 0) && (time == 0)) return NULL; else return new CombinedStop(node,fail,time); } #ifdef GECODE_THREADS_WINDOWS /// Handler for catching Ctrl-C static BOOL interrupt(DWORD t) { if (t == CTRL_C_EVENT) { sigint = true; installCtrlHandler(false,true); return true; } return false; } #else /// Handler for catching Ctrl-C static void interrupt(int) { sigint = true; installCtrlHandler(false,true); } #endif /// Install handler for catching Ctrl-C static void installCtrlHandler(bool install, bool force=false) { if (force || !sigint) { #ifdef GECODE_THREADS_WINDOWS SetConsoleCtrlHandler( (PHANDLER_ROUTINE) interrupt, install); #else std::signal(SIGINT, install ? interrupt : SIG_DFL); #endif } } /// Destructor ~CombinedStop(void) { delete ns; delete fs; delete ts; } }; /** * \brief Get time since start of timer and print user friendly time * information. */ GECODE_DRIVER_EXPORT void stop(Support::Timer& t, std::ostream& os); /** * \brief Compute arithmetic mean of \a n elements in \a t */ GECODE_DRIVER_EXPORT double am(double t[], int n); /** * \brief Compute deviation of \a n elements in \a t */ GECODE_DRIVER_EXPORT double dev(double t[], int n); /// Create cutoff object from options template inline Search::Cutoff* createCutoff(const Options& o) { switch (o.restart()) { case RM_NONE: return NULL; case RM_CONSTANT: return Search::Cutoff::constant(o.restart_scale()); case RM_LINEAR: return Search::Cutoff::linear(o.restart_scale()); case RM_LUBY: return Search::Cutoff::luby(o.restart_scale()); case RM_GEOMETRIC: return Search::Cutoff::geometric(o.restart_scale(),o.restart_base()); default: GECODE_NEVER; } return NULL; } #ifdef GECODE_HAS_GIST /** * \brief Traits class for search engines */ template class GistEngine { public: static void explore(Space* root, const Gist::Options& opt) { (void) Gist::dfs(root, opt); } }; /// Specialization for DFS template class GistEngine > { public: static void explore(S* root, const Gist::Options& opt) { (void) Gist::dfs(root, opt); } }; /// Specialization for BAB template class GistEngine > { public: static void explore(S* root, const Gist::Options& opt) { (void) Gist::bab(root, opt); } }; #endif template std::ostream& ScriptBase::select_ostream(const char* name, std::ofstream& ofs) { if (strcmp(name, "stdout") == 0) { return std::cout; } else if (strcmp(name, "stdlog") == 0) { return std::clog; } else if (strcmp(name, "stderr") == 0) { return std::cerr; } else { ofs.open(name); return ofs; } } /** * \brief Wrapper class to add engine template argument */ template class E, class T> class EngineToMeta : public E { public: EngineToMeta(T* s, const Search::Options& o) : E(s,o) {} }; template template class Engine, class Options> void ScriptBase::run(const Options& o, Script* s) { if (o.restart()==RM_NONE) { runMeta(o,s); } else { runMeta(o,s); } } template template class Engine, class Options, template class,class> class Meta> void ScriptBase::runMeta(const Options& o, Script* s) { using namespace std; ofstream sol_file, log_file; ostream& s_out = select_ostream(o.out_file(), sol_file); ostream& l_out = select_ostream(o.log_file(), log_file); try { switch (o.mode()) { case SM_GIST: #ifdef GECODE_HAS_GIST { Gist::Print
gecode-4.2.1/misc/doxygen/stylesheet.css0000644000175000010010000002175511363014576017414 0ustar schulteNonebody,html { background:#FFFFFF url(back.png) repeat-y; font-family:Arial,Helvetica,sans-serif; color:#000000; margin:0; padding:0; } #content { position:absolute; top:30px; left:60px; width:60%; padding:0 0 50px 0; color:#000000; } #contentfront { position:absolute; top:250px; left:60px; width:50%; padding:0 0 50px 0; color:#000000; } #logo { position:absolute; top:20px; left:75%; } html>body #logo { position:fixed; } #headline { position:absolute; top:15px; left:330px; width:40%; } #headlinefront { position:absolute; top:20px; left:320px; width:40%; } #footline { position:absolute; bottom:10px; left:70%; background:#FFFFFF; width:26%; border-top:1px dotted #27393E; padding:5px 0 0 0; z-index:4; } html>body #footline { position:fixed; } #navigation { position:absolute; top:120px; left:70%; width:26%; /*height:200px;*/ background:#FFFFFF; padding:0px 10px 10px 0px; /*border-left:5px solid #0b7646;*/ border-left: 1px dotted #27393E; /*border-bottom:1px dotted #27393E;*/ /*padding:0;*/ margin:0px; vertical-align:bottom; z-index:4; } html>body #navigation { position:fixed; } #navigation2 { padding:11px 0 0 15px; margin:0; z-index:5; } #news { position:absolute; top:200px; left:70%; width:200px; /*padding:0px 10px 10px 0px;*/ padding:0 19px 100px 14px; border-left:1px dotted #27393E; /*border-bottom:1px dotted #27393E;*/ z-index:2; } h3.version { text-align: center; } /* Links */ a { color:#005ba1; text-decoration: underline; } a:visited { color:#005ba1; text-decoration: none; } a:hover { background-color: #f2f2ff } a.el { color:#005ba1; text-decoration: underline; } a.el:visited { color:#005ba1; text-decoration: none; } a.anchor { color:#000000; text-decoration:none; } a.navigation { font-family:Verdana,Arial,Helvetica,sans-serif; font-size:100%; text-decoration:none; border-right:5px solid #0b7646; letter-spacing:2px; color:#0b7646; padding:0 8px 1px 8px; margin:4px 0 0 0; /*width:169px;*/ display:block; } a.navigation2 { font-family:Verdana,Arial,Helvetica,sans-serif; font-size:100%; text-decoration:none; border-right:5px solid #000000; letter-spacing:2px; color:#000000; padding:0 8px 1px 8px; margin:4px 0 0 0; display:block; } a.navigation3 { font-family:Verdana,Arial,Helvetica,sans-serif; font-size:100%; text-decoration:none; border-right:5px solid #000000; letter-spacing:2px; color:#555555; padding:0 8px 1px 8px; margin:4px 0 0 0; display:block; } a.navigation:visited { color:#0b7646; } a.navigation:hover { background:#0b7646; color:#FFFFFF; } a.navigation2:hover { background:none; } BODY,TD { font-size: 90%; } H1 { text-align: center; font-size: 130%; } H2 { font-size: 115%; } H3 { font-size: 100%; } CAPTION {} DIV.qindex { width: 100%; border: 1px solid #b0b0b0; text-align: center; margin: 2px; padding: 2px; line-height: 140%; } DIV.nav { width: 100%; border: 1px solid #b0b0b0; text-align: center; margin: 2px; padding: 2px; line-height: 140%; } DIV.navtab { border: 1px solid #b0b0b0; text-align: center; margin: 2px; margin-right: 15px; padding: 2px; } TD.navtab { font-size: 70%; } A.qindex { text-decoration: none; color: #0b7646; } A.qindex:visited { text-decoration: none; color:#07472a; } A.qindex:hover { text-decoration: none; background-color:#0b7646; color:#FFFFFF; } A.qindexHL { text-decoration: none; background-color: #6666cc; color: #ffffff; border: 1px double #9295C2; } A.qindexHL:hover { text-decoration: none; background-color:#0b7646; color:#FFFFFF; } A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff } A.el { text-decoration: none; } A.elRef { } A.code:link { text-decoration: none; font-weight: normal; color: #0000FF} A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF} A.codeRef:link { font-weight: normal; color: #0000FF} A.codeRef:visited { font-weight: normal; color: #0000FF} A:hover { text-decoration: none; background-color: #f2f2ff } DL.el { margin-left: -1cm } .fragment { font-family: Fixed, monospace; font-size: 95%; } PRE.fragment { border: 1px solid #CCCCCC; background-color: #f5f5f5; margin-top: 4px; margin-bottom: 4px; margin-left: 2px; margin-right: 8px; padding-left: 6px; padding-right: 6px; padding-top: 4px; padding-bottom: 4px; } DIV.ah { background-color: black; color: #ffffff; margin-bottom: 3px; margin-top: 3px } TD.md { background-color: #F4F4FB; } TD.mdPrefix { background-color: #F4F4FB; color: #606060; font-size: 80%; } TD.mdname1 { background-color: #F4F4FB; color: #602020; } TD.mdname { background-color: #F4F4FB; color: #602020; } DIV.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; } DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% } DIV.memproto { background-color: #EAEAEA; border: 1px solid #C0C0C0; } BODY { background: white; color: black; margin-right: 20px; margin-left: 20px; } TD.indexkey { padding-right : 10px; padding-top : 2px; padding-left : 10px; padding-bottom : 2px; margin-left : 0px; margin-right : 0px; margin-top : 2px; margin-bottom : 2px; border: 1px solid #CCCCCC; } TD.indexvalue { font-style: italic; padding-right : 10px; padding-top : 2px; padding-left : 10px; padding-bottom : 2px; margin-left : 0px; margin-right : 0px; margin-top : 2px; margin-bottom : 2px; border: 1px solid #CCCCCC; } TR.memlist { background-color: #f0f0f0; } P.formulaDsp { text-align: center; } IMG.formulaDsp { } IMG.formulaInl { vertical-align: middle; } SPAN.keyword { color: #008000 } SPAN.keywordtype { color: #604020 } SPAN.keywordflow { color: #e08000 } SPAN.comment { color: #800000 } SPAN.preprocessor { color: #806020 } SPAN.stringliteral { color: #002080 } SPAN.charliteral { color: #008080 } .mdTable { border: 1px solid #868686; background-color: #F4F4FB; } .mdRow { padding: 8px 10px; } .mdescLeft { padding: 0px 8px 4px 8px; font-size: 80%; font-style: italic; background-color: #FAFAFA; border-top: 1px none #E0E0E0; border-right: 1px none #E0E0E0; border-bottom: 1px none #E0E0E0; border-left: 1px none #E0E0E0; margin: 0px; } .mdescRight { padding: 0px 8px 4px 8px; font-size: 80%; font-style: italic; background-color: #FAFAFA; border-top: 1px none #E0E0E0; border-right: 1px none #E0E0E0; border-bottom: 1px none #E0E0E0; border-left: 1px none #E0E0E0; margin: 0px; } .memItemLeft { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: solid; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memItemRight { padding: 1px 8px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: solid; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memTemplItemLeft { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memTemplItemRight { padding: 1px 8px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memTemplParams { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: solid; border-right-style: none; border-bottom-style: none; border-left-style: none; color: #606060; background-color: #FAFAFA; font-size: 80%; } .search { color: #003399; } FORM.search { margin-bottom: 0px; margin-top: 0px; } INPUT.search { font-size: 75%; color: #000080; font-weight: normal; } TD.tiny { font-size: 75%; } .dirtab { padding: 4px; border-collapse: collapse; border: 1px solid #b0b0b0; } TH.dirtab {} HR { height: 1px; border: none; border-top: 1px solid black; } UL { list-style-type: square; } gecode-4.2.1/misc/fixautoheader.perl0000644000175000010010000000325211153124127016527 0ustar schulteNone#!/usr/bin/perl -w print < * * Copyright: * Guido Tack, 2008 * * Last modified: * \$Date: 2008-08-22 11:36:11 +0200 (Fr, 22 Aug 2008) \$ by \$Author: tack \$ * \$Revision: 7678 \$ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ EOF ; my $prev = ""; while (my $l = <>) { if ($l =~ /\#undef.*GECODE.*/ || $l =~/.*forceinline*/) { print $prev; print $l; print "\n"; } else { $prev = $l; } } print "// STATISTICS: support-any\n"; gecode-4.2.1/misc/fixmanifest.perl0000755000175000010010000000534212124571252016225 0ustar schulteNone#!/usr/bin/perl # # Main authors: # Christian Schulte # # Copyright: # Christian Schulte, 2010 # # Last modified: # $Date: 2013-03-27 14:22:50 +0100 (Wed, 27 Mar 2013) $ by $Author: schulte $ # $Revision: 13558 $ # # This file is part of Gecode, the generic constraint # development environment: # http://www.gecode.org # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # $dllsuffix = $ARGV[0]; $file = $ARGV[1]; if ($dllsuffix =~ /-([0-9]+)-([0-9]+)-([0-9]+)-[rd]-(x[0-9]+)\.dll/) { $revx = $1; $revy = $2; $revz = $3; $arch = $4; } if ($file =~ /(.*)Gecode([A-Za-z]+)-[0-9]+-[0-9]+-[0-9]+-[rd]-x[0-9]+\.dll\.manifest/) { $type = "Modules"; $name = $2; } elsif ($file =~ /(.*)\/examples\/(.+)\.exe/) { $type = "Examples"; $name = $2; } elsif ($file =~ /(.*)fzn-gecode\.exe/) { $type = "Tools"; $name = "FlatZinc"; } elsif ($file =~ /(.*)\/test\.exe/) { $type = "Tools"; $name = "Test"; } if ($arch =~ /x64/) { $arch = "amd64"; } if (open (INMANIFEST, "<", $file)) { open (OUTMANIFEST, ">", "$file.tmp") || die "Could not open " . "$file.tmp"; while ($l = ) { print OUTMANIFEST $l; if ($l =~ /\\n"; } } close INMANIFEST; close OUTMANIFEST; system("rm -f \"$file\""); system("mv \"$file.tmp\" \"$file\""); } gecode-4.2.1/misc/fixproperties.sh0000644000175000010010000000703712111204467016260 0ustar schulteNone#!/bin/sh # # Main authors: # Guido Tack # # Copyright: # Guido Tack, 2006 # # Last modified: # $Date: 2013-02-20 18:34:47 +0100 (Wed, 20 Feb 2013) $ by $Author: schulte $ # $Revision: 13348 $ # # This file is part of Gecode, the generic constraint # development environment: # http://www.gecode.org # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # set -e # List of file extensions for which properties should be set KEYWORDEXTS="cpp hpp hh sh perl ac in vsl vis mzn m4 txt" for ext in ${KEYWORDEXTS}; do find . -name "*.$ext" ! \( -path './contribs/*' -o -path './gecode/third-party/*' \) -prune \ -exec svn propset svn:keywords 'Author Date Id Revision' "{}" ";" done # List of normal directories to set ignore properties on GECODEDIRS="int iter kernel minimodel search set support gist driver graph scheduling flatzinc float" TOOLSDIRS="flatzinc" for dir in ${GECODEDIRS}; do find . -type d -path "./gecode/$dir*" \ ! -path '*.svn*' \ -exec svn propset svn:ignore -F misc/svn-ignore.txt '{}' \; done for dir in ${TOOLSDIRS}; do find . -type d -path "./tools/$dir*" \ ! -path '*.svn*' \ -exec svn propset svn:ignore -F misc/svn-ignore.txt '{}' \; done svn propset svn:ignore -F misc/svn-ignore-root.txt '.' IGNORESUPPORT=`mktemp ignoresupportXXXX` || exit 1 (echo config.hpp; svn propget svn:ignore './gecode/support') \ > ${IGNORESUPPORT} svn propset svn:ignore -F ${IGNORESUPPORT} './gecode/support' rm -f ${IGNORESUPPORT} # Create list of executable examples, append it to svn-ignore.txt IGNOREEXAMPLES=`mktemp ignoreexamplesXXXX` || exit 1 (cat misc/svn-ignore.txt; \ find "./examples" -name "*.cpp" | sed -e 's/\.cpp//g' | xargs -n1 basename) \ > ${IGNOREEXAMPLES} svn propset svn:ignore -F ${IGNOREEXAMPLES} './examples' rm -f ${IGNOREEXAMPLES} # Create list of executable tools, append it to svn-ignore.txt TOOLSDIRS=`find tools -type d -and -not -path '*.svn*' -and -not -path 'tools'` for t in $TOOLSDIRS; do IGNORETOOLS=`mktemp ignoretoolsXXXX` || exit 1 (cat misc/svn-ignore.txt; \ find "$t" -name "*.cpp" | sed -e 's/\.cpp//g' | xargs -n1 basename) \ > ${IGNORETOOLS} svn propset svn:ignore -F ${IGNORETOOLS} $t rm -f ${IGNORETOOLS} done # Append the test executable to svn-ignore.txt IGNORETEST=`mktemp ignoretestXXXX` || exit 1 (cat misc/svn-ignore.txt; echo "test") > ${IGNORETEST} svn propset svn:ignore -F ${IGNORETEST} './test' rm -f ${IGNORETEST} find . -type d -path "./test/*" \ ! -path '*.svn*' \ -exec svn propset svn:ignore -F misc/svn-ignore.txt '{}' \; gecode-4.2.1/misc/gecode-logo.ico0000755000175000010010000007440511515550714015715 0ustar schulteNone è–(~00¨¦ ¨Nhö ï^!00 ¨%M>  ¨õc ht( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿp"""" """""""" """""""""""" """"""""""xÿÿÿ‡" ""ÿÿÿÿÿr""'ÿÿÿÿÿÿr" ""/ÿÿr"/ÿr""""ÿò""/ÿr"" """ÿÿr""/ÿr""""""ÿø""'ÿr""" r""'ÿø""ÿÿr""""r""'ÿø""ÿÿr""""""'ÿø""xˆˆr""" """ÿÿ"""""""""""ÿr""""""" ""ÿò""""""""(ÿÿ‡""r"" ""ÿÿÿÿ÷"""(ÿÿÿÿø" ""'ÿÿ‡""""""" """""""""" """""" "" ÿþÿÿü?ÿÿøÿÿðÿÿàÿÿÀÿÿ€ÿÿÿþü?øðàÀ€€Ààðøü?þÿÿÿ€ÿÿÀÿÿàÿÿðÿÿøÿÿü?ÿÿþÿ( €€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿpr'""pr""''ÿ‚prøx÷'"ÿr(÷"pr"ÿ"x÷"'r"ø"ˆ‚"'"ÿ"""" r‚"""(ÿÿ‚ r'wr"" r"pþÿü?ÿøÿðÿàÿÀÿ€ÿÿÿ€ÿÀÿàÿðÿøÿü?ÿþÿ(0`…‡ˆ Š Š ‘ – %—%&˜&*™*-›-1ž17 7:¡:=¢=A¤AF§FI©IMªMO¬OR¬RT®TZ°Z^²^a³ab´bg¶gh·hl¹lp»pr¼rt½tx¿x‚ƒă†Å†ŠÇŠŽÉŽÊ•Ì•˜Î˜Ð¢Ò¢¥Ô¥©Ö©¬×¬¬Ø¬±Ú±¹Ý¹ÁáÁÅãÅÆäÆËæËÑèÑ×ë×ÛíÛÞîÞàïàáðáåòåð÷ðòøòõúõùüùþþþÏ@ðJÿ[1ÿqQÿ‡qÿ‘ÿ²±ÿÉÑÿßÿÿÿ/Pp ° Ïð ÿ=ÿ1[ÿQyÿq˜ÿ‘µÿ±ÔÿÑÿÿÿ/"P0p=L°YÏgðxÿŠÿ1œÿQ®ÿqÀÿ‘Òÿ±äÿÑÿÿÿ&/@PZptް©ÏÂðÑÿØÿ1ÞÿQãÿqéÿ‘ïÿ±öÿÑÿÿÿ/&PAp[t°ŽÏ©ðÃÿÒÿØ1ÿÝQÿäqÿê‘ÿð±ÿöÑÿÿÿ/P"p0>°MÏ[ðiÿyÿŠ1ÿQÿ¯qÿÁ‘ÿÒ±ÿåÑÿÿÿ/Pp ° Ï ðÿ ÿ>1ÿ\Qÿzqÿ—‘ÿ¶±ÿÔÑÿÿÿ/Pp!+°6Ï@ðIÿZÿ1pÿQ†ÿqœÿ‘²ÿ±ÈÿÑßÿÿÿ/ P6pLb°xÏŽð¤ÿ³ÿ1¾ÿQÇÿqÑÿ‘Üÿ±åÿÑðÿÿÿ,/KPip‡¥°ÄÏáððÿò1ÿôQÿöqÿ÷‘ÿù±ÿûÑÿÿÿÿ/-P?pRc°vψð™ÿ¦1ÿ´QÿÂqÿÏ‘ÿܱÿëÑÿÿÿÿ/Pp!°&Ï,ð>ÿX1ÿqQÿŒqÿ¦‘ÿ¿±ÿÚÑÿÿÿÿ   !1;EEEEEEA9.! ,BEEEEEEEEEEEEEE1?EEEEEEEEEEEEEEEE6CEEEEEEEEEEEEEEEEE6BEEEEEEE7+"!)?EEEE66EEEEEE85EEEE6EEEEEE25EEEE65EEEEE85EEEE6 EEEEEE5EEEE6EEEEE:5EEEE6%EEEEE,,>>>CEEEE6,EEEEE%0EEEEEEEE6-EEEEE0EEEEEEEE6+OOOOO"0EEEEEEEE6#OOOOO('''''''' OOOOO5AOOOOD3OOOOO.EOOOOE$4OOOOOD+  =OOOOOO>* 06@OOOOOOOEEEEEEEEE:OOOOOOEEEEEEEEE  *COOOOEEEEEEEEE/(:DOEEEEEEEE<)'+0/+&ÿÿþÿÿÿÿü?ÿÿÿÿøÿÿÿÿðÿÿÿÿàÿÿÿÿÀÿÿÿÿ€ÿÿÿÿÿÿÿþÿÿü?ÿÿøÿÿðÿÿàÿÿÀÿÿ€ÿÿÿþü?øðàÀ€€Ààðøü?þÿÿÿ€ÿÿÀÿÿàÿÿðÿÿøÿÿü?ÿÿþÿÿÿÿÿÿÿ€ÿÿÿÿÀÿÿÿÿàÿÿÿÿðÿÿÿÿøÿÿÿÿü?ÿÿÿÿþÿÿ( @†‡ˆŽ’”!–!%˜%+š+,›,2ž25Ÿ59¡9<£<>¤>@¤@G¨GI©IO¬OS®SU®UY°Y`´`f¶fmºmx¾xzÀz‚‚ƒÄƒ…Å…‘Ë‘•Í•žÑž¥Ô¥¨Õ¨´Û´¹Ý¹ÁáÁÄâÄËæËÒéÒÖëÖÙíÙÜíÜáñáäñäèóèìõìóùó÷û÷ûýûÿÿÿÿ´1ÿ¾QÿÈqÿÓ‘ÿܱÿåÑÿðÿÿÿ/Pp",°6Ï@ðJÿ[1ÿqQÿ‡qÿ‘ÿ²±ÿÉÑÿßÿÿÿ/Pp ° Ïð ÿ=ÿ1[ÿQyÿq˜ÿ‘µÿ±ÔÿÑÿÿÿ/"P0p=L°YÏgðxÿŠÿ1œÿQ®ÿqÀÿ‘Òÿ±äÿÑÿÿÿ&/@PZptް©ÏÂðÑÿØÿ1ÞÿQãÿqéÿ‘ïÿ±öÿÑÿÿÿ/&PAp[t°ŽÏ©ðÃÿÒÿØ1ÿÝQÿäqÿê‘ÿð±ÿöÑÿÿÿ/P"p0>°MÏ[ðiÿyÿŠ1ÿQÿ¯qÿÁ‘ÿÒ±ÿåÑÿÿÿ/Pp ° Ï ðÿ ÿ>1ÿ\Qÿzqÿ—‘ÿ¶±ÿÔÑÿÿÿ/Pp!+°6Ï@ðIÿZÿ1pÿQ†ÿqœÿ‘²ÿ±ÈÿÑßÿÿÿ/ P6pLb°xÏŽð¤ÿ³ÿ1¾ÿQÇÿqÑÿ‘Üÿ±åÿÑðÿÿÿ,/KPip‡¥°ÄÏáððÿò1ÿôQÿöqÿ÷‘ÿù±ÿûÑÿÿÿÿ/-P?pRc°vψð™ÿ¦1ÿ´QÿÂqÿÏ‘ÿܱÿëÑÿÿÿÿ/Pp!°&Ï,ð>ÿX1ÿqQÿŒqÿ¦‘ÿ¿±ÿÚÑÿÿÿÿ         (377770'  17777777777  677777217777   47771 777  $777. 777  4777777  777-777 777%)77777 777#)77777 777&!&&&&& 777/,7777772)7775"  +7777777777#677777777' !*47772( ÿþÿÿü?ÿÿøÿÿðÿÿàÿÿÀÿÿ€ÿÿÿþü?øðàÀ€€Ààðøü?þÿÿÿ€ÿÿÀÿÿàÿÿðÿÿøÿÿü?ÿÿþÿ( †‰ Š )š)-›-.œ.6Ÿ67 7=¢=B¥BE§EI©ILªLP«PR­RU®U_´_q»qv¾v}Á}‰Æ‰È“Ì“œÏœÐ¹Þ¹ÃâÃÇäÇÈäÈÌæÌÑéÑÕëÕÝîÝáðáóùóöúöøûøúüúþþþQóÿqõÿ‘÷ÿ±ùÿÑûÿÿÿÿ/!P7pLc°yÏð¦ÿ´1ÿ¾QÿÈqÿÓ‘ÿܱÿåÑÿðÿÿÿ/Pp",°6Ï@ðJÿ[1ÿqQÿ‡qÿ‘ÿ²±ÿÉÑÿßÿÿÿ/Pp ° Ïð ÿ=ÿ1[ÿQyÿq˜ÿ‘µÿ±ÔÿÑÿÿÿ/"P0p=L°YÏgðxÿŠÿ1œÿQ®ÿqÀÿ‘Òÿ±äÿÑÿÿÿ&/@PZptް©ÏÂðÑÿØÿ1ÞÿQãÿqéÿ‘ïÿ±öÿÑÿÿÿ/&PAp[t°ŽÏ©ðÃÿÒÿØ1ÿÝQÿäqÿê‘ÿð±ÿöÑÿÿÿ/P"p0>°MÏ[ðiÿyÿŠ1ÿQÿ¯qÿÁ‘ÿÒ±ÿåÑÿÿÿ/Pp ° Ï ðÿ ÿ>1ÿ\Qÿzqÿ—‘ÿ¶±ÿÔÑÿÿÿ/Pp!+°6Ï@ðIÿZÿ1pÿQ†ÿqœÿ‘²ÿ±ÈÿÑßÿÿÿ/ P6pLb°xÏŽð¤ÿ³ÿ1¾ÿQÇÿqÑÿ‘Üÿ±åÿÑðÿÿÿ,/KPip‡¥°ÄÏáððÿò1ÿôQÿöqÿ÷‘ÿù±ÿûÑÿÿÿÿ/-P?pRc°vψð™ÿ¦1ÿ´QÿÂqÿÏ‘ÿܱÿëÑÿÿÿÿ/Pp!°&Ï,ð>ÿX1ÿqQÿŒqÿ¦‘ÿ¿±ÿÚÑÿÿÿÿ   (/' )'/  $//  /#"/ / !!  %& /  )///     þü?øðàÀ€€Ààðøü?þ‰PNG  IHDR\r¨f¶IDATxÚíyÜ]EyÇ'*KdG¤"BË&ûR@ Â"”E-’ÂNˆ¬ þøž´PQd'lZZ”‚ÈVV!B¥(*[A) ² Húû½s/¹¹¹÷}ïrÎyfæü¾ŸÏsOò&¹÷¹'óüfžgæÌŒp¢šdn±¦Ÿ|হ¬Ýå2ÂÚQ™[¯[Ãv‡mÛ¸éo< { vì6ˆÁï­]Å#Hø;ÁN†mÑá¿z vl:„à ë¯ ŠC2™[¯çÀÆ÷øÿë8b˜682 "H•·4þwoqsÑëóy®s_ë4þïÏmñþÏß…øõWù#H‘Ì-…ןÀ6ü}ûàn- ŠÅ‡øý~k­¿šÈ @jøà¿ ¶Ù|?¯uó¯‡úóùÿgö•¤… %2 û}Ï¿Y¿oÕŠÀþJÒA ¾à÷Ÿ®óJ¯Ì†M„|ßú+‹þ‘¤@æ–ÅëÍ®øà¯C8"põWý!ˆòƒ¿ŽD $1ã‡ý·¸zµ¿|>„MP:/€XñÕþŸÂ65öD…Áˆ‘Ĉ¯ösªÏ:øëH"E~Ø«+nª¯W(Tˆ @Lø‚§ú¬rþá`M€…Á«­!ˆ…àƒ¿gt'¹«¬Ã#ˆx‚¿E`D@#À‘„Î@°9ÿp0˜PM `$!308Õw;lkWzdŽãìÀIZ'*€Pñ=?çù7î÷­Œ¡Œ×H L$!âs~ûC™çïN Â`xHBcÀ-çüòÞT‚¿kœ¸ÒÚ1 @Høàgµ?¶‚_§pv`²D $¡nÏߌF!Ÿós'ŸX«ýÝ¢š@ H¬|°çØFÖ®” g&h±-K|ÏÏ©¾ªŠÀDì1ç›î/:Õ=oíHåð9?§úª2ìoÓÖ®°v¤Šh`Á€[Þù‚_Õƒ¿ ƒAfX;R5$e“)øÛàE`šD L$e¢aÿpP&+( @Yø‚·ñŠ}mѰ&0IëÊAPþÁNõmhíJ$ðP² š( @Ñøa?§úüÝÁ)ÂIJŠEP$¾ÚÏœ_ÃþÞ`:ÀÙË­I @Q ¸œ¯ö+øûƒ…Áƒ%Å (õüy#( @Þ(ø‹B"P€<ñS}ÜÃO¿bPa0g$yáƒÿNØúÖ®$§äƒ ü°Ÿ‹|Ôó—G“•ô _|µŸ9U鵂S„¬ \fíHÌHúAÁo ƒ‡B.µv$V$½¢à‰@HzA9h(è @·øµýœêÛÀÚ1* ö€ |ðsªï Ö®ˆ¶L’tŽ S|ÎÏa¿zþ°áHà`Õ:CÐ îSÎü”óÇk, ^bíHèH†CÁ+œ8"p±µ#!# ìPÓH =€v(çO¥C h…Ÿçç~ªö§ :H…Á‘4ミS}ëY»b ƒæÝ!þ|!ØâÖNvÉd‰ÀüHñ9?‡ý)>ÒË|ø çûžÚÏfÁÞƒ={µéï0wÚÜÇÛ½ÙˆlÄb¸¬Ýôã5`+×~½ luwDæHê°%ï§Uap€:>øyDw 9ÿ›°ga„=ÄŸ! Ÿ±r‚±”óâði矟 ñ^¯[¡DWXàìÀEV÷"$$dÀ­è|µ?Öàÿµó½:ƒAÿ,‚ý k§:°„ó£…¿mÛö9Ø~¬D † ΞŸ¹9ϸ 6ö<~¶µSyQ`Ú°)lØ.®˜zŒDÀU]üT)†œÿ5Ø5°›`÷!àßíóý¢bÀbãça»Áöuùn¶Zùš@uÀ?§úB®ö³—ºÆÇ\oEÐdí%51X ¶ìÈÚ¯ûmÃ,ŠRU¨¦øàçTߺ֮´€½Òo`çÃn@Ð?oíP¨@ŽÃåÌÞª²"P=ð?Nõ…¶È‡OQ: A—µ318—Órz;ÞÖ.´þ^eR-ðÁÏ‚_h9?ë ü»­‰ 7fã[2Å:"põw+‹ê@˜ÁÏ|ª¿{üŸÄåØR9¿u¥D Þ°Ÿ=þ©°{üs¬‰À6nފƼ¡Q…t }ðóüìiC¨ö¿›»Dß9çÿ­àÿÏa©¯H[|ð³°¶Ž±'lL×ÂN@àÿÎú¶¤@ù;My$®øàç<¿õT—é‹À¿Éú–¤‚.¯¸b— ×ááa©Š@šàs~æÙÖÃ~nBÁàÓú–¤€«g–ø‘Á±0ø=ëïž7é ÀÀàÓe¬ö[üÞ»8¥5ú¡8 —cJþX§¤&i @ÁÏ/þCÖ·#U ?ÇeƒNNÒ€0†ý÷Âö@ð¿Ú÷;‰– ø¹©È[†.$%i@¿ïÃö¯ú;Ecÿ·‚…ÁÃSX,¿øžŸS}k÷ûV}p5l‚‚¿x ÜÓï@k?j»Ä->øÙó[Íó3à¿;Wžr€<åüÞƒ!À‘À1§ñ €/ø1ç·ö3øBà×úVT?· £,líKœ"dMà|kGz!NÜX’Õ~«‚Ÿ‚ßÀþ¸\eíG ئB¢kñ €~>ØcYð㣻§XߊªXþßL”"—Øû {  ZߎªXþߊèÒxÀ? ~–Õþ_À¶‹eËíNA`t¾-|¶f„yl>Ì?å6ä³ÿåÜÁ'Yûùœ¼gDà#7ås‹X߯a`aðÈXD ðÁÏ©¾µ ½øl 4ì'­oG?Ôöág/Z?œƒAþW°årüÞ#îbÌ“…( \ ÅÞûEÜ¿·{ôû(\¾mwçºæˆD |£ççpÿ‹h¼Zߎn©õî,–n ÛÝù€eäÎÎGÆ¥¼÷ÁîÄ=}¥Ãïñ#\ö4ò»8˜zM lð?æüÖÏ󇆚Çî³¥€aä«°½œýS‘í`<ã–h7Àfµª­à»pØÏí¿V´v¸KX`að;ÖŽ´#\ý¸¼µ/¢LEÀFÂËùëÕû#ø7p¾0º¬µ/¢PÌjå €ïùü!Tûá^þë@ž·v„Ôz~¥à¯SË ”+á?ù6‚ÿ(k'H­Ú¿óOé‰jQª”'a?×ù¯£¾µ_~ gí‹0ékç–ñaåÀ€[Åù‚_h9ü[Z;A 'ãrºµÂ…œSô/á?¸ÒÚ ?çø¹ç@§Þа)EŠ€8‚ŸS«YçUúóñ±Ö7DCá"Pœ„ó7r ‚²µ€‰¸Ì°öCG¡5bÀ÷ü þªØ»Bn´t ¶‘dz°•¬o†–£‹ ä/¾ççâ•‚Ÿ}~ð'K' Gãr¶õÍÁ“»ä+qõüä:ÿÞ– øÂ…©÷ÃÁt€5Ü:‹ü``pÇüBÏù9`ú\6`\®·¾"X<"ËNUù@œÁO5]ð?–N@¸#î¶Ö7CDEn"пøa?׬ÇüäU¿éãµ~ÖKøìÁHë›!¢ƒ"p\¿é@àƒŸ¿w¢½`zÐ$€+þN¶¾"Zú® ô.~ØÏ‚_ŒÁOö‡˜5 `ú¡~D¿Ûk:ЛÄÝó×YÕrã?gJxÞÀÂÖ7B$AO"нøžŸ9,S}íX8ïl»0Éù >…Ȧ, þK7ÿ¨;p«:_í=øFðof逻¿L±¾")X<¡è\Ò ~òo€¯Z: ü_DW"ЙÄ_ðk&ƒL³úp?k(ϸøïqÐq:0¼øàgÁo ëo•#û@~`õá€1Îïô ?tq¾ÙS«õ­„ㆡÀûÙó§üd,à'VàúƒK­oBÁì‡Ø/¸·÷ವÁ‘À™íþ°½¤Ùó×…ÿŽÕ‡£‘f¸˜¥ -¤M[h-¾ççT_*9#¯ÃVAƒßÊ4Ò¸L´¾ HÒ†5o@Îhþƒ íà' ±olé)…t"’ }8;pb³Ì/nQ¼òHìu­½-€3«[߈$Õ€£Þ] wÔÐ,—àÕô™,ˆ :¼Û"ð3O‡¤Àµö°`$ "¨Aá/à¼îhíY ü;ûW¬> tEç÷i Z¼["ðŒ€Áƒ(Ø(«på9hì_·úp4PN¯¾`}šTƒ!{È÷¥û‘µG%qÎÜ `z pb"0]Ð!7¹in׺p¹à1Ö•„`A$Õƒ#þÏKJ ”Û€? ûœõh@PM¯ ×űö¦$L€ ‘†7 ¨" ÀÅx5?¯$$ "¨&‹W1¸}_K$Å!è˜Ù°%ëÀEX{T ±Û.š>âZ\¾f}#T{Ý4·M]Ör~‡Ú*‚Ìp¡= (¨§CN© ¯Á6µöªBޏ.´¾ HªÇf€Yó–gŽyñÕÖ^•@ÞŽ@€*q+l'ÀÜFàÚô‡]5vª…o·#ÐôÁCA~k}Tn²5‚ÿþfþÇ3ǽòù¬ð(k/ æ³hðÏY}8éb¸ðT¢å­oD @uÈü'Õ3¢Å3¸¶µ§²3üÍ– ¡ÞˆË®Ö7¢† Ì„}ðAý­÷ÌÜñxý'×íÉAñpüå– ¡ž†Ë)Ö7¢† }~å¸Úwš{©ñ‡í5µì{ÖŽÔAC^—;a+XûÒ#€ü`Ï¿}ÞÁOŠ N?`M †Âàh°×[;ÑóÎÎ/iíKHò®ÉsØßHñ½s<"pl4íGÖŽ4‚½ó{4.bíK—Hú§Ðà'å Ïã­Ðhï·v¢™HE@ÐÁvÌ«Úߎòòó8jW¢ÑŽ·v¢hØ|r‘·¬díK‡Hz§ðž¿N¹Á˜9î<Lµ½ÂÖAà éÐŽAã^ßùD×°ö¥$½ÁyþÑEüZQ~o¾; hàK;ÿìÅdk_†AÐ=¬ösªïÕ²>Ðf8ž¹)΋@¨éÀöh¼wX;1µGˆ/sáœ.ÔŒ ;8ì]fð»ô#ÖB, þ—ó3³­ 4öåp™ãˆåÖþ4!èüÆ”5ìoĶ[&¡_fíD' Ñ¯ŽËù°±.œ{)èŒ_8_í/¼à× û!x¸"ð,l4â?X;Ò)µÕƒ¼ŸûÁ7vG0<¦ÁO쀄[8øxk'ºAÀº‹„Ü[`3#7$Cc6ìo$œ€ËÜ‘x=ÏÚ&xrÐnhÈ7Z;Ò ŽªÖ„íÎïÛ¶p ý4l2îÛß90)øµ" aŠÀëÎ?(ô¼µ#ý‚àX—/ðûÀ¶ƒ­ìü>„üy·)ØÜš½åü¶æ´g`w÷ZRpžŸS}¯Y;BÂâE€é@H5›ag}”X‘ pG|qí¦¿ò\Íêü÷ÃtøÚæ{„,ö%øIx@|M€…Á2†«r2üéÖNˆ¡ XXð°¿‘0€„'Ü9h/ˆÀMÖŽˆö*Lv´.øµ"\ á¥üÜ"ð´µ#¢5 @°ÁOÂ’¹#œ/ †â+‹\*ü”µ#bA€ ‡ý„TC“¹ÃñÄÖÝ5$WðkE@¼|' Ÿy çßBÞµvDÌ#`ðs¿×­ïÇp„LáE€é@(5Ûf๾ßIäBÀœLè=¸€øš ƒ¡Ì0à“ƒOZ;"ÌàQç ~ÁæüÍÄ'$<x6"ðckGªŽ¡Dü$N á¥ØLØ]°­vÛ- ü’¸lÛÐù ßÊùMJˆ9ÿ؇ýTCˆ_,ÄÂ`l"ÐWžÝæ¼ <⮼ÝP;éx5ç‡ô[ÔŒGŸÒØ5îõ0.µ‚_+ª#$ ¨Ã"GÖŒ{òÏ‚=Ú(¡V¨[¶)Œçò°’­a<Ütikÿš¨Lð“j ñé‹m±Ôº…çÌq¤ðGñ¯œ¯+̪ýùÓˆ·óú0÷(ç{mÂ#ÉxžÏ%d°¯ê|Ï} ëÓ• ~R= ™;¯Vôûs1Ò‡ ¿ÿs]ïXË“„êgŽtq÷pT"ço¦Šà©¶ˆùI¾Úߎj7~/\'j: †‡=ÿU ~Rm ~k)Ew°.²cª‹|:A@$U„Á?®j93€:*¡à¯!hD5* ào@ÐLæÄë%ÖnˆBà<ÿØ*çüÍHZáE€Û{ëþ¤«ýœêû£µ#!¡ÞŽÌMv>PM ~8ì[Õ©¾¡ …>J<ÒÚÑ3;ŸókØß ÀpøÂ g$ñÁ]–vVÁ¯=€NP:# þtŠ/ ^ä4Eöwˆ 2w^/³vC §úƨà×€nñ"Àu „«ý|°çMkGbAÐ ™›ä|: š@8pØ?VóüÝ!è_`aP³ö°à7NÃþî‘ôƒD ~æ|µ_¿ô‹ÒKü}"È-а?$y‘¹ Îø©{Z<*øå„kžxà:ŠƒÁÏ©¾·¬I @Þøt€5ó‡9ÿ8õüù!(‰@<è|ÁO9ŽHŠB"' þ‚‰î,¤)ÂÞQðˆ hTìåü#(ƒÌí×+œîw7pž¬ì)5ȲÈÜxçGJ†‡=ÿXMõ L|:Àƒ* ¶‡9ÿ8õüå (›ÌMt¾0(Xœ/ø)ç/ €V0øwQµ¿\$VøtàR§šQÏo„À?;0ÃU{ŠP9¿!k2·ŸóS„UÿŽªöÛ!?à£ÄUJü ¿N€5*™óï¤a¿=€ð"Àu‹X»R ÷;_íWÁ/$¡‘öH@Á€I³&ÀàßYÃþ°„JæöÅë•.ÙæüãTð  @Èdîðz•‹[ü¬ö¿míˆX @èø‘À gM€Ãþq þp‘Ä€_,ÄG‰cš¸Ïù‚Ÿrþ€‘Ä‚/ rv PðG‚ &üH€³!§ þˆÄ†¯ ðÙ§ü‘!ˆ‘Ìíãüì@H" ‚_„Hb%,`ÏÏàÇÚÑ€˜ñë˜XÖü;©ç @ìøš ƒ³÷:Ÿók…_¤HRÀFî}Y¿¸‘¤ÂÀ`:0Õ#>øORðÇŽ %Ê) jØŸ€ÔÈÜ×ðz+Fü;©ÚŸ€ñ"pµËwv@ÁŸ €Tñé§ó¨ \¯àO @Êdn ¼Þ[±Çw˜ ;v<‚Žõ×ù#HÌ­„׳a{»îR‚g`#ðo·þ ¢8$U!sëâuŠãôs+·ù[¬ìs¿þë·#›æþlí¶( @ÕÈkkÂV­]9B`Ðs¸7‚þ}kEyH„¨0ÿ&ézCu%FVIEND®B`‚(0` †3† †¥†=†D†ó†ÿ†ÿ†ø†U†B†ô†ÿ†ÿ†ÿ†ÿ†ù†T†D†ô†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ù†V†E†ó†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ù†V†C†ô†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ú†T†E†ô†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ú†W†E†ó†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ù†W†C†ô†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ú†U†E†õ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ú†W†F†ô†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ù†W†D†õ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ý†ç“ë//ò//ñ//õ†Ú†ö†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ú†V†F†õ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ êW°WޜМÝÒéÒáþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿð÷ðòÆäÆå“Ì“âW°Wß”ä†ù†ÿ†ÿ†ú†X†F†ô†ÿ†ÿ†ÿ†ÿ†ÿŽì…Å…ÝóùóøþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿžÑžâ†ÿ†ÿ†ÿ†ù†X†D†õ†ÿ†ÿ†ÿ†ÿ†ÿ>¤>ãßïßíþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿ¿à¿ô†ÿ†ÿ†ÿ†ÿ†ú†V†G†õ†ÿ†ÿ†ÿ†ÿ†ÿA¥AÖöúö÷þþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿ¿à¿ô†ÿ†ÿ†ÿ†ÿ†ÿ†ú†Y†G†ô†ÿ†ÿ†ÿ†ÿ†ÿ$˜$âñøñöþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿýþýý¾à¾à‚Ä‚äa´aèO¬OäX°XàÂèàðàíþþþÿþþþÿþþþÿþþþÿ¿à¿ô†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ù†Y†E†õ†ÿ†ÿ†ÿ†ÿ†ÿˆù»ß»àþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿÀáÀä2ž2å†û†ÿ†ÿ†ÿ†ÿ†ÿ¯Ù¯Þþþþÿþþþÿþþþÿþþþÿ¿à¿ô†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ú†W†G†õ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿB¦BØþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿ£Ó£åˆó†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ¯Ù¯Þþþþÿþþþÿþþþÿþþþÿ¿à¿ô†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ú†Y†H†ô†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ±Ú±ÞþþþÿþþþÿþþþÿþþþÿþþþÿÁáÁãˆñ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ¯Ù¯Þþþþÿþþþÿþþþÿþþþÿ¿à¿ô†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ù†Z†F†õ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿíüýüüþþþÿþþþÿþþþÿþþþÿþþþÿ5 5Þ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ¯Ù¯Þþþþÿþþþÿþþþÿþþþÿ¿à¿ô†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ú†X†H†õ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ;£;ÝþþþÿþþþÿþþþÿþþþÿþþþÿÌçÌâ†û†ÿ†ÿ†ÿ†ÿ†ÿ†û†ù†ù†ù¯Ù¯Ýþþþÿþþþÿþþþÿþþþÿ¿à¿ô†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ú†Z†9†ô†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿe¶eßþþþÿþþþÿþþþÿþþþÿþþþÿ‡Æ‡ß†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ‹È‹åßïßôßïßôßïßôõúõùþþþÿþþþÿþþþÿþþþÿ¿à¿ô†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ù†G†«†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿÊòþþþÿþþþÿþþþÿþþþÿþþþÿo»oï†ÿ†ÿ†ÿ†ÿ†ÿ†ÿŸÑŸêþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿ¿à¿ô†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†¾†²†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿÊêþþþÿþþþÿþþþÿþþþÿþþþÿH©HÙ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿŸÑŸêþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿ¿à¿ô†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†Ä†H†ú†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ‰Ç‰ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿi¸iò†ÿ†ÿ†ÿ†ÿ†ÿ…ÿŸÑŸêþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿ¿à¿ô…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ý…Z†[†û†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ_³_àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿx¿xä†ÿ†ÿ†ÿ†ÿ†ÿ…ÿE§EÜoºoÛoºoÛoºoÛoºoÛoºoÛoºoÛoºoÛoºoÛS­SÝ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ý…o†Y†û†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ8 8ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´Û´å†ÿ†ÿ†ÿ†ÿ†ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ý…n†[†ú†ÿ†ÿ†ÿ†ÿ†ÿ†ÿˆîð÷ðòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùüùúá†ÿ†ÿ†ÿ†ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ý…o†[†ú†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ¢Ó¢áÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰Ç‰Õ†ý†ÿ†ÿ†ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ý…o†Y†ú†ÿ†ÿ†ÿ†ÿ†ÿ2ž2âýþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüü[±[׆ý†ÿ†ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ý…m†Z†ù†ÿ†ÿ†ÿ†ÿ†ü©Ö©åÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûü|Á|Ùˆí†ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ï…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ý…n†Z†ú†ÿ†ÿ†ÿ†ÿŽçÛíÛëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝîÝê}Á}Ü;¢;áŠÚ…ä…å†Õ)™)ãS­Sà›Ï›á¹Ý¹Ø…ù…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ý…n†X†ú†ÿ†ÿ†ÿ†ÿ,›,ääòäíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿ“ê…ÿ…ÿ…ÿ…ÿ…ÿ…ý…l†Z†ù†ÿ†ÿ†ÿ†ÿ“ÝËæËäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿW¯Wä…ÿ…ÿ…ÿ…ÿ…ý…m†Y†ú†ÿ†ÿ†ÿ†ÿ ‹ ñu½uÒöúöøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿ“˓݅ÿ…ÿ…ÿ…ý…m…W†ú†ÿ†ÿ†ÿ†ÿ†ÿ‘ìw¾wáÎçÎæùüùùÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþþ×ì×åw¾wÙ…ÿ…ÿ…ý…k†Y†ù†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†úßI¨Iâ|Á|ðÂÛ Ò ñÐíÂÝy¿yìO«Oä”á…ó…ÿ…ÿ…ý…m†Y†ú†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ý…l†W†ú†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ý…k†X†ù†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ü…l†X†ú†ÿ†ÿ†ÿ†ÿ†ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ý…l}ý†V†ú†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ý†j†X†ù†ÿ†ÿ†ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ü…k†W†ú†ÿ†ÿ…ÿ…ÿ…ÿ…ÿ…ý…k‡U‡ú‡ÿ†ÿ†ÿ†ÿ†ý†i‡W†ù†ÿ†ÿ†ü†j†J†À†Ã†Vÿÿü?ÿÿÿÿøÿÿÿÿðÿÿÿÿàÿÿÿÿÀÿÿÿÿ€ÿÿÿÿÿÿÿþÿÿü?ÿÿøÿÿðÿÿàÿÿÀÿÿ€ÿÿÿþü?øðàÀ€€Ààðøü?þÿÿÿ€ÿÿÀÿÿàÿÿðÿÿøÿÿü?ÿÿþÿÿÿÿÿÿ€ÿÿÿÿÀÿÿÿÿàÿÿÿÿðÿÿÿÿøÿÿÿÿü?ÿÿ( @ ‡‡°‡µ‡$‡†Ü†ÿ†ÿ†ä‡%‡‡Ý‡ÿ‡ÿ‡ÿ‡ÿ‡ä‡%‡‡Ý‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ä‡&‡‡Ý‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ä‡&‡‡Ý‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ä‡&‡‡Ý‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡å‡&‡‡Ý‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡û Œ ï–ö–ø‡ë‡þ‡ÿ‡ÿ‡ÿ‡å‡&‡‡Ý‡ÿ‡ÿ‡ÿŠôcµcê³Û³êëõëòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßðßí¯Ù¯ìo»oê”ò‡ÿ‡å‡&‡‡Þ‡ÿ‡ÿ‡ÿG¨GëãñãòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃ÷‡ÿ‡ÿ‡å‡&‡‡Þ‡ÿ‡ÿ‡ÿO¬OäûýûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçóçïãñãëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃ÷‡ÿ‡ÿ‡ÿ‡å‡'‡‡Þ‡ÿ‡ÿ‡ÿ”íóùóøÿÿÿÿÿÿÿÿÿÿÿÿãñãó_´_é Œ í‡ÿ‡ÿ#—#ßÿÿÿÿÿÿÿÿÿÿÿÿÃ÷‡ÿ‡ÿ‡ÿ‡ÿ‡å‡'‡‡Þ‡ÿ‡ÿ‡ÿ‡ÿ“Ì“åÿÿÿÿÿÿÿÿÿÿÿÿ×ì×ï’ò‡ÿ‡ÿ‡ÿ‡ÿ–éÿÿÿÿÿÿÿÿÿÿÿÿÃ÷‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡å‡'‡‡Þ‡ÿ‡ÿ‡ÿ‡ÿŠ÷óùóøÿÿÿÿÿÿÿÿÿÿÿÿ;£;é‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ–éÿÿÿÿÿÿÿÿÿÿÿÿÃ÷‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡å‡'‡‡Þ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ//éÿÿÿÿÿÿÿÿÿÿÿÿÓêÓí‡ý‡ÿ‡ÿ‡ÿ//ó?¥?ôW°WæÿÿÿÿÿÿÿÿÿÿÿÿÃ÷‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡æ‡&‡·‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿW°WñÿÿÿÿÿÿÿÿÿÿÿÿŸÒŸï‡ÿ‡ÿ‡ÿ‡ÿ¿á¿ñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃ÷‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡ÿ‡Ã†¾†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ_³_óÿÿÿÿÿÿÿÿÿÿÿÿ‹È‹ê†ÿ†ÿ†ÿ†ÿ¿à¿ñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂ÷†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†Ê†'†æ†ÿ†ÿ†ÿ†ÿ†ÿG¨Gíÿÿÿÿÿÿÿÿÿÿÿÿ£Ó£ñ†ÿ†ÿ†ÿ†ÿw¾wãŸÑŸçŸÑŸçŸÑŸçŸÑŸçŸÑŸçO«Oí†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ì†0†(†æ†ÿ†ÿ†ÿ†ÿ“íÿÿÿÿÿÿÿÿÿÿÿÿÛíÛñ†û†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ì†1†(†æ†ÿ†ÿ†ÿ†ýÏèÏìÿÿÿÿÿÿÿÿÿÿÿÿC¦Câ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ì†1†'†æ†ÿ†ÿ†ÿ_³_êÿÿÿÿÿÿÿÿÿÿÿÿçóçô'˜'è†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ì†0†'†æ†ÿ†ÿ‡ü»Þ»éÿÿÿÿÿÿÿÿÿÿÿÿ÷û÷û‡Æ‡è/œ/è‡è†î‰ç/œ/êw¾wì•é†ÿ†ÿ†ÿ†ÿ†ì†0†'†æ†ÿ†ÿóÇäÇêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿoºoî†ÿ†ÿ†ÿ†ì†0†'†å†ÿ†ÿ‰ó‹È‹ãûýûüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯Ù¯ë†ÿ†ÿ†ì†0†'†å†ÿ†ÿ†ÿ•ð{À{ê¿à¿êóùóöÿÿÿÿÿÿÿÿÿÿÿÿçóçñ³Û³ê_³_ä†ÿ†ì†0†'†å†ÿ†ÿ†ÿ†ÿ†ÿ†ú‡é‘÷†ë†ý†ÿ†ÿ†ì†0†&†å†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ë†/†&†å†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ë†/†&†å†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ë†/†&†å†ÿ†ÿ†ÿ†ÿ†ë†/‡&‡ä‡ÿ‡ÿ‡ë‡/†&†Å†É†.ÿü?ÿÿøÿÿðÿÿàÿÿÀÿÿ€ÿÿÿþü?øðàÀ€€Ààðøü?þÿÿÿ€ÿÿÀÿÿàÿÿðÿÿøÿÿü?ÿ(  ‡†ª†¯‡ ‡‡µ‡ÿ‡ÿ‡»‡ ‡‡¶‡ÿ‡ÿ‡ÿ‡ÿ‡»‡ ‡‡¶‡ÿ‡ÿˆúŽû‡ú‡ÿ‡¼‡ ‡‡¶‡ÿL«LôÅãÅôúüúüÿÿÿÿ÷û÷ûÇäÇõ&™&ú‡¼‡ ‡‡¶‡ÿW°WòþþþþøûøüšÏšõr¼röÈåÈ÷ÿÿÿÿ?¥?û‡ÿ‡¼‡ ‡‡¶‡ÿ‡ýáðá÷ÿÿÿÿJªJó‡ÿ‡ÿÊôÿÿÿÿ?¥?û‡ÿ‡ÿ‡¼‡ ‡­‡ÿ‡ÿ!–!öÿÿÿÿÜîÜö‡ÿ‡ÿ‹È‹öÕëÕùÿÿÿÿ?¥?û‡ÿ‡ÿ‡ÿ‡´†³†ÿ†ÿ)š)øÿÿÿÿËæËö†ÿ†ÿµÜµïÏèÏóÏèÏó3ž3ù†ÿ†ÿ†ÿ†¹† †½†ÿ‰úóùóúöúöüŽ÷†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†ÿ†Â† † †¼†ÿ‡Æ‡óÿÿÿÿÁáÁö-›-ô†õ Œ ô%—%õ†ÿ†ÿ†Â† † †¼ˆü–Í–ðþþþþÿÿÿÿÿÿÿÿÿÿÿÿÇäÇö†ÿ†Â† † †¼†ÿ&˜&öl¹lö†Å†øy¿yöD¦Dó†Á† † †¼†ÿ†ÿ†ÿ†ÿ†Á† † †¼†ÿ†ÿ†Á† ‡ †´†¸‡ ü?¬Aø¬Að¬Aà¬AÀ¬A€¬A¬A¬A¬A¬A€¬AÀ¬Aà¬Að¬Aø¬Aü?¬Agecode-4.2.1/misc/genchangelog.perl0000755000175000010010000001636712116410731016335 0ustar schulteNone#!/usr/bin/perl # # Main authors: # Christian Schulte # # Contributing authors: # Mikael Lagerkvist # # Copyright: # Christian Schulte, 2005 # Mikael Lagerkvist, 2008 # # Last modified: # $Date: 2013-03-08 17:29:13 +0100 (Fri, 08 Mar 2013) $ by $Author: schulte $ # $Revision: 13486 $ # # This file is part of Gecode, the generic constraint # development environment: # http://www.gecode.org # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # # # Compile changelog # $first = 1; $version = ""; $moreinfocnt = 1; $info = ""; $modclear{"kernel"} = "Kernel"; $modclear{"search"} = "Search engines"; $modclear{"int"} = "Finite domain integers"; $modclear{"set"} = "Finite integer sets"; $modclear{"float"} = "Floats"; $modclear{"cpltset"} = "Finite integer sets with complete representation"; $modclear{"minimodel"} = "Minimal modeling support"; $modclear{"graph"} = "\%Graph constraints"; $modclear{"scheduling"} = "Scheduling constraints"; $modclear{"driver"} = "Script commandline driver"; $modclear{"iter"} = "Range and value iterators"; $modclear{"support"} = "Support algorithms and datastructures"; $modclear{"example"} = "\%Example scripts"; $modclear{"test"} = "Systematic tests"; $modclear{"gist"} = "Gist"; $modclear{"flatzinc"} = "Gecode/FlatZinc"; $modclear{"other"} = "General"; $whatclear{"bug"} = "Bug fixes"; $whatclear{"performance"} = "Performance improvements"; $whatclear{"documentation"} = "Documentation fixes"; $whatclear{"new"} = "Additions"; $whatclear{"removed"} = "Removals"; $whatclear{"change"} = "Other changes"; $rankclear{"minor"} = "minor"; $rankclear{"major"} = "major"; @modorder = ("kernel","search","int","set","float","cpltset","scheduling", "graph","minimodel","driver", "iter","support","example","test","gist","flatzinc","other"); @whatorder = ("new","removed","change","bug","performance","documentation"); foreach $mod (@modorder) { $hastext{$mod} = 0; foreach $what (@whatorder) { $text{"$mod-$what"} = ""; } } $versions = ""; $body = ""; while ($l = <>) { LINE: next if ($l =~ /^\#/); if ($l =~ /^\[RELEASE\]/) { # Print previous if (!$first) { $sid = "SectionChanges_$version"; $sid =~ s|\.|_|g; $versions = $versions . "\n - \\ref $sid \"Gecode $version ($date)\""; $body = $body."\\section $sid Changes in Version $version ($date)\n\n"; $body = $body."$info\n\n"; foreach $mod (@modorder) { if ($hastext{$mod}) { $body = $body." - " . $modclear{$mod} . "\n"; $hastext{$mod} = 0; foreach $what (@whatorder) { if (!($text{"$mod-$what"} eq "")) { $body = $body." - " . $whatclear{$what} . "\n"; $body = $body.$text{"$mod-$what"}; $text{"$mod-$what"} = ""; $body = $body." .\n"; } } $body = $body." .\n"; } } $body = $body."\n\n"; } $first = 0; $version = ""; $info = ""; $date = ""; while (($l = <>) && !($l =~ /\[DESCRIPTION\]/)) { if ($l =~ /Version:[\t ]*(.*)$/) { $version = $1; } elsif ($l =~ /Date:[\t ]*(.*)$/) { $date = $1; } } while (($l = <>) && !($l =~ /\[ENTRY\]/)) { $info = $info . $l; } goto LINE; } if ($l =~ /^\[ENTRY\]/) { my $mod, $what, $rank, $bug, $desc, $more, $thanks, $author; $desc = ""; $more = ""; $bug = ""; $rank = ""; $what = ""; $mod = ""; $thanks = ""; $author = ""; while (($l = <>) && !($l =~ /\[DESCRIPTION\]/)) { if ($l =~ /Module:[\t ]*(.*)$/) { $mod = $1; } elsif ($l =~ /What:[\t ]*(.*)$/) { $what = $1; } elsif ($l =~ /Rank:[\t ]*(.*)$/) { $rank = $1; } elsif ($l =~ /Bug:[\t ]*(.*)$/) { $bug = $1; } elsif ($l =~ /Thanks:[\t ]*(.*)$/) { $thanks = $1; } elsif ($l =~ /Author:[\t ]*(.*)$/) { $author = $1; } } while (($l = <>) && !(($l =~ /\[ENTRY\]/) || ($l =~ /\[RELEASE\]/) || ($l =~ /\[MORE\]/))) { $desc = $desc . " " . $l; } $desc =~ s/^ //; $desc =~ s/[ \t\n\r]*$//; $desc =~ s//\\>/g; $desc =~ s/&/\\&/g; $desc =~ s/\n([ \t]*)\n/\n\1
\n/g; if ($l =~ /^\[MORE\]/) { while (($l = <>) && !(($l =~ /\[ENTRY\]/) || ($l =~ /\[RELEASE\]/))) { $more = $more . " " . $l; } } $more =~ s/[ \t\n\r]*$//; $more =~ s//\\>/g; $more =~ s/\n/g; $hastext{$mod} = 1; $rb = $rankclear{$rank}; if (!($thanks eq "")) { $rb = $rb . ", thanks to $thanks"; } if (!($author eq "")) { $rb = $rb . " , contributed by $author"; } if (!($more eq "")) { $more =~ s/^ //; $more =~ s/[ \t\n\r]*$//; $more = " \n" . " Details\n" . " \n" . " Hide details\n" . "
\n" . " ". $more . "\n
\n"; $moreinfocnt = $moreinfocnt + 1; } $text{"$mod-$what"} = ($text{"$mod-$what"} . " - $desc (" . $rb . ")\n" . $more); goto LINE; } } print <x.y.z change according to the following rules (of thumb): - when \\e z changes, the programming interfaces for \\ref TaskModel, and \\ref TaskSearch remain stable and only minor additions or improvements are included. - when \\e y changes, the above mentioned interfaces might have changed and medium to major additions or improvements are included. - the change of \\e x is reserved for radical changes to %Gecode. EOF ; print $body; print < # Guido Tack # # Copyright: # Christian Schulte, 2005 # Guido Tack, 2006 # # Last modified: # $Date: 2011-01-18 12:14:44 +0100 (Tue, 18 Jan 2011) $ by $Author: tack $ # $Revision: 11547 $ # # This file is part of Gecode, the generic constraint # development environment: # http://www.gecode.org # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # # # Compile changelog # $first = 1; $version = ""; $info = ""; $modclear{"kernel"} = "Kernel"; $modclear{"search"} = "Search engines"; $modclear{"int"} = "Finite domain integers"; $modclear{"set"} = "Finite integer sets"; $modclear{"cpltset"} = "Finite integer sets with complete representation"; $modclear{"minimodel"} = "Minimal modeling support"; $modclear{"graph"} = "Graph constraints"; $modclear{"scheduling"} = "Scheduling constraints"; $modclear{"driver"} = "Script commandline driver"; $modclear{"iter"} = "Range and value iterators"; $modclear{"support"} = "Support algorithms and datastructures"; $modclear{"example"} = "Example scripts"; $modclear{"test"} = "Systematic tests"; $modclear{"gist"} = "Gist"; $modclear{"flatzinc"} = "Gecode/FlatZinc"; $modclear{"other"} = "General"; $whatclear{"bug"} = "Bug fixes"; $whatclear{"performance"} = "Performance improvements"; $whatclear{"documentation"} = "Documentation fixes"; $whatclear{"new"} = "Additions"; $whatclear{"removed"} = "Removals"; $whatclear{"change"} = "Other changes"; $rankclear{"minor"} = "minor"; $rankclear{"major"} = "major"; @modorder = ("kernel","search","int","set","cpltset","scheduling", "graph","minimodel","driver", "iter","support","example","test","gist","flatzinc","other"); @whatorder = ("new","removed","change","bug","performance","documentation"); foreach $mod (@modorder) { $hastext{$mod} = 0; foreach $what (@whatorder) { $text{"$mod-$what"} = ""; } } while ($l = ) { LINE: next if ($l =~ /^\#/); $l =~ s/%Gecode/Gecode/g; if ($l =~ /^\[RELEASE\]/) { # Print previous if (!$first) { print "
    \n"; foreach $mod (@modorder) { if ($hastext{$mod}) { print "
  • " . $modclear{$mod} . "\n
      \n"; $hastext{$mod} = 0; foreach $what (@whatorder) { if (!($text{"$mod-$what"} eq "")) { print "
    • " . $whatclear{$what} . "\n
        "; print $text{"$mod-$what"}; print "
    • \n"; $text{"$mod-$what"} = ""; } } print "
  • \n"; } } print "
\n"; exit(0); } $first = 0; $version = ""; $info = ""; $date = ""; while (($l = ) && !($l =~ /\[DESCRIPTION\]/)) { $l =~ s/%Gecode/Gecode/g; if ($l =~ /Version:[\t ]*(.*)$/) { $version = $1; } elsif ($l =~ /Date:[\t ]*(.*)$/) { $date = $1; } } while (($l = ) && !($l =~ /\[ENTRY\]/)) { $l =~ s/%Gecode/Gecode/g; # chop $l; $info = $info . " " . $l; } goto LINE; } if ($l =~ /^\[ENTRY\]/) { my $mod, $what, $rank, $bug, $desc, $thanks; $desc = ""; $bug = ""; $rank = ""; $what = ""; $mod = ""; $thanks = ""; while (($l = ) && !($l =~ /\[DESCRIPTION\]/)) { $l =~ s/%Gecode/Gecode/g; if ($l =~ /Module:[\t ]*(.*)$/) { $mod = $1; } elsif ($l =~ /What:[\t ]*(.*)$/) { $what = $1; } elsif ($l =~ /Rank:[\t ]*(.*)$/) { $rank = $1; } elsif ($l =~ /Bug:[\t ]*(.*)$/) { $bug = $1; } elsif ($l =~ /Thanks:[\t ]*(.*)$/) { $thanks = $1; } } while (($l = ) && !(($l =~ /\[ENTRY\]/) || ($l =~ /\[RELEASE\]/))) { $l =~ s/%Gecode/Gecode/g; # chop $l; if (!($l =~ /\[MORE\]/)) { if ($desc eq "") { $desc = $l; } else { $desc = $desc . " " . $l; } } } chop $desc; $hastext{$mod} = 1; $rb = $rankclear{$rank}; if (!($bug eq "")) { $rb = $rb . ", bugzilla entry $bug"; # $rb = $rb . ", bugzilla entry"; } if (!($thanks eq "")) { $rb = $rb . ", thanks to $thanks"; } $text{"$mod-$what"} = ($text{"$mod-$what"} . "
  • $desc(" . $rb . ")
  • \n"); goto LINE; } } print < # # Copyright: # Guido Tack, 2008 # # Last modified: # $Date: 2008-02-25 14:01:43 +0100 (Mon, 25 Feb 2008) $ by $Author: tack $ # $Revision: 6301 $ # # This file is part of Gecode, the generic constraint # development environment: # http://www.gecode.org # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # use File::Basename; open (TESTS, "./test/test -list |"); my %tests; my $blockSize = 40; while ($l = ) { chomp($l); $tests{$l} = ""; } close (TESTS); $size = 0; foreach my $k (keys %tests) { $size++; } my $targets = $size / $blockSize; open (EXAMPLES, "find ./examples -maxdepth 1 -type f ! -name '*.*' |"); my @examples; while (my $x = ) { chomp($x); my ($filename, $dummydir, $suffix) = fileparse($x); open (HELP, "$x -help 2>&1 |"); my @prop; my @model; while (my $l = ) { if ($l =~ /-propagation \((.*)\)/) { $l1 = $1; $l1 =~ s/ //g; @prop = split(/,/, $l1); } elsif ($l =~ /-model \((.*)\)/) { $l1 = $1; $l1 =~ s/ //g; @model = split(/,/, $l1); } } if (scalar(@prop) == 0) { if (scalar(@model) == 0) { push(@examples, $filename); } else { foreach $m (@model) { push(@examples, "$filename -model $m"); } } } else { foreach $p (@prop) { if (scalar(@model) == 0) { push(@examples, "$filename -propagation $p"); } else { foreach $m (@model) { push(@examples, "$filename -propagation $p -model $m"); } } } } close (HELP); } close (EXAMPLES); print "LCOVOUTDIR = /srv/gecode/httpd/html/Internal/gcov-trunk\n\n"; print "all: tests examples\n"; print "\tlcov --directory \$(PWD) --base-directory \$(PWD) --capture \\\n"; print "\t --output-file testsandexamples.info\n"; print "\tgenhtml -t \"Gecode tests and examples\" testsandexamples.info -o \$(LCOVOUTDIR) -p \$(PWD)\n\n"; print "tests: \\\n"; for (my $tcount = 0; $tcount <= $targets; $tcount++) { print "\ttest$tcount \\\n"; } print "\tdone\n\n"; print "examples: \\\n"; foreach $e (@examples) { $etarget = $e; $etarget =~ s/[ -]/_/g; print "\t$etarget \\\n"; } print "\tdone\n\n"; $tcount = 1; $count = 0; print "test0:\n"; print "\t./test/test \\\n"; foreach my $k (keys %tests) { if ($count == $blockSize) { print "\t\t\$(TESTOPTIONS)\n\n"; print "test$tcount:\n"; print "\t./test/test \\\n"; $count = 0; $tcount++; } print "\t\t-test ".$k." \\\n"; $count++; } if ($count < $blockSize) { print "\t\t\$(TESTOPTIONS)\n\n"; } foreach $e (@examples) { $etarget = $e; $etarget =~ s/[ -]/_/g; print "$etarget:\n"; print "\t./examples/$e -time 240000\n\n"; } print "done:\n"; gecode-4.2.1/misc/genlicense.perl0000755000175000010010000000725512116410731016024 0ustar schulteNone#!/usr/bin/perl # # Main authors: # Christian Schulte # # Copyright: # Christian Schulte, 2005 # # Last modified: # $Date: 2013-03-08 17:29:13 +0100 (Fri, 08 Mar 2013) $ by $Author: schulte $ # $Revision: 13486 $ # # This file is part of Gecode, the generic constraint # development environment: # http://www.gecode.org # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # # # Get authors of all files # %main = (); %fix = (); while ($l = <>) { if (($l =~ /Main authors:/) || ($l =~ /Contributing authors:/)) { while (($l = <>) && ($l =~ /([A-Z].*) <(.*)>/)) { $main{$1} = $2; } } elsif ($l =~ /provided by:/) { while (($l = <>) && ($l =~ /([A-Z][^<]*)/)) { $fix{$1} = ""; } } } print < MIT license, which reads as follows: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \\section SecLicAuthors Gecode authors The following authors have contributed to the %Gecode library and its documentation (in alphabetical order of firstname): EOF ; foreach $n (sort(keys(%main))) { $e = $main{$n}; print " - $n <$e>\n"; } print < # # Copyright: # Christian Schulte, 2010 # # Last modified: # $Date: 2013-03-12 10:40:39 +0100 (Tue, 12 Mar 2013) $ by $Author: schulte $ # $Revision: 13502 $ # # This file is part of Gecode, the generic constraint # development environment: # http://www.gecode.org # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # $dlldescription{"Kernel"} = "kernel"; $dlldescription{"Search"} = "search engines"; $dlldescription{"Int"} = "finite domain integers"; $dlldescription{"Set"} = "finite integer sets"; $dlldescription{"Float"} = "floats"; $dlldescription{"Minimodel"} = "minimal modeling support"; $dlldescription{"Driver"} = "script commandline driver"; $dlldescription{"FlatZinc"} = "FlatZinc interpreter library"; $dlldescription{"Gist"} = "Gist"; $dlldescription{"Support"} = "support algorithms and datastructures"; $i = 0; # Includes Gecode version and more $dllsuffix = $ARGV[$i++]; if ($dllsuffix =~ /-([0-9]+)-([0-9]+)-([0-9]+)-([rd])-x[0-9]+\.dll/) { $revx = $1; $revy = $2; $revz = $3; $mode = $4; } # Directory where source files reside $dir = $ARGV[$i++]; # File for which a resource template is to be generated $file = $ARGV[$i++]; # Source files follows from folloeing argument positions $n_srcfiles = 0; while ($arg = $ARGV[$i]) { $srcfile[$n_srcfiles] = "$dir/$arg"; $n_srcfiles++; $i++; } print < * * Copyright: * Christian Schulte, 2010 * * The generated code fragments are part of Gecode, the generic * constraint development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ EOF ; # Find authors for copyright from srcfiles for ($f=0; $f<$n_srcfiles; $f++) { open SRCFILE, $srcfile[$f]; $incopyright = 0; while ($l = ) { if ($incopyright) { if ($l =~ /\*.*Last modified:/) { $incopyright = 0; } elsif ($l =~ /\*\s*(.*), [0-9]+/) { $authors{$1} = 1; } } elsif ($l =~ /\*.*Copyright:/) { $incopyright = 1; } } close SRCFILE; } $copyright = ""; foreach $a (sort(keys(%authors))) { $copyright = $copyright . ", " . $a; } $copyright =~ s|^, ||o; if ($file =~ /Gecode(.*)-([0-9]+-[0-9]+-[0-9]+-[rd]-.+)\.dll$/) { $filename = $file; $filetype = "VFT_DLL"; $icon = 0; $basename = "Gecode$1-$2"; $description = "Gecode " . $dlldescription{$1}; } else { $filetype = "VFT_APP"; $icon = 1; if ($file =~ /fzn-gecode\.exe/) { $filename = "fzn-gecode.exe"; $basename = "fzn-gecode"; $description = "Gecode FlatZinc interpreter"; } elsif ($file =~ /test\.exe/) { $filename = "test.exe"; $basename = "test"; $description = "Gecode systematic tests"; } elsif ($file =~ /examples\/(.+)\.exe/) { $filename = "$1.exe"; $basename = "$1"; open SRCFILE, $srcfile[0]; $example = ""; while ($l = ) { if ($l =~ /\\brief.*Example: (.*)/) { $example = $1; } } $example =~ s|\%||og; close SRCFILE; $description = "Gecode example: $example"; } else { die "Illegal file"; } } if ($mode =~ /r/) { $debug = 0; } else { $debug = "VS_FF_DEBUG"; } print < EOF ; if ($icon) { print "0 ICON \"misc/gecode-logo.ico\"\n"; } print < # # Copyright: # Christian Schulte, 2005 # # Last modified: # $Date: 2013-02-20 18:27:38 +0100 (Wed, 20 Feb 2013) $ by $Author: schulte $ # $Revision: 13347 $ # # This file is part of Gecode, the generic constraint # development environment: # http://www.gecode.org # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # @modorder = ("kernel","search","int","set","float","minimodel","gist","driver", "iter","support","example","test","flatzinc"); @catorder = ("core","memory","var","prop","branch","post", "int","set","float","minimodel","stress","any", "sequential","parallel","search", "other"); $modclear{"kernel"} = "Kernel"; $modclear{"search"} = "Search engines"; $modclear{"gist"} = "Gist"; $modclear{"int"} = "Integer and Boolean variables and constraints"; $modclear{"set"} = "Set variables and constraints"; $modclear{"float"} = "Float variables and constraints"; $modclear{"minimodel"} = "Minimal modeling support"; $modclear{"driver"} = "Script commandline driver"; $modclear{"iter"} = "Range and value iterators"; $modclear{"support"} = "Support algorithms and datastructures"; $modclear{"example"} = "\%Example scripts"; $modclear{"test"} = "Systematic tests"; $modclear{"flatzinc"} = "FlatZinc interpreter"; $catclear{"core"} = "Core functionality"; $catclear{"memory"} = "Memory management"; $catclear{"var"} = "Variables, views, and variable implementations"; $catclear{"prop"} = "Propagators"; $catclear{"branch"} = "Branchers"; $catclear{"sequential"} = "Sequential search engines"; $catclear{"parallel"} = "Parallel search engines"; $catclear{"post"} = "Posting propagators for constraints"; $catclear{"any"} = "All"; $catclear{"other"} = "Miscellaneous"; $catclear{"int"} = "Integer and Boolean variables and constraints"; $catclear{"set"} = "Set variables and constraints"; $catclear{"float"} = "Float variables and constraints"; $catclear{"minimodel"} = "Minimal modeling support"; $catclear{"stress"} = "System stress"; $catclear{"search"} = "Search"; $catclear{"ignore"} = "ignored"; # # Get statistics for all files # $i = 0; while ($file = @ARGV[$i++]) { open(FILE,"<$file"); my $module = "UNKNOWN"; my $cat = "UNKNOWN"; my $n_blank; my $n_comment; my $n_code; my $n_class; while ($l = ) { if ($l =~ /\/\/ STATISTICS: ([A-Za-z]+)-([A-Za-z]+)/) { $module = $1; $cat = $2; exists $modclear{$module} or die "Module $m undefined (file $file)"; exists $catclear{$cat} or die "Category $cat undefined (file $file)"; } if ($l =~ /^[ \t]*$/) { $n_blank += 1; } elsif ($l =~ /^[ \t]*\/\//) { $n_comment += 1; } elsif ($l =~ /\/\*/) { $n_comment += 1; while (!($l =~ /\*\//) && ($l = )) { $n_comment += 1; } } else { $n_code += 1; } if ($l =~ /class [A-Za-z_][A-Za-z0-9_]*.*\{/) { $n_class += 1; } } if ($module eq "UNKNOWN") { print "UNKNOWN: $file\n"; exit 1; } $m{$module} = 1; $c{$cat} = 1; $class{"$module-$cat"} += $n_class; $comment{"$module-$cat"} += $n_comment; $blank{"$module-$cat"} += $n_blank; $code{"$module-$cat"} += $n_code; close FILE; } $i = 0; print < 1) { print $doc; } $an_code += $mn_code; $an_comment += $mn_comment; $an_class += $mn_class; } print < # Guido Tack # # Copyright: # Christian Schulte, 2005 # Guido Tack, 2006 # # Last modified: # $Date: 2012-09-10 19:38:07 +0200 (Mon, 10 Sep 2012) $ by $Author: schulte $ # $Revision: 13073 $ # # This file is part of Gecode, the generic constraint # development environment: # http://www.gecode.org # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # print <) { LINE: next if ($l =~ /^\#/); $l =~ s/%Gecode/Gecode/g; if ($l =~ /^\[RELEASE\]/) { # Print previous if (!$first) { print "Changes in Version $version ($date)\n\n"; print "Scope:$info"; foreach $mod (@modorder) { if ($hastext{$mod}) { print "- " . $modclear{$mod} . "\n"; $hastext{$mod} = 0; foreach $what (@whatorder) { if (!($text{"$mod-$what"} eq "")) { print " - " . $whatclear{$what} . "\n"; print $text{"$mod-$what"}; $text{"$mod-$what"} = ""; } } } } print "\n------------------------------------------------------------------------------\n\n"; } $first = 0; $version = ""; $info = ""; $date = ""; while (($l = <>) && !($l =~ /\[DESCRIPTION\]/)) { $l =~ s/%Gecode/Gecode/g; if ($l =~ /Version:[\t ]*(.*)$/) { $version = $1; } elsif ($l =~ /Date:[\t ]*(.*)$/) { $date = $1; } } while (($l = <>) && !($l =~ /\[ENTRY\]/)) { $l =~ s/%Gecode/Gecode/g; # chop $l; $info = $info . " " . $l; } goto LINE; } if ($l =~ /^\[ENTRY\]/) { my $mod, $what, $rank, $bug, $desc, $thanks; $desc = ""; $bug = ""; $rank = ""; $what = ""; $mod = ""; $thanks = ""; while (($l = <>) && !($l =~ /\[DESCRIPTION\]/)) { $l =~ s/%Gecode/Gecode/g; if ($l =~ /Module:[\t ]*(.*)$/) { $mod = $1; } elsif ($l =~ /What:[\t ]*(.*)$/) { $what = $1; } elsif ($l =~ /Rank:[\t ]*(.*)$/) { $rank = $1; } elsif ($l =~ /Bug:[\t ]*(.*)$/) { $bug = $1; } elsif ($l =~ /Thanks:[\t ]*(.*)$/) { $thanks = $1; } } while (($l = <>) && !(($l =~ /\[ENTRY\]/) || ($l =~ /\[RELEASE\]/))) { $l =~ s/%Gecode/Gecode/g; # chop $l; if (!($l =~ /\[MORE\]/)) { if ($desc eq "") { $desc = $l; } else { $desc = $desc . " " . $l; } } } chop $desc; $hastext{$mod} = 1; $rb = $rankclear{$rank}; if (!($bug eq "")) { $rb = $rb . ", bugzilla entry $bug"; # $rb = $rb . ", bugzilla entry"; } if (!($thanks eq "")) { $rb = $rb . ", thanks to $thanks"; } $text{"$mod-$what"} = ($text{"$mod-$what"} . " - $desc(" . $rb . ")\n"); goto LINE; } } print < # # Copyright: # Christian Schulte, 2007 # # Last modified: # $Date: 2011-05-27 09:38:46 +0200 (Fri, 27 May 2011) $ by $Author: tack $ # $Revision: 12028 $ # # This file is part of Gecode, the generic constraint # development environment: # http://www.gecode.org # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # while (($arg = $ARGV[$i]) && ($arg =~ /^-/)) { $i++; if ($arg eq "-header") { $gen_header = 1; } elsif ($arg eq "-typehpp") { $gen_typehpp = 1; } } $n_files = 0; while ($arg = $ARGV[$i]) { $files[$n_files] = $arg; $n_files++; $i++; } print < * * Copyright: * Christian Schulte, 2007 * * The generated code fragments are part of Gecode, the generic * constraint development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ EOF ; for ($f=0; $f<$n_files; $f++) { open (FILE, $files[$f]) || die "Could not open ".$files[$f]; ## General values $name[$f] = ""; $vti[$f] = ""; $ifdef[$f] = ""; $endif[$f] = ""; $dispose[$f] = 0; ## ## Headers and footers ## $mehdr[$f] = ""; # Header text for modification events $meftr[$f] = ""; # Footer text for modification events $pchdr[$f] = ""; # Header text for propagation conditions $pcftr[$f] = ""; # Footer text for propagation conditions ## ## Real stuff ## # $mec[$f] : combination table # $men[$f] : name table # $meh[$f] : header table $me_n[$f] = 0; # running number of modification events $me_subscribe[$f] = ""; # $pcn[$f] : name table # $pch[$f] : header table $pc_n[$f] = 0; # running number of propagation conditions $free_bits[$f] = 0; while ($l = ) { LINE: next if ($l =~ /^\#/); last if ($l =~ /^\[End\]/io); if ($l =~ /^\[General\]/io) { while (($l = ) && !($l =~ /^\[/)) { next if ($l =~ /^\#/); if ($l =~ /^Name:\s*(\w+)/io) { $name[$f] = $1; $vti[$f] = uc($name[$f]); } elsif ($l =~ /^Ifdef:\s*(\w+)/io) { $ifdef[$f] = "#ifdef $1\n"; $endif[$f] = "#endif\n"; } elsif ($l =~ /^Dispose:\s*true/io) { $dispose[$f] = 1; } elsif ($l =~ /^Namespace:\s*([^ \t\r\n]+)/io) { $namespace[$f] = $1; } elsif ($l =~ /^Bits:\s*([^ \t\r\n]+)/io) { $free_bits[$f] = $1+0; } } goto LINE; } elsif ($l =~ /^\[ModEventHeader\]/io) { while (($l = ) && !($l =~ /^\[/)) { next if ($l =~ /^\#/); $mehdr[$f] = $mehdr[$f] . $l; } goto LINE; } elsif ($l =~ /^\[ModEvent\]/io) { $n = ""; $h = ""; while (($l = ) && !($l =~ /^\[/)) { next if ($l =~ /^\#/); if ($l =~ /^Name:\s*(\w+)\s*=\s*(\w+)/io) { # Found a special modification event $lhs = $1; $rhs = $2; if (!($rhs eq "FAILED") && !($rhs eq "NONE") && !($rhs eq "ASSIGNED") && !($rhs eq "SUBSCRIBE")) { die "Unknown special modification event: $rhs\n"; } if ($rhs eq "SUBSCRIBE") { $me_subscribe[$f] = "ME_$vti[$f]_$lhs"; } else { $mespecial{$f}{$lhs} = $rhs; if ($rhs eq "ASSIGNED") { $me_assigned[$f] = "ME_$vti[$f]_$lhs"; } elsif ($rhs eq "FAILED") { $me_failed[$f] = "ME_$vti[$f]_$lhs"; } els } $n = $lhs; } elsif ($l =~ /^Name:\s*(\w+)/io) { # Found a normal modification event $n = $1; } elsif ($l =~ /^Combine:\s*(.+)/io) { # Found combination information $combines = $1; while ($combines =~ /(\w+)\s*=(\w+)/g) { $mec{$f}{$n}{$1} = $2; $mec{$f}{$1}{$n} = $2; } } else { $h = $h . $l; } } $men[$f][$me_n[$f]] = $n; $meh[$f][$me_n[$f]] = $h; $me_n[$f]++; $mec{$f}{"NONE"}{$n} = $n; $mec{$f}{$n}{"NONE"} = $n; goto LINE; } elsif ($l =~ /^\[ModEventFooter\]/io) { while (($l = ) && !($l =~ /^\[/)) { next if ($l =~ /^\#/); $meftr[$f] = $meftr[$f] . $l; } goto LINE; } elsif ($l =~ /^\[PropCondHeader\]/io) { while (($l = ) && !($l =~ /^\[/)) { next if ($l =~ /^\#/); $pchdr[$f] = $pchdr[$f] . $l; } goto LINE; } elsif ($l =~ /^\[PropCond\]/io) { $n = ""; $h = ""; while (($l = ) && !($l =~ /^\[/)) { next if ($l =~ /^\#/); if ($l =~ /^Name:\s*(\w+)\s*=\s*(\w+)/io) { # Found a special propagation condition $lhs = $1; $rhs = $2; if (!($rhs eq "ASSIGNED") && !($rhs eq "NONE")) { die "Unknown special propagation condition: $rhs\n"; } $pcspecial{$f}{$lhs} = $rhs; if ($rhs eq "ASSIGNED") { $pc_assigned[$f] = "PC_$vti[$f]_$lhs"; } if ($rhs eq "NONE") { $pc_none[$f] = "PC_$vti[$f]_$lhs"; } $n = $lhs; } elsif ($l =~ /^Name:\s*(\w+)/io) { # Found a normal modification event $n = $1; } elsif ($l =~ /^ScheduledBy:\s*(.+)/io) { # Found relation to modification events $events = $1; while ($events =~ /(\w+)/g) { $mepc{$f}{$1}{$n} = 1; } } else { $h = $h . $l; } } $pcn[$f][$pc_n[$f]] = $n; $pch[$f][$pc_n[$f]] = $h; $pc_n[$f]++; goto LINE; } elsif ($l =~ /^\[PropCondFooter\]/io) { while (($l = ) && !($l =~ /^\[/)) { next if ($l =~ /^\#/); $pcftr[$f] = $pcftr[$f] . $l; } goto LINE; } } close FILE; $maxpc[$f] = "PC_$vti[$f]_" . $pcn[$f][$pc_n[$f]-1]; $class[$f] = "$name[$f]VarImpBase"; $conf[$f] = "$name[$f]VarImpConf"; $base[$f] = "Gecode::VarImp<$namespace[$f]::$conf[$f]>"; # Generate namespace header and footer foreach $ns (split('::',$namespace[$f])) { $hdr[$f] = "$hdr[$f]namespace $ns { "; $ftr[$f] = "$ftr[$f]}"; } $hdr[$f] = "$hdr[$f]\n"; $ftr[$f] = "$ftr[$f]\n"; ## Check whether there is only one real event if ($me_n[$f] == 3) { $me_subscribe[$f] = $me_assigned[$f]; } $o = 2; for ($i=0; $i<$me_n[$f]; $i++) { $n = $men[$f][$i]; if ($mespecial{$f}{$n} eq "NONE") { $val2me[$f][0] = $n; } elsif ($mespecial{$f}{$n} eq "ASSIGNED") { $val2me[$f][1] = $n; } elsif (!$mespecial{$f}{$n}) { $val2me[$f][$o] = $n; $o++; } } $me_max[$f] = "ME_$vti[$f]_" . $val2me[$f][$o-1] . "+1"; $me_max_n[$f] = $o; $len = 0; for ($i=0; $i<$me_max_n[$f];$i++) { $n = $val2me[$f][$i]; $me_a{$f}{$n} = "ME_$vti[$f]_$n"; if (length($me_a{$f}{$n}) > $len) { $len = length($me_a{$f}{$n}); } } for ($i=0; $i<$me_max_n[$f]; $i++) { $n = $val2me[$f][$i]; while ($len > length($me_a{$f}{$n})) { $me_a{$f}{$n} = "$me_a{$f}{$n} "; } } for ($b=1; (1 << $b) < $me_max_n[$f]; $b++) {} $bits[$f] = $b; } if ($gen_typehpp) { for ($f = 0; $f<$n_files; $f++) { print $ifdef[$f]; print $hdr[$f]; print $mehdr[$f]; $o = 1; for ($i=0; $i<$me_n[$f]; $i++) { $n = $men[$f][$i]; print $meh[$f][$i]; print " const Gecode::ModEvent ME_" . $vti[$f] . "_${n} = "; if ($mespecial{$f}{$n}) { print "Gecode::ME_GEN_" . $mespecial{$f}{$n}; } else { print "Gecode::ME_GEN_ASSIGNED + " . $o; $o++; } print ";\n"; } print $meftr[$f]; print $pchdr[$f]; $o = 1; for ($i=0; $i<$pc_n[$f]; $i++) { $n = $pcn[$f][$i]; print $pch[$f][$i]; print " const Gecode::PropCond PC_$vti[$f]_${n} = "; if ($pcspecial{$f}{$n}) { print "Gecode::PC_GEN_" . $pcspecial{$f}{$n}; } else { print "Gecode::PC_GEN_ASSIGNED + " . $o; $o++; } print ";\n"; } print $pcftr[$f]; print $ftr[$f]; print $endif[$f]; } for ($f = 0; $f<$n_files; $f++) { print $ifdef[$f]; if ($dispose[$f]) { print "\n#ifndef GECODE_HAS_VAR_DISPOSE\n"; print "#define GECODE_HAS_VAR_DISPOSE 1\n"; print "#endif\n\n"; } print $hdr[$f]; print " /// Configuration for $name[$f]-variable implementations\n"; print " class $conf[$f] {\n"; print " public:\n"; print " /// Index for cloning\n"; print " static const int idx_c = "; if ($f == 0) { print "0;\n"; } else { print "$namespace[$f-1]::$conf[$f-1]::idx_c+1;\n"; } print " /// Index for disposal\n"; print " static const int idx_d = "; if ($dispose[$f]) { if ($f == 0) { print "0;\n"; } else { print "$namespace[$f-1]::$conf[$f-1]::idx_d+1;\n"; } } else { if ($f == 0) { print "-1;\n"; } else { print "$namespace[$f-1]::$conf[$f-1]::idx_d;\n"; } } print " /// Maximal propagation condition\n"; print " static const Gecode::PropCond pc_max = $maxpc[$f];\n"; print " /// Freely available bits\n"; print " static const int free_bits = $free_bits[$f];\n"; print " /// Start of bits for modification event delta\n"; print " static const int med_fst = "; if ($f == 0) { print "0;\n"; } else { print "$namespace[$f-1]::$conf[$f-1]::med_lst;\n"; } print " /// End of bits for modification event delta\n"; print " static const int med_lst = med_fst + $bits[$f];\n"; print " /// Bitmask for modification event delta\n"; print " static const int med_mask = ((1 << $bits[$f]) - 1) << med_fst;\n"; print " /// Combine modification events \\a me1 and \\a me2\n"; print " static Gecode::ModEvent me_combine(Gecode::ModEvent me1, Gecode::ModEvent me2);\n"; print " /// Update modification even delta \\a med by \\a me, return true on change\n"; print " static bool med_update(Gecode::ModEventDelta& med, Gecode::ModEvent me);\n"; print " };\n"; print $ftr[$f]; if (!($ifdef[$f] eq "")) { print "#else\n"; print $hdr[$f]; print " /// Dummy configuration for $name[$f]-variable implementations\n"; print " class $conf[$f] {\n"; print " public:\n"; print " /// Index for cloning\n"; print " static const int idx_c = "; if ($f == 0) { print "-1;\n"; } else { print "$namespace[$f-1]::$conf[$f-1]::idx_c;\n"; } print " /// Index for disposal\n"; print " static const int idx_d = "; if ($f == 0) { print "-1;\n"; } else { print "$namespace[$f-1]::$conf[$f-1]::idx_d;\n"; } print " /// End of bits for modification event delta\n"; print " static const int med_lst = "; if ($f == 0) { print "0;\n"; } else { print "$namespace[$f-1]::$conf[$f-1]::med_lst;\n"; } print " };\n"; print $ftr[$f]; } print $endif[$f]; } print "\n"; print "namespace Gecode {\n\n"; print " /// Configuration for all variable implementations\n"; print " class AllVarConf {\n"; print " public:\n"; print " /// Index for cloning\n"; print " static const int idx_c = $namespace[$n_files-1]::$conf[$n_files-1]::idx_c+1;\n"; print " /// Index for dispose\n"; print " static const int idx_d = $namespace[$n_files-1]::$conf[$n_files-1]::idx_d+1;\n"; print " /// Combine modification event delta \\a med1 with \\a med2\n"; print " static ModEventDelta med_combine(ModEventDelta med1, ModEventDelta med2);\n"; print " };\n\n}\n\n"; for ($f = 0; $f<$n_files; $f++) { print $ifdef[$f]; print $hdr[$f]; print " forceinline Gecode::ModEvent\n"; print " $conf[$f]::me_combine(Gecode::ModEvent me1, Gecode::ModEvent me2) {\n"; if ($me_max_n[$f] == 2) { print " return me1 | me2;\n"; } elsif ($me_max_n[$f] <= 4) { print " static const Gecode::ModEvent me_c = (\n"; for ($i=0; $i<$me_max_n[$f];$i++) { $n1 = $val2me[$f][$i]; print " (\n"; for ($j=0; $j<$me_max_n[$f];$j++) { $n2 = $val2me[$f][$j]; $n3 = $mec{$f}{$n1}{$n2}; $shift = (($i << 3) + ($j << 1)); if ($shift < 10) { $shift = " $shift"; } print " ($me_a{$f}{$n3} << $shift)"; if ($j+1 == $me_max_n[$f]) { print " "; } else { print " | "; } print " // [$me_a{$f}{$n1}][$me_a{$f}{$n2}]\n"; } if ($i+1 == $me_max_n[$f]) { print " )\n"; } else { print " ) |\n"; } } print " );\n"; print " return ((me_c >> (me2 << 3)) >> (me1 << 1)) & 3;\n"; } else { print " static const Gecode::ModEvent me_c[$me_max[$f]][$me_max[$f]] = {\n"; for ($i=0; $i<$me_max_n[$f];$i++) { $n1 = $val2me[$f][$i]; print " {\n"; for ($j=0; $j<$me_max_n[$f];$j++) { $n2 = $val2me[$f][$j]; $n3 = $mec{$f}{$n1}{$n2}; print " $me_a{$f}{$n3}"; if ($j+1 == $me_max_n[$f]) { print " "; } else { print ","; } print " // [$me_a{$f}{$n1}][$me_a{$f}{$n2}]\n"; } print " }"; if ($i+1 == $me_max_n[$f]) { print "\n"; } else { print ",\n"; } } print " };\n"; print " return me_c[me1][me2];\n"; } print " }\n"; print " forceinline bool\n"; print " $conf[$f]::med_update(Gecode::ModEventDelta& med, Gecode::ModEvent me) {\n"; print " switch (me) {\n"; if ($me_max_n[$f] == 2) { $ME_NONE = "ME_$vti[$f]_NONE"; if ($val2me[$f][0] eq "NONE") { $ME_ASSIGNED = "ME_$vti[$f]_$val2me[$f][1]"; } else { $ME_ASSIGNED = "ME_$vti[$f]_$val2me[$f][0]"; } print " case $ME_NONE:\n"; print " return false;\n"; print " case $ME_ASSIGNED:\n"; print " if ((med & ($ME_ASSIGNED << med_fst)) != 0)\n"; print " return false;\n"; print " med |= $ME_ASSIGNED << med_fst;\n"; print " break;\n"; } else { $lvti = lc($vti[$f]); for ($i=0; $i<$me_max_n[$f];$i++) { $n1 = $val2me[$f][$i]; $weak = 1; for ($j=0; $j<$me_max_n[$f];$j++) { $n2 = $val2me[$f][$j]; if (!($n2 eq "NONE") && !($n2 eq $n1) && !($mec{$f}{$n1}{$n2} eq $n2)) { $weak = 0; } } print " case ME_$vti[$f]_$n1:\n"; if ($n1 eq "NONE") { print " return false;\n"; } elsif ($mespecial{$f}{$n1} eq "ASSIGNED") { print " {\n"; print " Gecode::ModEventDelta med_$lvti = med & med_mask;\n"; print " if (med_$lvti == (ME_$vti[$f]_$n1 << med_fst))\n"; print " return false;\n"; print " med ^= med_$lvti;\n"; print " med ^= ME_$vti[$f]_$n1 << med_fst;\n"; print " break;\n"; print " }\n"; } elsif ($weak) { print " {\n"; print " Gecode::ModEventDelta med_$lvti = med & med_mask;\n"; print " if (med_$lvti != 0)\n"; print " return false;\n"; print " med |= ME_$vti[$f]_$n1 << med_fst;\n"; print " break;\n"; print " }\n"; } else { print " {\n"; if ($me_max_n[$f] <= 8) { print " static const Gecode::ModEvent me_c = (\n"; for ($j=0; $j<$me_max_n[$f];$j++) { $n2 = $val2me[$f][$j]; $n3 = $mec{$f}{$n1}{$n2}; $shift = $j << 2; if ($shift < 10) { $shift = " $shift"; } print " (($me_a{$f}{$n2} ^ $me_a{$f}{$n3}) << $shift)"; if ($j+1 != $me_max_n[$f]) { print " |\n"; } } print "\n );\n"; print " Gecode::ModEvent me_o = (med & med_mask) >> med_fst;\n"; print " Gecode::ModEvent me_n = (me_c >> (me_o << 2)) & (med_mask >> med_fst);\n"; print " if (me_n == 0)\n"; print " return false;\n"; print " med ^= me_n << med_fst;\n"; print " break;\n"; } else { print " static const Gecode::ModEventDelta me_c[$me_max[$f]] = {\n"; for ($j=0; $j<$me_max_n[$f];$j++) { $n2 = $val2me[$f][$j]; $n3 = $mec{$f}{$n1}{$n2}; print " ($me_a{$f}{$n2} ^ $me_a{$f}{$n3}) << med_fst"; if ($j+1 != $me_max_n[$f]) { print ",\n"; } } print "\n };\n"; print " Gecode::ModEvent me_o = (med & med_mask) >> med_fst;\n"; print " Gecode::ModEventDelta med_n = me_c[me_o];\n"; print " if (med_n == 0)\n"; print " return false;\n"; print " med ^= med_n;\n"; print " break;\n"; } print " }\n"; } } } print " default: GECODE_NEVER;\n"; print " }\n"; print " return true;\n"; print " }\n\n"; print $ftr[$f]; print $endif[$f]; } print "namespace Gecode {\n"; print " forceinline ModEventDelta\n"; print " AllVarConf::med_combine(ModEventDelta med1, ModEventDelta med2) {\n"; for ($f = 0; $f<$n_files; $f++) { $vic = "$namespace[$f]::$conf[$f]"; print $ifdef[$f]; print " (void) ${vic}::med_update(med1,(med2 & ${vic}::med_mask) >> ${vic}::med_fst);\n"; print $endif[$f]; } print " return med1;\n"; print " }\n}\n\n"; } if ($gen_header) { for ($f = 0; $f<$n_files; $f++) { print $ifdef[$f]; print $hdr[$f]; print " /// Base-class for $name[$f]-variable implementations\n"; print " class $class[$f] : public $base[$f] {\n"; if ($dispose[$f]) { print <(vars_d(home)); vars_d(home,this); } forceinline $class[$f]::$class[$f](Gecode::Space& home, bool share, $class[$f]\& x) : $base[$f](home,share,x) { _next_d = static_cast<$class[$f]*>(vars_d(home)); vars_d(home,this); } forceinline $class[$f]* $class[$f]::next_d(void) const { return _next_d; } EOF ; } else { print <\"; };\n" } print "/* End PBXFileReference section */\n\n"; print "/* Begin PBXGroup section */\n"; my $sourcesUID = uid(); printGroup("Sources",$sourcesUID,\%sourceTree,"./"); my $headersUID = uid(); printGroup("Headers",$headersUID,\%headerTree,"./"); my $mainUID = uid(); print <) { chomp($f); my ($filename, $dummydir, $suffix) = fileparse($f); my @dirs = split(/\//,$f); shift(@dirs); pop(@dirs); my $treeP; if ($type =~ m/sourcecode\..*\.h/) { $treeP = \%headerTree; } else { $treeP = \%sourceTree; } foreach my $d (@dirs) { if (not exists $treeP->{$d}) { my %subTree = (); my @child = (uid(), \%subTree); $treeP->{$d} = [@child]; } $treeP = $treeP->{$d}[1]; } $treeP->{$filename} = ""; my @r = (uid(), $filename, $type); $files{$f} = [@r]; } close (F); } sub uid { my $uid = `uuidgen`; $uid =~ /[A-Z0-9]+-([A-Z0-9]+)-([A-Z0-9]+)-([A-Z0-9]+)-([A-Z0-9]+)/; return $1.$2.$3.$4; } sub printGroup { my $g = $_[0]; my $id = $_[1]; my $treeP = $_[2]; my $path = $_[3]; print " ".$id. " /* ".$g." */ = {\n"; print " isa = PBXGroup;\n"; print " children = (\n"; foreach my $k (sort keys %{$treeP}) { if (exists $treeP->{$k}[0]) { print " ".$treeP->{$k}[0]." /* ".$k." */,\n"; } else { print " ".$files{$path.$k}[0]." /* ".$k." */,\n"; } } print " );\n"; if ($path eq "./") { print " path = \".\";\n"; print " name = \"$g\";\n"; } else { print " path = \"$g\";\n"; } print " sourceTree = \"\";\n };\n"; foreach my $k (keys %{$treeP}) { if (exists $treeP->{$k}[0]) { printGroup($k, $treeP->{$k}[0], $treeP->{$k}[1], $path.$k."/"); } } } gecode-4.2.1/misc/getrevision.perl0000755000175000010010000000305010656613355016251 0ustar schulteNone#!/usr/bin/perl # # Main authors: # Christian Schulte # # Copyright: # Christian Schulte, 2005 # # Last modified: # $Date: 2007-08-09 15:30:21 +0200 (Thu, 09 Aug 2007) $ by $Author: tack $ # $Revision: 4790 $ # # This file is part of Gecode, the generic constraint # development environment: # http://www.gecode.org # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # # # Print revision of file # while ($l = <>) { if ($l =~ /Revision: ([0-9\.]*) /) { print "Revision: $1\n"; exit 0; } } gecode-4.2.1/misc/makedepend.perl0000755000175000010010000000457511734626661016027 0ustar schulteNone# # Main authors: # Christian Schulte # # Copyright: # Christian Schulte, 2005 # # Last modified: # $Date: 2012-03-28 17:26:41 +0200 (Wed, 28 Mar 2012) $ by $Author: schulte $ # $Revision: 12649 $ # # This file is part of Gecode, the generic constraint # development environment: # http://www.gecode.org # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # # # Ultra-simplistic makedepend: Just find existing files # Relies on: # - all filenames are relative to root directory, which is the first argument # - #ifdef can be safely ignored # $i=0; $root = $ARGV[$i++]; while ($target = $ARGV[$i++]) { my @todo = (); my %done = (); push @todo, $target; while ($f = pop @todo) { open FILE, "$root/$f" or open FILE, "$f" or die "File missing: $root/$f\n"; while ($l = ) { if ($l =~ /^\#include <(gecode\/.*)>/ || $l =~ /^\#include "(.*)"/) { $g = $1; $g =~ s|^\./||og; if (!($g =~ /^gecode\/third-party/) && !$done{$g}) { push @todo, $g; if (-e "$root/$g") { $done{$g} = "$root/"; } else { $done{$g} = ""; } } } } close FILE; } $target =~ s|\.cpp?||og; print "$target\$(OBJSUFFIX) $target\$(SBJSUFFIX): "; $l = 3; foreach $g (sort(keys(%done))) { if ($l == 3) { print "\\\n\t"; $l = 0; } print "$done{$g}$g "; $l++; } print "\n"; } gecode-4.2.1/misc/svn-ignore-root.txt0000755000175000010010000000060612111204621016620 0ustar schulteNone.deps .libs *~ *.la *.lo *.o *.s *.obj *.sbj *.dll *.lib *.exp *.ilk *.pdb *.suo *.sln *.exe *.manifest *.so *.dylib *.res *.rc moc_*.cpp Makefile Makefile.dep autom4te.cache changelog.hh config.log config.status doc doxygen.hh doxygen.conf doxygen.conf.use doxygen.conf.chm doxygen.log header.html GecodeReference.chm GecodeReference.tag license.hh stat.hh gecode-*.zip gecode-*.tar.gz .* gecode-4.2.1/misc/svn-ignore.txt0000755000175000010010000000016112111204621015633 0ustar schulteNone.deps .libs *~ *.la *.lo *.o *.s *.obj *.sbj *.ilk *.pdb *.suo *.sln *.exe *.manifest *.rc *.res moc_*.cpp *.bat gecode-4.2.1/test/0000755000175000010010000000000012236131650013037 5ustar schulteNonegecode-4.2.1/test/afc.cpp0000755000175000010010000000773711654516712014326 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2009 * * Last modified: * $Date: 2011-11-03 14:57:30 +0100 (Thu, 03 Nov 2011) $ by $Author: tack $ * $Revision: 12455 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include "test/test.hh" namespace Test { /// %Test for %AFC infrastructure class AFC : public Test::Base { protected: /// Test space class TestSpace : public Gecode::Space { protected: /// Two integer variables Gecode::IntVar x, y; public: /// Constructor for creation TestSpace(void) : x(*this,0,10), y(*this,0,10) {} /// Constructor for cloning \a s TestSpace(bool share, TestSpace& s) : Space(share,s) { x.update(*this,share,s.x); y.update(*this,share,s.y); } /// Post arbitrary propagator void post(void) { Gecode::rel(*this, x, Gecode::IRT_LE, y); } /// Copy during cloning virtual Space* copy(bool share) { return new TestSpace(share,*this); } }; /// How many test operations to be performed static const int n_ops = 8 * 1024; /// How many spaces to maintain static const int n = 16; /// Return random index of non-null space int space(TestSpace* s[]) { int i = rand(n); while (s[i] == NULL) i = (i+1) % n; return i; } /// Return random index int index(void) { return rand(n); } public: /// Initialize test AFC(void) : Test::Base("AFC") {} /// Perform actual tests bool run(void) { // Array of spaces for tests TestSpace* s[n]; // How many spaces exist in s int n_s = 1; for (int i=n; i--; ) s[i] = NULL; s[0] = new TestSpace; for (int o=n_ops; o--; ) switch (rand(3)) { case 0: // clone space { int i = index(); if ((s[i] != NULL)) { if (n_s > 1) { delete s[i]; s[i]=NULL; n_s--; } else { break; } } int j = space(s); (void) s[j]->status(); s[i] = static_cast(s[j]->clone()); n_s++; } break; case 1: // delete space if (n_s > 1) { int i = space(s); delete s[i]; s[i]=NULL; n_s--; } break; case 2: // post propagator s[space(s)]->post(); break; default: GECODE_NEVER; } // Delete all remaining spaces for (int i=n; i--; ) delete s[i]; return true; } }; AFC afc; } // STATISTICS: test-core gecode-4.2.1/test/array.cpp0000755000175000010010000002350111654516712014676 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Gregory Crosswhite * * Copyright: * Gregory Crosswhite, 2011 * * Last modified: * $Date: 2011-11-03 14:57:30 +0100 (Thu, 03 Nov 2011) $ by $Author: tack $ * $Revision: 12455 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include "test/test.hh" /// Check the test result and handle failed test #define CHECK_TEST(T,M) \ if (opt.log) \ olog << ind(3) << "Check: " << (M) << std::endl; \ if (!(T)) { \ problem = (M); goto failed; \ } /// Start new test #define START_TEST(T) \ if (opt.log) { \ olog.str(""); \ olog << ind(2) << "Testing: " << (T) << std::endl; \ } \ test = (T); namespace Test { /// Tests for arrays namespace Array { /// Test name prefix static const std::string prefix("Array::Iterator::"); /// %Base class for testing iterators class Iterator : public Test::Base { protected: /// Maximum array size static const int n = 16; /// Initialize test Iterator(const std::string& name) : Test::Base(prefix + name) {} /// Perform actual tests template bool runTestForArray(Array& a) { // Test/problem information. const char* test = "NONE"; const char* problem = "NONE"; // Constant reference to the array const Array& const_a = a; START_TEST("Iteration"); { typedef typename Array::reference reference; typedef typename Array::pointer pointer; typedef typename Array::iterator iterator; const iterator begin = a.begin(), end = a.end(); CHECK_TEST(end-begin==a.size(),"Distance != size"); int index = 0; iterator iter = begin; for(; iter != end; ++iter, ++index) { reference ref = *iter; const pointer ptr = &ref; CHECK_TEST(ptr==&a[index],"Iterator points to the wrong element (going forward)"); } CHECK_TEST(index==a.size(),"Iteration covered the wrong number of elements (going forward)"); for(; iter != begin; --iter, --index) { reference ref = *(iter-1); const pointer ptr = &ref; CHECK_TEST(ptr==&a[index-1],"Iterator points to the wrong element (going backwards)"); } CHECK_TEST(index==0,"Iteration covered the wrong number of elements (going backward)"); } START_TEST("Read-only iteration"); { typedef typename Array::const_reference reference; typedef typename Array::const_pointer pointer; typedef typename Array::const_iterator iterator; const iterator begin = const_a.begin(), end = const_a.end(); CHECK_TEST(end-begin==const_a.size(),"Distance != size"); int index = 0; iterator iter = begin; for(; iter != end; ++iter, ++index) { reference ref = *iter; const pointer ptr = &ref; CHECK_TEST(ptr==&const_a[index],"Iterator points to the wrong element (going forward)"); } CHECK_TEST(index==const_a.size(),"Iteration covered the wrong number of elements (going forward)"); for(; iter != begin; --iter, --index) { reference ref = *(iter-1); const pointer ptr = &ref; CHECK_TEST(ptr==&const_a[index-1],"Iterator points to the wrong element (going backwards)"); } CHECK_TEST(index==0,"Iteration covered the wrong number of elements (going backward)"); } START_TEST("Reverse iteration"); { typedef typename Array::reference reference; typedef typename Array::pointer pointer; typedef typename Array::reverse_iterator iterator; const iterator begin = a.rbegin(), end = a.rend(); CHECK_TEST(end-begin==a.size(),"Distance != size"); int index = a.size(); iterator iter = begin; for(; iter != end; ++iter, --index) { reference ref = *iter; const pointer ptr = &ref; CHECK_TEST(ptr==&a[index-1],"Iterator points to the wrong element (going forward)"); } CHECK_TEST(index==0,"Iteration covered the wrong number of elements (going forward)"); for(; iter != begin; --iter, ++index) { reference ref = *(iter-1); const pointer ptr = &ref; CHECK_TEST(ptr==&a[index],"Iterator points to the wrong element (going backwards)"); } CHECK_TEST(index==a.size(),"Iteration covered the wrong number of elements (going backward)"); } START_TEST("Reverse read-only iteration"); { typedef typename Array::const_reference reference; typedef typename Array::const_pointer pointer; typedef typename Array::const_reverse_iterator iterator; const iterator begin = const_a.rbegin(), end = const_a.rend(); CHECK_TEST(end-begin==const_a.size(),"Distance != size"); int index = a.size(); iterator iter = begin; for(; iter != end; ++iter, --index) { reference ref = *iter; const pointer ptr = &ref; CHECK_TEST(ptr==&const_a[index-1],"Iterator points to the wrong element (going forward)"); } CHECK_TEST(index==0,"Iteration covered the wrong number of elements (going forward)"); for(; iter != begin; --iter, ++index) { reference ref = *(iter-1); const pointer ptr = &ref; CHECK_TEST(ptr==&const_a[index],"Iterator points to the wrong element (going backwards)"); } CHECK_TEST(index==a.size(),"Iteration covered the wrong number of elements (going backward)"); } return true; failed: if (opt.log) olog << "FAILURE" << std::endl << ind(1) << "Test: " << test << std::endl << ind(1) << "Problem: " << problem << std::endl; return false; } }; /// Test space class TestSpace : public Gecode::Space { public: TestSpace(void) : Space() {} TestSpace(bool share, TestSpace& s) : Space(share,s) {} virtual Space* copy(bool share) { return new TestSpace(share,*this); } }; /// %Class for testing the VarArray iterator class VarArrayIterator : public Iterator { protected: /// Maximum array size static const int n = 16; /// Array type being tested typedef Gecode::VarArray Array; public: /// Initialize test VarArrayIterator(void) : Iterator("VarArray") {} /// Perform actual tests bool run(void) { // Space for the test TestSpace s; // VarArray for the test Array a(s,rand(n)); // Run the iterator test return runTestForArray(a); } } varArrayIteratorTest; /// %Class for testing the VarArgs iterator class VarArgsIterator : public Iterator { protected: /// Maximum array size static const int n = 16; /// Array type being tested typedef Gecode::ArgArrayBase Array; public: /// Initialize test VarArgsIterator(void) : Iterator("VarArgs") {} /// Perform actual tests bool run(void) { // Space for the test TestSpace s; // VarArray for the test Array a(rand(n)); // Run the iterator test return runTestForArray(a); } } varArgsIteratorTest; /// %Class for testing the ViewArray iterator class ViewArrayIterator : public Iterator { protected: /// Maximum array size static const int n = 16; /// Array type being tested typedef Gecode::ViewArray Array; public: /// Initialize test ViewArrayIterator(void) : Iterator("ViewArray") {} /// Perform actual tests bool run(void) { // Space for the test TestSpace s; // VarArray for the test Array a(s,rand(n)); // Run the iterator test return runTestForArray(a); } } viewArrayIteratorTest; /// %Class for testing the SharedArray iterator class SharedArrayIterator : public Iterator { protected: /// Maximum array size static const int n = 16; /// Array type being tested typedef Gecode::SharedArray Array; public: /// Initialize test SharedArrayIterator(void) : Iterator("SharedArray") {} /// Perform actual tests bool run(void) { // SharedArray for the test Array a(rand(n)); // Run the iterator test return runTestForArray(a); } } sharedArrayIteratorTest; }} // STATISTICS: test-core gecode-4.2.1/test/assign/0000755000175000010010000000000012236131613014322 5ustar schulteNonegecode-4.2.1/test/assign/bool.cpp0000755000175000010010000000377411357330563016007 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2008 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ by $Author: schulte $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/assign.hh" namespace Test { namespace Assign { /// %Test branching with distinct propagator class Bool : public BoolTest { public: /// Create and register test Bool(const std::string& s, int n) : BoolTest(s,n) {} /// Post propagators on variables \a x virtual void post(Gecode::Space& home, Gecode::BoolVarArray& x) { Gecode::rel(home, Gecode::BOT_OR, x, 1); } }; Bool b_3("3",3); Bool b_5("5",5); Bool b_7("7",7); }} // STATISTICS: test-branch gecode-4.2.1/test/assign/float.cpp0000644000175000010010000000461011737552063016147 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Vincent Barichard * * Copyright: * Christian Schulte, 2008 * Vincent Barichard, 2012 * * Last modified: * $Date: 2012-04-06 13:32:03 +0200 (Fri, 06 Apr 2012) $ by $Author: schulte $ * $Revision: 12714 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/assign.hh" #ifdef GECODE_HAS_FLOAT_VARS namespace Test { namespace Assign { /// %Test assignment with distinct propagator class Float : public FloatTest { public: /// Create and register test Float(const std::string& s, const Gecode::FloatVal& d, int n) : FloatTest(s,n,d) {} /// Post propagators on variables \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { for (int i=0; i * * Copyright: * Christian Schulte, 2008 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ by $Author: schulte $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/assign.hh" namespace Test { namespace Assign { /// %Test assignment with distinct propagator class Int : public IntTest { public: /// Create and register test Int(const std::string& s, const Gecode::IntSet& d, int n) : IntTest(s,n,d) {} /// Post propagators on variables \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::distinct(home, x); } }; Gecode::IntSet d_dense(-2,2); const int v_sparse[5] = {-100,-10,0,10,100}; Gecode::IntSet d_sparse(v_sparse,5); Gecode::IntSet d_large(-2,10); Int d_3("Dense::3",d_dense,3); Int d_5("Dense::5",d_dense,5); Int s_3("Sparse::3",d_sparse,3); Int s_5("Sparse::5",d_sparse,5); Int l_2("Large::2",d_large,2); Int l_3("Large::3",d_large,3); }} // STATISTICS: test-branch gecode-4.2.1/test/assign/set.cpp0000644000175000010010000000456411357330563015642 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2009 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ by $Author: schulte $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/assign.hh" #ifdef GECODE_HAS_SET_VARS namespace Test { namespace Assign { /// %Test assignment with disjoint union propagator class Set : public SetTest { public: /// Create and register test Set(const std::string& s, const Gecode::IntSet& d, int n) : SetTest(s,n,d) {} /// Post propagators on variables \a x virtual void post(Gecode::Space& home, Gecode::SetVarArray& x) { Gecode::SetVarArgs y(x.size()-1); for (int i=0; i * * Contributing authors: * Vincent Barichard * * Copyright: * Christian Schulte, 2008 * Vincent Barichard, 2012 * * Last modified: * $Date: 2013-05-29 13:53:43 +0200 (Wed, 29 May 2013) $ by $Author: schulte $ * $Revision: 13672 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/assign.hh" #include namespace Test { namespace Assign { /// Space for executing integer tests class IntTestSpace : public Gecode::Space { public: /// Variables to be tested Gecode::IntVarArray x; /// Initialize test space IntTestSpace(int n, Gecode::IntSet& d) : x(*this, n, d) {} /// Constructor for cloning \a s IntTestSpace(bool share, IntTestSpace& s) : Gecode::Space(share,s) { x.update(*this, share, s.x); } /// Copy space during cloning virtual Gecode::Space* copy(bool share) { return new IntTestSpace(share,*this); } }; /// Space for executing Boolean tests class BoolTestSpace : public Gecode::Space { public: /// Variables to be tested Gecode::BoolVarArray x; /// Initialize test space BoolTestSpace(int n) : x(*this, n, 0, 1) {} /// Constructor for cloning \a s BoolTestSpace(bool share, BoolTestSpace& s) : Gecode::Space(share,s) { x.update(*this, share, s.x); } /// Copy space during cloning virtual Gecode::Space* copy(bool share) { return new BoolTestSpace(share,*this); } }; #ifdef GECODE_HAS_SET_VARS /// Space for executing Boolean tests class SetTestSpace : public Gecode::Space { public: /// Variables to be tested Gecode::SetVarArray x; /// Initialize test space SetTestSpace(int n, const Gecode::IntSet& d) : x(*this, n, Gecode::IntSet::empty, d) {} /// Constructor for cloning \a s SetTestSpace(bool share, SetTestSpace& s) : Gecode::Space(share,s) { x.update(*this, share, s.x); } /// Copy space during cloning virtual Gecode::Space* copy(bool share) { return new SetTestSpace(share,*this); } }; #endif #ifdef GECODE_HAS_FLOAT_VARS /// Space for executing Boolean tests class FloatTestSpace : public Gecode::Space { public: /// Variables to be tested Gecode::FloatVarArray x; /// Initialize test space FloatTestSpace(int n, const Gecode::FloatVal& d) : x(*this, n, d.min(), d.max()) {} /// Constructor for cloning \a s FloatTestSpace(bool share, FloatTestSpace& s) : Gecode::Space(share,s) { x.update(*this, share, s.x); } /// Copy space during cloning virtual Gecode::Space* copy(bool share) { return new FloatTestSpace(share,*this); } }; #endif /** \name Collection of possible arguments for integer assignments * * \relates IntTestSpace BoolTestSpace */ //@{ /// Names for integer assignments const char* int_assign_name[] = { "INT_ASSIGN_MIN", "INT_ASSIGN_MED", "INT_ASSIGN_MAX", "INT_ASSIGN_RND", "INT_ASSIGN" }; /// Number of integer value selections const int n_int_assign = sizeof(int_assign_name)/sizeof(const char*); /// Test function for branch value function int int_val(const Gecode::Space&, Gecode::IntVar x, int) { return x.min(); } /// Test function for branch value function int bool_val(const Gecode::Space&, Gecode::BoolVar x, int) { return x.min(); } //@} IntTest::IntTest(const std::string& s, int a, const Gecode::IntSet& d) : Base("Int::Assign::"+s), arity(a), dom(d) { } bool IntTest::run(void) { using namespace Gecode; IntTestSpace* root = new IntTestSpace(arity,dom); post(*root, root->x); (void) root->status(); for (int val = 0; val(root->clone(false)); Gecode::Search::Options o; o.a_d = Base::rand(10); o.c_d = Base::rand(10); Rnd r(1); IntAssign ia; switch (val) { case 0: ia = INT_ASSIGN_MIN(); break; case 1: ia = INT_ASSIGN_MED(); break; case 2: ia = INT_ASSIGN_MAX(); break; case 3: ia = INT_ASSIGN_RND(r); break; case 4: ia = INT_ASSIGN(&int_val); break; } assign(*clone, clone->x, ia); Gecode::DFS e_s(clone, o); delete clone; // Find number of solutions int solutions = 0; while (Space* s = e_s.next()) { delete s; solutions++; } if (solutions != 1) { std::cout << "FAILURE" << std::endl << "\tc_d=" << o.c_d << ", a_d=" << o.a_d << std::endl << "\t" << int_assign_name[val] << std::endl; delete root; return false; } } delete root; return true; } BoolTest::BoolTest(const std::string& s, int a) : Base("Bool::Assign::"+s), arity(a) { } bool BoolTest::run(void) { using namespace Gecode; BoolTestSpace* root = new BoolTestSpace(arity); post(*root, root->x); (void) root->status(); for (int val = n_int_assign; val--; ) { BoolTestSpace* clone = static_cast(root->clone(false)); Gecode::Search::Options o; o.a_d = Base::rand(10); o.c_d = Base::rand(10); Rnd r(1); IntAssign ia; switch (val) { case 0: ia = INT_ASSIGN_MIN(); break; case 1: ia = INT_ASSIGN_MED(); break; case 2: ia = INT_ASSIGN_MAX(); break; case 3: ia = INT_ASSIGN_RND(r); break; case 4: ia = INT_ASSIGN(&bool_val); break; } assign(*clone, clone->x, ia); Gecode::DFS e_s(clone, o); delete clone; // Find number of solutions int solutions = 0; while (Space* s = e_s.next()) { delete s; solutions++; } if (solutions != 1) { std::cout << "FAILURE" << std::endl << "\tc_d=" << o.c_d << ", a_d=" << o.a_d << std::endl << "\t" << int_assign_name[val] << std::endl; delete root; return false; } } delete root; return true; } #ifdef GECODE_HAS_SET_VARS /** \name Collection of possible arguments for set assignments * * \relates SetTestSpace */ //@{ /// Names for integer assignments const char* set_assign_name[] = { "SET_ASSIGN_MIN_INC", "SET_ASSIGN_MIN_EXC", "SET_ASSIGN_MED_INC", "SET_ASSIGN_MED_EXC", "SET_ASSIGN_MAX_INC", "SET_ASSIGN_MAX_EXC", "SET_ASSIGN_RND_INC", "SET_ASSIGN_RND_EXC", "SET_ASSIGN" }; /// Number of set value selections const int n_set_assign = sizeof(set_assign_name)/sizeof(const char*); /// Test function for branch value function int set_val(const Gecode::Space&, Gecode::SetVar x, int) { Gecode::SetVarUnknownRanges r(x); return r.min(); } //@} SetTest::SetTest(const std::string& s, int a, const Gecode::IntSet& d) : Base("Set::Assign::"+s), arity(a), dom(d) { } bool SetTest::run(void) { using namespace Gecode; SetTestSpace* root = new SetTestSpace(arity,dom); post(*root, root->x); (void) root->status(); for (int val = n_int_assign; val--; ) { SetTestSpace* clone = static_cast(root->clone(false)); Gecode::Search::Options o; o.a_d = Base::rand(10); o.c_d = Base::rand(10); Rnd r(1); SetAssign sa; switch (val) { case 0: sa = SET_ASSIGN_MIN_INC(); break; case 1: sa = SET_ASSIGN_MIN_EXC(); break; case 2: sa = SET_ASSIGN_MED_INC(); break; case 3: sa = SET_ASSIGN_MED_EXC(); break; case 4: sa = SET_ASSIGN_MAX_INC(); break; case 5: sa = SET_ASSIGN_MAX_EXC(); break; case 6: sa = SET_ASSIGN_RND_INC(r); break; case 7: sa = SET_ASSIGN_RND_EXC(r); break; case 8: sa = SET_ASSIGN(&set_val); break; } assign(*clone, clone->x, sa); Gecode::DFS e_s(clone, o); delete clone; // Find number of solutions int solutions = 0; while (Space* s = e_s.next()) { delete s; solutions++; } if (solutions != 1) { std::cout << "FAILURE" << std::endl << "\tc_d=" << o.c_d << ", a_d=" << o.a_d << std::endl << "\t" << set_assign_name[val] << std::endl; delete root; return false; } } delete root; return true; } #endif #ifdef GECODE_HAS_FLOAT_VARS /** \name Collection of possible arguments for float assignments * * \relates FloatTestSpace */ //@{ /// Names for float assignments const char* float_assign_name[] = { "FLOAT_ASSIGN_MIN", "FLOAT_ASSIGN_MAX", "FLOAT_ASSIGN_RND", "FLOAT_ASSIGN" }; /// Number of float value selections const int n_float_assign = sizeof(float_assign_name)/sizeof(const char*); /// Test function for branch value function Gecode::FloatNumBranch float_val(const Gecode::Space&, Gecode::FloatVar x, int) { Gecode::FloatNumBranch nl; nl.n=x.med(); nl.l=true; return nl; } //@} FloatTest::FloatTest(const std::string& s, int a, const Gecode::FloatVal& d) : Base("Float::Assign::"+s), arity(a), dom(d) { } bool FloatTest::run(void) { using namespace Gecode; FloatTestSpace* root = new FloatTestSpace(arity,dom); post(*root, root->x); (void) root->status(); for (int val = n_float_assign; val--; ) { FloatTestSpace* clone = static_cast(root->clone(false)); Gecode::Search::Options o; o.a_d = Base::rand(10); o.c_d = Base::rand(10); Rnd r(1); FloatAssign fa; switch (val) { case 0: fa = FLOAT_ASSIGN_MIN(); break; case 1: fa = FLOAT_ASSIGN_MAX(); break; case 2: fa = FLOAT_ASSIGN_RND(r); break; case 3: fa = FLOAT_ASSIGN(&float_val); break; } assign(*clone, clone->x, fa); Gecode::DFS e_s(clone, o); delete clone; // Find number of solutions int solutions = 0; while (Space* s = e_s.next()) { delete s; solutions++; } if (solutions != 1) { std::cout << "FAILURE" << std::endl << "\tc_d=" << o.c_d << ", a_d=" << o.a_d << std::endl << "\t" << float_assign_name[val] << std::endl; delete root; return false; } } delete root; return true; } #endif }} // STATISTICS: test-branch gecode-4.2.1/test/assign.hh0000755000175000010010000001017511737266453014672 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Contributing authors: * Vincent Barichard * * Copyright: * Christian Schulte, 2008 * Vincent Barichard, 2012 * * Last modified: * $Date: 2012-04-05 12:00:11 +0200 (Thu, 05 Apr 2012) $ by $Author: vbarichard $ * $Revision: 12703 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef __GECODE_TEST_ASSIGN_HH__ #define __GECODE_TEST_ASSIGN_HH__ #include #include #ifdef GECODE_HAS_SET_VARS #include #endif #ifdef GECODE_HAS_FLOAT_VARS #include #endif #include "test/test.hh" namespace Test { /// Tests for assignments namespace Assign { /** * \brief %Base class for tests for assigning integer variables * */ class IntTest : public Base { protected: /// Number of variables int arity; /// Domain of variables Gecode::IntSet dom; public: /// Construct and register test IntTest(const std::string& s, int a, const Gecode::IntSet& d); /// Perform test virtual bool run(void); /// Post assignment on variables \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) = 0; }; /** * \brief %Base class for tests for branching on Boolean variables * */ class BoolTest : public Base { protected: /// Number of variables int arity; public: /// Construct and register test BoolTest(const std::string& s, int a); /// Perform test virtual bool run(void); /// Post assignment on variables \a x virtual void post(Gecode::Space& home, Gecode::BoolVarArray& x) = 0; }; #ifdef GECODE_HAS_SET_VARS /** * \brief %Base class for tests for branching on set variables * */ class SetTest : public Base { protected: /// Number of variables int arity; /// Upper bound of variable domains Gecode::IntSet dom; public: /// Construct and register test SetTest(const std::string& s, int a, const Gecode::IntSet& d); /// Perform test virtual bool run(void); /// Post assignment on variables \a x virtual void post(Gecode::Space& home, Gecode::SetVarArray& x) = 0; }; #endif #ifdef GECODE_HAS_FLOAT_VARS /** * \brief %Base class for tests for branching on float variables * */ class FloatTest : public Base { protected: /// Number of variables int arity; /// Domain of variables Gecode::FloatVal dom; public: /// Construct and register test FloatTest(const std::string& s, int a, const Gecode::FloatVal& d); /// Perform test virtual bool run(void); /// Post assignment on variables \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) = 0; }; #endif } } #endif // STATISTICS: test-branch gecode-4.2.1/test/branch/0000755000175000010010000000000012236131646014301 5ustar schulteNonegecode-4.2.1/test/branch/bool.cpp0000755000175000010010000000377311357330563015757 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2008 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ by $Author: schulte $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/branch.hh" namespace Test { namespace Branch { /// %Test brancher with distinct propagator class Bool : public BoolTest { public: /// Create and register test Bool(const std::string& s, int n) : BoolTest(s,n) {} /// Post propagators on variables \a x virtual void post(Gecode::Space& home, Gecode::BoolVarArray& x) { Gecode::rel(home, Gecode::BOT_OR, x, 1); } }; Bool b_3("3",3); Bool b_5("5",5); Bool b_7("7",7); }} // STATISTICS: test-branch gecode-4.2.1/test/branch/float.cpp0000644000175000010010000000465011737552063016124 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Mikael Lagerkvist * Vincent Barichard * * Copyright: * Mikael Lagerkvist, 2006 * Vincent Barichard, 2012 * * Last modified: * $Date: 2012-04-06 13:32:03 +0200 (Fri, 06 Apr 2012) $ by $Author: schulte $ * $Revision: 12714 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/branch.hh" #ifdef GECODE_HAS_FLOAT_VARS namespace Test { namespace Branch { /// %Test brancher with distinct propagator class Float : public FloatTest { public: /// Create and register test Float(const std::string& s, const Gecode::FloatVal& d, int n, int nbSols) : FloatTest(s,n,d,nbSols) {} /// Post propagators on variables \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { for (int i=0; i * * Copyright: * Mikael Lagerkvist, 2006 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ by $Author: schulte $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/branch.hh" namespace Test { namespace Branch { /// %Test brancher with distinct propagator class Int : public IntTest { public: /// Create and register test Int(const std::string& s, const Gecode::IntSet& d, int n) : IntTest(s,n,d) {} /// Post propagators on variables \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::distinct(home, x); } }; Gecode::IntSet d_dense(-2,2); const int v_sparse[5] = {-100,-10,0,10,100}; Gecode::IntSet d_sparse(v_sparse,5); Gecode::IntSet d_large(-2,10); Int d_3("Dense::3",d_dense,3); Int d_5("Dense::5",d_dense,5); Int s_3("Sparse::3",d_sparse,3); Int s_5("Sparse::5",d_sparse,5); Int l_2("Large::2",d_large,2); Int l_3("Large::3",d_large,3); }} // STATISTICS: test-branch gecode-4.2.1/test/branch/set.cpp0000755000175000010010000000444011401735045015601 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * * Copyright: * Guido Tack, 2008 * * Last modified: * $Date: 2010-06-03 16:20:21 +0200 (Thu, 03 Jun 2010) $ by $Author: schulte $ * $Revision: 11016 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/branch.hh" #ifdef GECODE_HAS_SET_VARS namespace Test { namespace Branch { /// %Test brancher class Set : public SetTest { public: /// Create and register test Set(const std::string& s, const Gecode::IntSet& d, int n) : SetTest(s,n,d) {} /// Post propagators on variables \a x virtual void post(Gecode::Space& home, Gecode::SetVarArray& x) { Gecode::SetVarArgs xx(x.size()-1); for (int i=x.size()-1; i--;) xx[i] = x[i]; Gecode::rel(home, Gecode::SOT_DUNION, xx, x[x.size()-1]); } }; namespace { Gecode::IntSet d_dense(-2,3); const int v_sparse[6] = {-100,-10,0,10,100,1000}; Gecode::IntSet d_sparse(v_sparse,6); Set d_3("Dense::3",d_dense,3); Set s_3("Sparse::3",d_sparse,3); } }} #endif // STATISTICS: test-branch gecode-4.2.1/test/branch.cpp0000644000175000010010000011124712173473607015021 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Mikael Lagerkvist * Christian Schulte * * Contributing authors: * Vincent Barichard * * Copyright: * Mikael Lagerkvist, 2005 * Christian Schulte, 2009 * Vincent Barichard, 2012 * * Last modified: * $Date: 2013-07-23 14:31:03 +0200 (Tue, 23 Jul 2013) $ by $Author: schulte $ * $Revision: 13939 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/branch.hh" #include #include #include #include #include #include #ifdef GECODE_HAS_SET_VARS #include #endif #ifdef GECODE_HAS_FLOAT_VARS #include #endif #include namespace Test { namespace Branch { /// Test function for tie-break limit function double tbl(const Gecode::Space&, double w, double b) { return (w + (b-w)/2.0); } /// Space for executing integer tests class IntTestSpace : public Gecode::Space { public: /// Variables to be tested Gecode::IntVarArray x; /// Variable selection criteria Gecode::IntVarBranch vara, varb; /// Varlue selection criterion Gecode::IntValBranch val; /// Initialize test space IntTestSpace(int n, Gecode::IntSet& d) : x(*this, n, d), vara(Gecode::INT_VAR_NONE()), varb(Gecode::INT_VAR_NONE()), val(Gecode::INT_VAL_MIN()) {} /// Constructor for cloning \a s IntTestSpace(bool share, IntTestSpace& s) : Gecode::Space(share,s), vara(s.vara), varb(s.varb), val(s.val) { x.update(*this, share, s.x); } /// Copy space during cloning virtual Gecode::Space* copy(bool share) { return new IntTestSpace(share,*this); } }; /// Space for executing Boolean tests class BoolTestSpace : public Gecode::Space { public: /// Variables to be tested Gecode::BoolVarArray x; /// Initialize test space BoolTestSpace(int n) : x(*this, n, 0, 1) {} /// Constructor for cloning \a s BoolTestSpace(bool share, BoolTestSpace& s) : Gecode::Space(share,s) { x.update(*this, share, s.x); } /// Copy space during cloning virtual Gecode::Space* copy(bool share) { return new BoolTestSpace(share,*this); } }; #ifdef GECODE_HAS_SET_VARS /// Space for executing Boolean tests class SetTestSpace : public Gecode::Space { public: /// Variables to be tested Gecode::SetVarArray x; /// Initialize test space SetTestSpace(int n, Gecode::IntSet& d) : x(*this, n, Gecode::IntSet::empty, d) {} /// Constructor for cloning \a s SetTestSpace(bool share, SetTestSpace& s) : Gecode::Space(share,s) { x.update(*this, share, s.x); } /// Copy space during cloning virtual Gecode::Space* copy(bool share) { return new SetTestSpace(share,*this); } }; #endif #ifdef GECODE_HAS_FLOAT_VARS /// Space for executing Float tests class FloatTestSpace : public Gecode::Space { public: /// Variables to be tested Gecode::FloatVarArray x; /// Initialize test space FloatTestSpace(int n, Gecode::FloatVal& d) : x(*this, n, d.min(), d.max()) {} /// Constructor for cloning \a s FloatTestSpace(bool share, FloatTestSpace& s) : Gecode::Space(share,s) { x.update(*this, share, s.x); } /// Copy space during cloning virtual Gecode::Space* copy(bool share) { return new FloatTestSpace(share,*this); } }; #endif /** \name Collection of possible arguments for integer branchers * * \relates IntTestSpace BoolTestSpace */ //@{ /// Names for integer variable selections const char* int_var_branch_name[] = { "SINGLE VARIABLE", "INT_VAR_NONE", "INT_VAR_RND", "INT_VAR_MERIT_MIN", "INT_VAR_MERIT_MAX", "INT_VAR_DEGREE_MIN", "INT_VAR_DEGREE_MAX", "INT_VAR_AFC_MIN", "INT_VAR_AFC_MAX", "INT_VAR_ACTIVITY_MIN", "INT_VAR_ACTIVITY_MAX", "INT_VAR_MIN_MIN", "INT_VAR_MIN_MAX", "INT_VAR_MAX_MIN", "INT_VAR_MAX_MAX", "INT_VAR_SIZE_MIN", "INT_VAR_SIZE_MAX", "INT_VAR_DEGREE_SIZE_MIN", "INT_VAR_DEGREE_SIZE_MAX", "INT_VAR_AFC_SIZE_MIN", "INT_VAR_AFC_SIZE_MAX", "INT_VAR_ACTIVITY_SIZE_MIN", "INT_VAR_ACTIVITY_SIZE_MAX", "INT_VAR_REGRET_MIN_MIN", "INT_VAR_REGRET_MIN_MAX", "INT_VAR_REGRET_MAX_MIN", "INT_VAR_REGRET_MAX_MAX" }; /// Number of integer variable selections const int n_int_var_branch = sizeof(int_var_branch_name)/sizeof(const char*); /// Test function for branch merit function double int_merit(const Gecode::Space&, Gecode::IntVar x, int) { return x.min(); } /// Test function for branch merit function double bool_merit(const Gecode::Space&, Gecode::BoolVar x, int) { return x.min(); } /// Names for integer value selections const char* int_val_branch_name[] = { "INT_VAL_MIN", "INT_VAL_MED", "INT_VAL_MAX", "INT_VAL_RND", "INT_VAL_SPLIT_MIN", "INT_VAL_SPLIT_MAX", "INT_VAL_RANGE_MIN", "INT_VAL_RANGE_MAX", "INT_VAL", "INT_VALUES_MIN", "INT_VALUES_MAX", "INT_VAL_NEAR_MIN", "INT_VAL_NEAR_MAX", "INT_VAL_NEAR_INC", "INT_VAL_NEAR_DEC", }; /// Number of integer value selections const int n_int_val_branch = sizeof(int_val_branch_name)/sizeof(const char*); /// Test function for branch value function int int_val(const Gecode::Space&, Gecode::IntVar x, int) { return x.min(); } /// Test function for branch value function int bool_val(const Gecode::Space&, Gecode::BoolVar x, int) { return x.min(); } //@} #ifdef GECODE_HAS_SET_VARS /** \name Collection of possible arguments for set branchers * * \relates SetTestSpace */ //@{ /// Names for set variable selections const char* set_var_branch_name[] = { "SINGLE VARIABLE", "SET_VAR_NONE", "SET_VAR_RND", "SET_VAR_MERIT_MIN", "SET_VAR_MERIT_MAX", "SET_VAR_DEGREE_MIN", "SET_VAR_DEGREE_MAX", "SET_VAR_AFC_MIN", "SET_VAR_AFC_MAX", "SET_VAR_ACTIVITY_MIN", "SET_VAR_ACTIVITY_MAX", "SET_VAR_MIN_MIN", "SET_VAR_MIN_MAX", "SET_VAR_MAX_MIN", "SET_VAR_MAX_MAX", "SET_VAR_SIZE_MIN", "SET_VAR_SIZE_MAX", "SET_VAR_DEGREE_SIZE_MIN", "SET_VAR_DEGREE_SIZE_MAX", "SET_VAR_AFC_SIZE_MIN", "SET_VAR_AFC_SIZE_MAX", "SET_VAR_ACTIVITY_SIZE_MIN", "SET_VAR_ACTIVITY_SIZE_MAX" }; /// Number of set variable selections const int n_set_var_branch = sizeof(set_var_branch_name)/sizeof(const char*); /// Test function for branch merit function double set_merit(const Gecode::Space&, Gecode::SetVar, int) { return 2.0; } /// Names for set value selections const char* set_val_branch_name[] = { "SET_VAL_MIN_INC", "SET_VAL_MIN_EXC", "SET_VAL_MED_INC", "SET_VAL_MED_EXC", "SET_VAL_MAX_INC", "SET_VAL_MAX_EXC", "SET_VAL_RND_INC", "SET_VAL_RND_EXC", "SET_VAL" }; /// Number of set value selections const int n_set_val_branch = sizeof(set_val_branch_name)/sizeof(const char*); /// Test function for branch value function int set_val(const Gecode::Space&, Gecode::SetVar x, int) { Gecode::SetVarUnknownRanges r(x); return r.min(); } //@} #endif #ifdef GECODE_HAS_FLOAT_VARS /** \name Collection of possible arguments for float branchers * * \relates FloatTestSpace */ //@{ /// Names for float variable selections const char* float_var_branch_name[] = { "SINGLE VARIABLE", "FLOAT_VAR_NONE", "FLOAT_VAR_RND", "FLOAT_VAR_MERIT_MIN", "FLOAT_VAR_MERIT_MAX", "FLOAT_VAR_DEGREE_MIN", "FLOAT_VAR_DEGREE_MAX", "FLOAT_VAR_AFC_MIN", "FLOAT_VAR_AFC_MAX", "FLOAT_VAR_ACTIVITY_MIN", "FLOAT_VAR_ACTIVITY_MAX", "FLOAT_VAR_MIN_MIN", "FLOAT_VAR_MIN_MAX", "FLOAT_VAR_MAX_MIN", "FLOAT_VAR_MAX_MAX", "FLOAT_VAR_SIZE_MIN", "FLOAT_VAR_SIZE_MAX", "FLOAT_VAR_DEGREE_SIZE_MIN", "FLOAT_VAR_DEGREE_SIZE_MAX", "FLOAT_VAR_AFC_SIZE_MIN", "FLOAT_VAR_AFC_SIZE_MAX", "FLOAT_VAR_ACTIVITY_SIZE_MIN", "FLOAT_VAR_ACTIVITY_SIZE_MAX" }; /// Number of float variable selections const int n_float_var_branch = sizeof(float_var_branch_name)/sizeof(const char*); /// Test function for branch merit function double float_merit(const Gecode::Space&, Gecode::FloatVar x, int) { return static_cast(x.degree()); } /// Names for float value selections const char* float_val_branch_name[] = { "FLOAT_VAL_SPLIT_MIN", "FLOAT_VAL_SPLIT_MAX", "FLOAT_VAL_SPLIT_RND", "FLOAT_VAL" }; /// Number of float value selections const int n_float_val_branch = sizeof(float_val_branch_name)/sizeof(const char*); /// Test function for branch value function Gecode::FloatNumBranch float_val(const Gecode::Space&, Gecode::FloatVar x, int) { Gecode::FloatNumBranch nl; nl.n=x.med(); nl.l=true; return nl; } //@} #endif /// Information about one test-run class RunInfo { public: std::string var, val; unsigned int a_d, c_d; RunInfo(const std::string& vara, const std::string& varb, const std::string& valname, const Gecode::Search::Options& o) : var(vara + "::" + varb), val(valname), a_d(o.a_d), c_d(o.c_d) {} void print(std::ostream& o) const { o << "(" << var << ", " << val << ", " << a_d << ", " << c_d << ")"; } }; }} std::ostream& operator<<(std::ostream& os, const Test::Branch::RunInfo& ri) { ri.print(os); return os; } namespace Test { namespace Branch { /// Find number of solutions template int solutions(TestSpace* c, Gecode::Search::Options& o, int maxNbSol = -1) { o.a_d = Base::rand(10); o.c_d = Base::rand(10); Gecode::DFS e_s(c, o); delete c; // Find number of solutions int s = 0; do { Gecode::Space* ex = e_s.next(); if (ex == NULL) break; delete ex; ++s; if ((maxNbSol >= 0) && (maxNbSol == s)) break; } while (true); return s; } IntTest::IntTest(const std::string& s, int a, const Gecode::IntSet& d) : Base("Int::Branch::"+s), arity(a), dom(d) { } bool IntTest::run(void) { using std::map; using std::vector; using std::string; using std::ostream; using namespace Gecode; // Results of tests run map > results; // Set up root space IntTestSpace* root = new IntTestSpace(arity,dom); post(*root, root->x); results.clear(); IntArgs d(arity); for (int i=arity; i--; ) d[i]=i; for (int vara = 0; vara(root->clone(false)); if ((vara == 0) && (val < 11)) { for (int i=0; ix.size(); i++) branch(*c, c->x[i], ivb); } else { Rnd ra(1); IntVarBranch ivba; IntActivity iaa(*c, c->x, 0.9); switch (vara) { case 0: ivba = INT_VAR_NONE(); break; case 1: ivba = INT_VAR_NONE(); break; case 2: ivba = INT_VAR_RND(ra); break; case 3: ivba = INT_VAR_MERIT_MIN(&int_merit); break; case 4: ivba = INT_VAR_MERIT_MAX(&int_merit); break; case 5: ivba = INT_VAR_DEGREE_MIN(); break; case 6: ivba = INT_VAR_DEGREE_MAX(); break; case 7: ivba = INT_VAR_AFC_MIN(0.5); break; case 8: ivba = INT_VAR_AFC_MAX(0.5); break; case 9: ivba = INT_VAR_ACTIVITY_MIN(iaa); break; case 10: ivba = INT_VAR_ACTIVITY_MAX(iaa); break; case 11: ivba = INT_VAR_MIN_MIN(); break; case 12: ivba = INT_VAR_MIN_MAX(); break; case 13: ivba = INT_VAR_MAX_MIN(); break; case 14: ivba = INT_VAR_MAX_MAX(); break; case 15: ivba = INT_VAR_SIZE_MIN(); break; case 16: ivba = INT_VAR_SIZE_MAX(); break; case 17: ivba = INT_VAR_DEGREE_SIZE_MIN(); break; case 18: ivba = INT_VAR_DEGREE_SIZE_MAX(); break; case 19: ivba = INT_VAR_AFC_SIZE_MIN(); break; case 20: ivba = INT_VAR_AFC_SIZE_MAX(); break; case 21: ivba = INT_VAR_ACTIVITY_SIZE_MIN(iaa); break; case 22: ivba = INT_VAR_ACTIVITY_SIZE_MAX(iaa); break; case 23: ivba = INT_VAR_REGRET_MIN_MIN(); break; case 24: ivba = INT_VAR_REGRET_MIN_MAX(); break; case 25: ivba = INT_VAR_REGRET_MAX_MIN(); break; case 26: ivba = INT_VAR_REGRET_MAX_MAX(); break; } Rnd rb(2); IntVarBranch ivbb; IntActivity iab(*c, c->x, 0.9, &int_merit); switch (varb) { case 0: ivbb = INT_VAR_NONE(); break; case 1: ivbb = INT_VAR_NONE(); break; case 2: ivbb = INT_VAR_RND(rb); break; case 3: ivbb = INT_VAR_MERIT_MIN(&int_merit,&tbl); break; case 4: ivbb = INT_VAR_MERIT_MAX(&int_merit,&tbl); break; case 5: ivbb = INT_VAR_DEGREE_MIN(&tbl); break; case 6: ivbb = INT_VAR_DEGREE_MAX(&tbl); break; case 7: ivbb = INT_VAR_AFC_MIN(0.5,&tbl); break; case 8: ivbb = INT_VAR_AFC_MAX(0.5,&tbl); break; case 9: ivbb = INT_VAR_ACTIVITY_MIN(iab,&tbl); break; case 10: ivbb = INT_VAR_ACTIVITY_MAX(iab,&tbl); break; case 11: ivbb = INT_VAR_MIN_MIN(&tbl); break; case 12: ivbb = INT_VAR_MIN_MAX(&tbl); break; case 13: ivbb = INT_VAR_MAX_MIN(&tbl); break; case 14: ivbb = INT_VAR_MAX_MAX(&tbl); break; case 15: ivbb = INT_VAR_SIZE_MIN(&tbl); break; case 16: ivbb = INT_VAR_SIZE_MAX(&tbl); break; case 17: ivbb = INT_VAR_DEGREE_SIZE_MIN(&tbl); break; case 18: ivbb = INT_VAR_DEGREE_SIZE_MAX(&tbl); break; case 19: ivbb = INT_VAR_AFC_SIZE_MIN(1.0,&tbl); break; case 20: ivbb = INT_VAR_AFC_SIZE_MAX(1.0,&tbl); break; case 21: ivbb = INT_VAR_ACTIVITY_SIZE_MIN(iab,&tbl); break; case 22: ivbb = INT_VAR_ACTIVITY_SIZE_MAX(iab,&tbl); break; case 23: ivbb = INT_VAR_REGRET_MIN_MIN(&tbl); break; case 24: ivbb = INT_VAR_REGRET_MIN_MAX(&tbl); break; case 25: ivbb = INT_VAR_REGRET_MAX_MIN(&tbl); break; case 26: ivbb = INT_VAR_REGRET_MAX_MAX(&tbl); break; } switch (Base::rand(9U)) { case 0U: branch(*c, c->x, ivba, ivb); break; case 1U: branch(*c, c->x, ivbb, ivb); break; case 2U: branch(*c, c->x, tiebreak(ivba,ivbb), ivb); break; case 3U: branch(*c, c->x, tiebreak(ivbb,ivba), ivb); break; case 4U: branch(*c, c->x, tiebreak(ivba,ivba,ivbb), ivb); break; case 5U: branch(*c, c->x, tiebreak(ivba,ivbb,ivbb), ivb); break; case 6U: branch(*c, c->x, tiebreak(ivbb,ivba,ivba), ivb); break; case 7U: branch(*c, c->x, tiebreak(ivba,ivba,ivbb,ivba), ivb); break; case 8U: branch(*c, c->x, tiebreak(ivbb,ivba,ivbb,ivba), ivb); break; } } Gecode::Search::Options o; results[solutions(c,o)].push_back (RunInfo(int_var_branch_name[vara], int_var_branch_name[varb], int_val_branch_name[val], o)); } } } if (results.size() > 1) goto failed; delete root; return true; failed: std::cout << "FAILURE" << std::endl; for (map >::iterator it = results.begin(); it != results.end(); ++it) { std::cout << "Number of solutions: " << it->first << std::endl; for (unsigned int i = 0; i < it->second.size(); ++i) std::cout << it->second[i] << " "; std::cout << std::endl; } delete root; return results.size() == 1; } BoolTest::BoolTest(const std::string& s, int a) : Base("Bool::Branch::"+s), arity(a) { } bool BoolTest::run(void) { using std::map; using std::vector; using std::string; using std::ostream; using namespace Gecode; // Results of tests run map > results; // Set up root space BoolTestSpace* root = new BoolTestSpace(arity); post(*root, root->x); results.clear(); IntArgs d(arity); for (int i=arity; i--; ) d[i]=i % 2; for (int vara = 0; vara(root->clone(false)); if ((vara == 0) && (val < 11)) { for (int i=0; ix.size(); i++) branch(*c, c->x[i], ivb); } else { Rnd ra(1); IntVarBranch ivba; IntActivity iaa(*c, c->x, 0.9); switch (vara) { case 0: ivba = INT_VAR_NONE(); break; case 1: ivba = INT_VAR_NONE(); break; case 2: ivba = INT_VAR_RND(ra); break; case 3: ivba = INT_VAR_MERIT_MIN(&bool_merit); break; case 4: ivba = INT_VAR_MERIT_MAX(&bool_merit); break; case 5: ivba = INT_VAR_DEGREE_MIN(); break; case 6: ivba = INT_VAR_DEGREE_MAX(); break; case 7: ivba = INT_VAR_AFC_MIN(0.5); break; case 8: ivba = INT_VAR_AFC_MAX(0.5); break; case 9: ivba = INT_VAR_ACTIVITY_MIN(iaa); break; case 10: ivba = INT_VAR_ACTIVITY_MAX(iaa); break; case 11: ivba = INT_VAR_MIN_MIN(); break; case 12: ivba = INT_VAR_MIN_MAX(); break; case 13: ivba = INT_VAR_MAX_MIN(); break; case 14: ivba = INT_VAR_MAX_MAX(); break; case 15: ivba = INT_VAR_SIZE_MIN(); break; case 16: ivba = INT_VAR_SIZE_MAX(); break; case 17: ivba = INT_VAR_DEGREE_SIZE_MIN(); break; case 18: ivba = INT_VAR_DEGREE_SIZE_MAX(); break; case 19: ivba = INT_VAR_AFC_SIZE_MIN(); break; case 20: ivba = INT_VAR_AFC_SIZE_MAX(); break; case 21: ivba = INT_VAR_ACTIVITY_SIZE_MIN(iaa); break; case 22: ivba = INT_VAR_ACTIVITY_SIZE_MAX(iaa); break; case 23: ivba = INT_VAR_REGRET_MIN_MIN(); break; case 24: ivba = INT_VAR_REGRET_MIN_MAX(); break; case 25: ivba = INT_VAR_REGRET_MAX_MIN(); break; case 26: ivba = INT_VAR_REGRET_MAX_MAX(); break; } Rnd rb(2); IntVarBranch ivbb; IntActivity iab(*c, c->x, 0.9, &bool_merit); switch (varb) { case 0: ivbb = INT_VAR_NONE(); break; case 1: ivbb = INT_VAR_NONE(); break; case 2: ivbb = INT_VAR_RND(rb); break; case 3: ivbb = INT_VAR_MERIT_MIN(&bool_merit,&tbl); break; case 4: ivbb = INT_VAR_MERIT_MAX(&bool_merit,&tbl); break; case 5: ivbb = INT_VAR_DEGREE_MIN(&tbl); break; case 6: ivbb = INT_VAR_DEGREE_MAX(&tbl); break; case 7: ivbb = INT_VAR_AFC_MIN(0.5,&tbl); break; case 8: ivbb = INT_VAR_AFC_MAX(0.5,&tbl); break; case 9: ivbb = INT_VAR_ACTIVITY_MIN(iab,&tbl); break; case 10: ivbb = INT_VAR_ACTIVITY_MAX(iab,&tbl); break; case 11: ivbb = INT_VAR_MIN_MIN(&tbl); break; case 12: ivbb = INT_VAR_MIN_MAX(&tbl); break; case 13: ivbb = INT_VAR_MAX_MIN(&tbl); break; case 14: ivbb = INT_VAR_MAX_MAX(&tbl); break; case 15: ivbb = INT_VAR_SIZE_MIN(&tbl); break; case 16: ivbb = INT_VAR_SIZE_MAX(&tbl); break; case 17: ivbb = INT_VAR_DEGREE_SIZE_MIN(&tbl); break; case 18: ivbb = INT_VAR_DEGREE_SIZE_MAX(&tbl); break; case 19: ivbb = INT_VAR_AFC_SIZE_MIN(1.0,&tbl); break; case 20: ivbb = INT_VAR_AFC_SIZE_MAX(1.0,&tbl); break; case 21: ivbb = INT_VAR_ACTIVITY_SIZE_MIN(iab,&tbl); break; case 22: ivbb = INT_VAR_ACTIVITY_SIZE_MAX(iab,&tbl); break; case 23: ivbb = INT_VAR_REGRET_MIN_MIN(&tbl); break; case 24: ivbb = INT_VAR_REGRET_MIN_MAX(&tbl); break; case 25: ivbb = INT_VAR_REGRET_MAX_MIN(&tbl); break; case 26: ivbb = INT_VAR_REGRET_MAX_MAX(&tbl); break; } switch (Base::rand(9U)) { case 0U: branch(*c, c->x, ivba, ivb); break; case 1U: branch(*c, c->x, ivbb, ivb); break; case 2U: branch(*c, c->x, tiebreak(ivba,ivbb), ivb); break; case 3U: branch(*c, c->x, tiebreak(ivbb,ivba), ivb); break; case 4U: branch(*c, c->x, tiebreak(ivba,ivba,ivbb), ivb); break; case 5U: branch(*c, c->x, tiebreak(ivba,ivbb,ivbb), ivb); break; case 6U: branch(*c, c->x, tiebreak(ivbb,ivba,ivba), ivb); break; case 7U: branch(*c, c->x, tiebreak(ivba,ivba,ivbb,ivba), ivb); break; case 8U: branch(*c, c->x, tiebreak(ivbb,ivba,ivbb,ivba), ivb); break; } } Gecode::Search::Options o; results[solutions(c,o)].push_back (RunInfo(int_var_branch_name[vara], int_var_branch_name[varb], int_val_branch_name[val], o)); } } } if (results.size() > 1) goto failed; delete root; return true; failed: std::cout << "FAILURE" << std::endl; for (map >::iterator it = results.begin(); it != results.end(); ++it) { std::cout << "Number of solutions: " << it->first << std::endl; for (unsigned int i = 0; i < it->second.size(); ++i) std::cout << it->second[i] << " "; std::cout << std::endl; } delete root; return results.size() == 1; } #ifdef GECODE_HAS_SET_VARS SetTest::SetTest(const std::string& s, int a, const Gecode::IntSet& d) : Base("Set::Branch::"+s), arity(a), dom(d) { } bool SetTest::run(void) { using std::map; using std::vector; using std::string; using std::ostream; using namespace Gecode; // Results of tests run map > results; // Set up root space SetTestSpace* root = new SetTestSpace(arity,dom); post(*root, root->x); root->status(); results.clear(); for (int vara = 0; vara(root->clone(false)); if (vara == 0) { for (int i=0; ix.size(); i++) branch(*c, c->x[i], svb); } else { Rnd ra(1); SetVarBranch svba; SetActivity saa(*c, c->x, 0.9); switch (vara) { case 0: break; case 1: svba = SET_VAR_NONE(); break; case 2: svba = SET_VAR_RND(ra); break; case 3: svba = SET_VAR_MERIT_MIN(&set_merit); break; case 4: svba = SET_VAR_MERIT_MAX(&set_merit); break; case 5: svba = SET_VAR_DEGREE_MIN(); break; case 6: svba = SET_VAR_DEGREE_MAX(); break; case 7: svba = SET_VAR_AFC_MIN(0.5); break; case 8: svba = SET_VAR_AFC_MAX(0.5); break; case 9: svba = SET_VAR_ACTIVITY_MIN(saa); break; case 10: svba = SET_VAR_ACTIVITY_MAX(saa); break; case 11: svba = SET_VAR_MIN_MIN(); break; case 12: svba = SET_VAR_MIN_MAX(); break; case 13: svba = SET_VAR_MAX_MIN(); break; case 14: svba = SET_VAR_MAX_MAX(); break; case 15: svba = SET_VAR_SIZE_MIN(); break; case 16: svba = SET_VAR_SIZE_MAX(); break; case 17: svba = SET_VAR_DEGREE_SIZE_MIN(); break; case 18: svba = SET_VAR_DEGREE_SIZE_MAX(); break; case 19: svba = SET_VAR_AFC_SIZE_MIN(); break; case 20: svba = SET_VAR_AFC_SIZE_MAX(); break; case 21: svba = SET_VAR_ACTIVITY_SIZE_MIN(saa); break; case 22: svba = SET_VAR_ACTIVITY_SIZE_MAX(saa); break; } Rnd rb(2); SetVarBranch svbb; SetActivity sab(*c, c->x, 0.9, &set_merit); switch (varb) { case 0: break; case 1: svbb = SET_VAR_NONE(); break; case 2: svbb = SET_VAR_RND(rb); break; case 3: svbb = SET_VAR_MERIT_MIN(&set_merit,&tbl); break; case 4: svbb = SET_VAR_MERIT_MAX(&set_merit,&tbl); break; case 5: svbb = SET_VAR_DEGREE_MIN(&tbl); break; case 6: svbb = SET_VAR_DEGREE_MAX(&tbl); break; case 7: svbb = SET_VAR_AFC_MIN(0.5,&tbl); break; case 8: svbb = SET_VAR_AFC_MAX(0.5,&tbl); break; case 9: svbb = SET_VAR_ACTIVITY_MIN(sab,&tbl); break; case 10: svbb = SET_VAR_ACTIVITY_MAX(sab,&tbl); break; case 11: svbb = SET_VAR_MIN_MIN(&tbl); break; case 12: svbb = SET_VAR_MIN_MAX(&tbl); break; case 13: svbb = SET_VAR_MAX_MIN(&tbl); break; case 14: svbb = SET_VAR_MAX_MAX(&tbl); break; case 15: svbb = SET_VAR_SIZE_MIN(&tbl); break; case 16: svbb = SET_VAR_SIZE_MAX(&tbl); break; case 17: svbb = SET_VAR_DEGREE_SIZE_MIN(&tbl); break; case 18: svbb = SET_VAR_DEGREE_SIZE_MAX(&tbl); break; case 19: svbb = SET_VAR_AFC_SIZE_MIN(1.0,&tbl); break; case 20: svbb = SET_VAR_AFC_SIZE_MAX(1.0,&tbl); break; case 21: svbb = SET_VAR_ACTIVITY_SIZE_MIN(sab,&tbl); break; case 22: svbb = SET_VAR_ACTIVITY_SIZE_MAX(sab,&tbl); break; } switch (Base::rand(9U)) { case 0U: branch(*c, c->x, svba, svb); break; case 1U: branch(*c, c->x, svbb, svb); break; case 2U: branch(*c, c->x, tiebreak(svba,svbb), svb); break; case 3U: branch(*c, c->x, tiebreak(svbb,svba), svb); break; case 4U: branch(*c, c->x, tiebreak(svba,svba,svbb), svb); break; case 5U: branch(*c, c->x, tiebreak(svba,svbb,svbb), svb); break; case 6U: branch(*c, c->x, tiebreak(svbb,svba,svba), svb); break; case 7U: branch(*c, c->x, tiebreak(svba,svba,svbb,svba), svb); break; case 8U: branch(*c, c->x, tiebreak(svbb,svba,svbb,svba), svb); break; } } Gecode::Search::Options o; results[solutions(c,o)].push_back (RunInfo(set_var_branch_name[vara], set_var_branch_name[varb], set_val_branch_name[val], o)); } } } if (results.size() > 1) goto failed; delete root; return true; failed: std::cout << "FAILURE" << std::endl; for (map >::iterator it = results.begin(); it != results.end(); ++it) { std::cout << "Number of solutions: " << it->first << std::endl; for (unsigned int i = 0; i < it->second.size(); ++i) std::cout << it->second[i] << " "; std::cout << std::endl; } delete root; return results.size() == 1; } #endif #ifdef GECODE_HAS_FLOAT_VARS FloatTest::FloatTest(const std::string& s, int a, const Gecode::FloatVal& d, int nbs) : Base("Float::Branch::"+s), arity(a), dom(d), nbSols(nbs) { } bool FloatTest::run(void) { using std::map; using std::vector; using std::string; using std::ostream; using namespace Gecode; // Results of tests run map > results; // Set up root space FloatTestSpace* root = new FloatTestSpace(arity,dom); post(*root, root->x); root->status(); results.clear(); for (int vara = 0; vara(root->clone(false)); if (vara == 0) { for (int i=0; ix.size(); i++) branch(*c, c->x[i], fvb); } else { Rnd ra(1); FloatVarBranch fvba; FloatActivity faa(*c, c->x, 0.9); switch (vara) { case 0: break; case 1: fvba = FLOAT_VAR_NONE(); break; case 2: fvba = FLOAT_VAR_RND(ra); break; case 3: fvba = FLOAT_VAR_MERIT_MIN(&float_merit); break; case 4: fvba = FLOAT_VAR_MERIT_MAX(&float_merit); break; case 5: fvba = FLOAT_VAR_DEGREE_MIN(); break; case 6: fvba = FLOAT_VAR_DEGREE_MAX(); break; case 7: fvba = FLOAT_VAR_AFC_MIN(0.5); break; case 8: fvba = FLOAT_VAR_AFC_MAX(0.5); break; case 9: fvba = FLOAT_VAR_ACTIVITY_MIN(faa); break; case 10: fvba = FLOAT_VAR_ACTIVITY_MAX(faa); break; case 11: fvba = FLOAT_VAR_MIN_MIN(); break; case 12: fvba = FLOAT_VAR_MIN_MAX(); break; case 13: fvba = FLOAT_VAR_MAX_MIN(); break; case 14: fvba = FLOAT_VAR_MAX_MAX(); break; case 15: fvba = FLOAT_VAR_SIZE_MIN(); break; case 16: fvba = FLOAT_VAR_SIZE_MAX(); break; case 17: fvba = FLOAT_VAR_DEGREE_SIZE_MIN(); break; case 18: fvba = FLOAT_VAR_DEGREE_SIZE_MAX(); break; case 19: fvba = FLOAT_VAR_AFC_SIZE_MIN(); break; case 20: fvba = FLOAT_VAR_AFC_SIZE_MAX(); break; case 21: fvba = FLOAT_VAR_ACTIVITY_SIZE_MIN(faa); break; case 22: fvba = FLOAT_VAR_ACTIVITY_SIZE_MAX(faa); break; } Rnd rb(2); FloatVarBranch fvbb; FloatActivity fab(*c, c->x, 0.9, &float_merit); switch (varb) { case 0: break; case 1: fvbb = FLOAT_VAR_NONE(); break; case 2: fvbb = FLOAT_VAR_RND(rb); break; case 3: fvbb = FLOAT_VAR_MERIT_MIN(&float_merit,&tbl); break; case 4: fvbb = FLOAT_VAR_MERIT_MAX(&float_merit,&tbl); break; case 5: fvbb = FLOAT_VAR_DEGREE_MIN(&tbl); break; case 6: fvbb = FLOAT_VAR_DEGREE_MAX(&tbl); break; case 7: fvbb = FLOAT_VAR_AFC_MIN(0.5,&tbl); break; case 8: fvbb = FLOAT_VAR_AFC_MAX(0.5,&tbl); break; case 9: fvbb = FLOAT_VAR_ACTIVITY_MIN(fab,&tbl); break; case 10: fvbb = FLOAT_VAR_ACTIVITY_MAX(fab,&tbl); break; case 11: fvbb = FLOAT_VAR_MIN_MIN(&tbl); break; case 12: fvbb = FLOAT_VAR_MIN_MAX(&tbl); break; case 13: fvbb = FLOAT_VAR_MAX_MIN(&tbl); break; case 14: fvbb = FLOAT_VAR_MAX_MAX(&tbl); break; case 15: fvbb = FLOAT_VAR_SIZE_MIN(&tbl); break; case 16: fvbb = FLOAT_VAR_SIZE_MAX(&tbl); break; case 17: fvbb = FLOAT_VAR_DEGREE_SIZE_MIN(&tbl); break; case 18: fvbb = FLOAT_VAR_DEGREE_SIZE_MAX(&tbl); break; case 19: fvbb = FLOAT_VAR_AFC_SIZE_MIN(1.0,&tbl); break; case 20: fvbb = FLOAT_VAR_AFC_SIZE_MAX(1.0,&tbl); break; case 21: fvbb = FLOAT_VAR_ACTIVITY_SIZE_MIN(fab,&tbl); break; case 22: fvbb = FLOAT_VAR_ACTIVITY_SIZE_MAX(fab,&tbl); break; } switch (Base::rand(9U)) { case 0U: branch(*c, c->x, fvba, fvb); break; case 1U: branch(*c, c->x, fvbb, fvb); break; case 2U: branch(*c, c->x, tiebreak(fvba,fvbb), fvb); break; case 3U: branch(*c, c->x, tiebreak(fvbb,fvba), fvb); break; case 4U: branch(*c, c->x, tiebreak(fvba,fvba,fvbb), fvb); break; case 5U: branch(*c, c->x, tiebreak(fvba,fvbb,fvbb), fvb); break; case 6U: branch(*c, c->x, tiebreak(fvbb,fvba,fvba), fvb); break; case 7U: branch(*c, c->x, tiebreak(fvba,fvba,fvbb,fvba), fvb); break; case 8U: branch(*c, c->x, tiebreak(fvbb,fvba,fvbb,fvba), fvb); break; } } Gecode::Search::Options o; results[solutions(c,o,nbSols)].push_back (RunInfo(float_var_branch_name[vara], float_var_branch_name[varb], float_val_branch_name[val], o)); } } } if (results.size() > 1) goto failed; delete root; return true; failed: std::cout << "FAILURE" << std::endl; for (map >::iterator it = results.begin(); it != results.end(); ++it) { std::cout << "Number of solutions: " << it->first << std::endl; for (unsigned int i = 0; i < it->second.size(); ++i) std::cout << it->second[i] << " "; std::cout << std::endl; } delete root; return results.size() == 1; } #endif }} // STATISTICS: test-branch gecode-4.2.1/test/branch.hh0000644000175000010010000001043711737266453014641 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Mikael Lagerkvist * Christian Schulte * * Contributing authors: * Vincent Barichard * * Copyright: * Mikael Lagerkvist, 2006 * Christian Schulte, 2009 * Vincent Barichard, 2012 * * Last modified: * $Date: 2012-04-05 12:00:11 +0200 (Thu, 05 Apr 2012) $ by $Author: vbarichard $ * $Revision: 12703 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef __GECODE_TEST_BRANCH_HH__ #define __GECODE_TEST_BRANCH_HH__ #include #include #ifdef GECODE_HAS_SET_VARS #include #endif #ifdef GECODE_HAS_FLOAT_VARS #include #endif #include "test/test.hh" namespace Test { /// Tests for branchings namespace Branch { /** * \brief %Base class for tests for branching on integer variables * */ class IntTest : public Base { protected: /// Number of variables int arity; /// Domain of variables Gecode::IntSet dom; public: /// Construct and register test IntTest(const std::string& s, int a, const Gecode::IntSet& d); /// Perform test virtual bool run(void); /// Post propagators on variables \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) = 0; }; /** * \brief %Base class for tests for branching on Boolean variables * */ class BoolTest : public Base { protected: /// Number of variables int arity; public: /// Construct and register test BoolTest(const std::string& s, int a); /// Perform test virtual bool run(void); /// Post propagators on variables \a x virtual void post(Gecode::Space& home, Gecode::BoolVarArray& x) = 0; }; #ifdef GECODE_HAS_SET_VARS /** * \brief %Base class for tests for branching on set variables * */ class SetTest : public Base { protected: /// Number of variables int arity; /// Domain of variables Gecode::IntSet dom; public: /// Construct and register test SetTest(const std::string& s, int a, const Gecode::IntSet& d); /// Perform test virtual bool run(void); /// Post propagators on variables \a x virtual void post(Gecode::Space& home, Gecode::SetVarArray& x) = 0; }; #endif #ifdef GECODE_HAS_FLOAT_VARS /** * \brief %Base class for tests for branching on float variables * */ class FloatTest : public Base { protected: /// Number of variables int arity; /// Domain of variables Gecode::FloatVal dom; /// Maximum number of solutions searched during solving int nbSols; public: /// Construct and register test FloatTest(const std::string& s, int a, const Gecode::FloatVal& d, int nbs); /// Perform test virtual bool run(void); /// Post propagators on variables \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) = 0; }; #endif } } #endif // STATISTICS: test-branch gecode-4.2.1/test/brancher-handle.cpp0000755000175000010010000001032712112746354016574 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2013 * * Last modified: * $Date: 2013-02-25 21:43:24 +0100 (Mon, 25 Feb 2013) $ by $Author: schulte $ * $Revision: 13406 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include "test/test.hh" namespace Test { /// %Test for brancher handles class BrancherHandle : public Test::Base { protected: /// Test space class TestSpace : public Gecode::Space { protected: /// An array of integer variables Gecode::IntVarArray x; public: /// Constructor for creation TestSpace(void) : x(*this,2,0,10) {} /// Constructor for cloning \a s TestSpace(bool share, TestSpace& s) : Space(share,s) { x.update(*this,share,s.x); } /// Post arbitrary brancher and return its handle Gecode::BrancherHandle post(void) { using namespace Gecode; return Gecode::branch(*this, x, INT_VAR_NONE(), INT_VAL_MIN()); } /// Copy during cloning virtual Space* copy(bool share) { return new TestSpace(share,*this); } }; /// How many branchers to create static const int n_b = 1024; /// Return random index int index(void) { // return rand(n); return 4; } public: /// Initialize test BrancherHandle(void) : Test::Base("BrancherHandle") {} /// Perform actual tests bool run(void) { using namespace Gecode; TestSpace* s = new TestSpace; // Create and immediately delete for (int i=0; ipost()); if (!b(*s)) return false; b.kill(*s); if (b(*s)) return false; } if (s->status() != SS_SOLVED) return false; // Array of handles for tests Gecode::BrancherHandle bs[n_b]; // Create and delete for (int i=0; ipost()); if (!b(*s)) return false; bs[i] = b; } for (int i=0; istatus() != SS_SOLVED) return false; // Create and delete in inverse order for (int i=0; ipost()); if (!b(*s)) return false; bs[i] = b; } for (int i=n_b; i--; ) { bs[i].kill(*s); if (bs[i](*s)) return false; } if (s->status() != SS_SOLVED) return false; // Create and delete randomly for (int i=0; ipost()); if (!b(*s)) return false; bs[i] = b; } int a = n_b; while (a > 0) { int i = rand(n_b); if (bs[i](*s)) { bs[i].kill(*s); a--; } } if (s->status() != SS_SOLVED) return false; return true; } }; BrancherHandle bh; } // STATISTICS: test-core gecode-4.2.1/test/float/0000755000175000010010000000000012236131647014152 5ustar schulteNonegecode-4.2.1/test/float/arithmetic.cpp0000644000175000010010000010470412104025427017005 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Vincent Barichard * * Copyright: * Christian Schulte, 2005 * Vincent Barichard, 2012 * * Last modified: * $Date: 2013-02-04 22:41:43 +0100 (Mon, 04 Feb 2013) $ by $Author: schulte $ * $Revision: 13264 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/float.hh" #include #include #include namespace Test { namespace Float { /// %Tests for arithmetic constraints namespace Arithmetic { /** * \defgroup TaskTestFloatArithmetic Arithmetic constraints * \ingroup TaskTestFloat */ //@{ /// %Test for multiplication constraint class MultXYZ : public Test { public: /// Create and register test MultXYZ(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Mult::XYZ::"+s,3,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(x[0] * x[1], x[2]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (flip()) Gecode::mult(home, x[0], x[1], x[2]); else Gecode::rel(home, x[0] * x[1] == x[2]); } }; /// %Test for multiplication constraint when solution is ensured class MultXYZSol : public Test { public: /// Create and register test MultXYZSol(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Mult::XYZ::Sol::"+s,3,d,st,EXTEND_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(x[0] * x[1], x[2]); } /// Extend assignment \a x virtual bool extendAssignement(Assignment& x) const { Gecode::FloatVal d = x[0]*x[1]; if (Gecode::Float::subset(d, dom)) { x.set(2, d); return true; } else { return false; } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::mult(home, x[0], x[1], x[2]); } }; /// %Test for multiplication constraint with shared variables class MultXXY : public Test { public: /// Create and register test MultXXY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Mult::XXY::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(x[0] * x[0], x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::mult(home, x[0], x[0], x[1]); } }; /// %Test for multiplication constraint with shared variables when solution is ensured class MultXXYSol : public Test { public: /// Create and register test MultXXYSol(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Mult::XXY::Sol::"+s,2,d,st,EXTEND_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(x[0] * x[0], x[1]); } /// Extend assignment \a x virtual bool extendAssignement(Assignment& x) const { Gecode::FloatVal d = x[0]*x[0]; if (Gecode::Float::subset(d, dom)) { x.set(1, d); return true; } else { return false; } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::mult(home, x[0], x[0], x[1]); } }; /// %Test for multiplication constraint with shared variables class MultXYX : public Test { public: /// Create and register test MultXYX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Mult::XYX::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(x[0] * x[1], x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::mult(home, x[0], x[1], x[0]); } }; /// %Test for multiplication constraint with shared variables class MultXYY : public Test { public: /// Create and register test MultXYY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Mult::XYY::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(x[0] * x[1], x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::mult(home, x[0], x[1], x[1]); } }; /// %Test for multiplication constraint with shared variables class MultXXX : public Test { public: /// Create and register test MultXXX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Mult::XXX::"+s,1,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(x[0] * x[0], x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::mult(home, x[0], x[0], x[0]); } }; /// %Test for division constraint class Div : public Test { public: /// Create and register test Div(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Div::"+s,3,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(x[0] / x[1], x[2]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (flip()) Gecode::div(home, x[0], x[1], x[2]); else Gecode::rel(home, x[0] / x[1] == x[2]); } }; /// %Test for division constraint when solution is ensured class DivSol : public Test { public: /// Create and register test DivSol(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Div::Sol::"+s,3,d,st,EXTEND_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(x[0] / x[1], x[2]); } /// Extend assignment \a x virtual bool extendAssignement(Assignment& x) const { Gecode::FloatVal d = x[0]/x[1]; if (Gecode::Float::subset(d, dom)) { x.set(2, d); return true; } else { return false; } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::div(home, x[0], x[1], x[2]); } }; /// %Test for squaring constraint class SqrXY : public Test { public: /// Create and register test SqrXY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Sqr::XY::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(x[0] * x[0], x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (flip()) Gecode::sqr(home, x[0], x[1]); else Gecode::rel(home, sqr(x[0]) == x[1]); } }; /// %Test for squaring constraint where solution is ensured class SqrXYSol : public Test { public: /// Create and register test SqrXYSol(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Sqr::XY::Sol::"+s,2,d,st,EXTEND_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(x[0] * x[0], x[1]); } /// Extend assignment \a x virtual bool extendAssignement(Assignment& x) const { Gecode::FloatVal d = sqr(x[0]); if (Gecode::Float::subset(d, dom)) { x.set(1, d); return true; } else { return false; } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::sqr(home, x[0], x[1]); } }; /// %Test for squaring constraint with shared variables class SqrXX : public Test { public: /// Create and register test SqrXX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Sqr::XX::"+s,1,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(x[0] * x[0], x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::sqr(home, x[0], x[0]); } }; /// %Test for square root constraint class SqrtXY : public Test { public: /// Create and register test SqrtXY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Sqrt::XY::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { switch (cmp(x[0], Gecode::FRT_GQ, 0.0)) { case MT_FALSE: return MT_FALSE; case MT_MAYBE: return MT_MAYBE; default: return eq(sqrt(x[0]), x[1]); } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (flip()) Gecode::sqrt(home, x[0], x[1]); else Gecode::rel(home, sqrt(x[0]) == x[1]); } }; /// %Test for square root constraint where solution is ensured class SqrtXYSol : public Test { public: /// Create and register test SqrtXYSol(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Sqrt::XY::Sol::"+s,2,d,st,EXTEND_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { switch (cmp(x[0], Gecode::FRT_GQ, 0.0)) { case MT_FALSE: return MT_FALSE; case MT_MAYBE: return MT_MAYBE; default: return eq(sqrt(x[0]), x[1]); } } /// Extend assignment \a x virtual bool extendAssignement(Assignment& x) const { Gecode::FloatVal d = sqrt(abs(x[0])); if (Gecode::Float::subset(d, dom)) { x.set(1, d); return true; } else { return false; } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::sqrt(home, x[0], x[1]); } }; /// %Test for square root constraint with shared variables class SqrtXX : public Test { public: /// Create and register test SqrtXX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Sqrt::XX::"+s,1,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { switch (cmp(x[0], Gecode::FRT_GQ, 0.0)) { case MT_FALSE: return MT_FALSE; case MT_MAYBE: return MT_MAYBE; default: return eq(sqrt(x[0]), x[0]); } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::sqrt(home, x[0], x[0]); } }; /// %Test for pow constraint class PowXY : public Test { unsigned int n; public: /// Create and register test PowXY(const std::string& s, const Gecode::FloatVal& d, unsigned int _n, Gecode::FloatNum st) : Test("Arithmetic::Pow::N::"+str(_n)+"::XY::"+s,2,d,st,CPLT_ASSIGNMENT,false), n(_n) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(pow(x[0],n), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (flip()) Gecode::pow(home, x[0], n, x[1]); else Gecode::rel(home, pow(x[0],n) == x[1]); } }; /// %Test for pow constraint where solution is ensured class PowXYSol : public Test { unsigned int n; public: /// Create and register test PowXYSol(const std::string& s, const Gecode::FloatVal& d, unsigned int _n, Gecode::FloatNum st) : Test("Arithmetic::Pow::N::"+str(_n)+"::XY::Sol::"+s,2,d,st,EXTEND_ASSIGNMENT,false), n(_n) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(pow(x[0],n), x[1]); } /// Extend assignment \a x virtual bool extendAssignement(Assignment& x) const { Gecode::FloatVal d = pow(x[0],n); if (Gecode::Float::subset(d, dom)) { x.set(1, d); return true; } else { return false; } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::pow(home, x[0], n, x[1]); } }; /// %Test for pow constraint with shared variables class PowXX : public Test { unsigned int n; public: /// Create and register test PowXX(const std::string& s, const Gecode::FloatVal& d, unsigned int _n, Gecode::FloatNum st) : Test("Arithmetic::Pow::N::"+str(_n)+"::XX::"+s,1,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(pow(x[0],n), x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::pow(home, x[0], n, x[0]); } }; /// %Test for nroot constraint class NRootXY : public Test { unsigned int n; public: /// Create and register test NRootXY(const std::string& s, const Gecode::FloatVal& d, unsigned int _n, Gecode::FloatNum st) : Test("Arithmetic::NRoot::N::"+str(_n)+"::XY::"+s,2,d,st,CPLT_ASSIGNMENT,false), n(_n) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if ((n == 0) || (x[0].max() < 0.0)) return MT_FALSE; return eq(nroot(x[0],n), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (flip()) Gecode::nroot(home, x[0], n, x[1]); else Gecode::rel(home, nroot(x[0],n) == x[1]); } }; /// %Test for nroot constraint where solution is ensured class NRootXYSol : public Test { unsigned int n; public: /// Create and register test NRootXYSol(const std::string& s, const Gecode::FloatVal& d, unsigned int _n, Gecode::FloatNum st) : Test("Arithmetic::NRoot::N::"+str(_n)+"::XY::Sol::"+s,2,d,st,EXTEND_ASSIGNMENT,false), n(_n) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if ((n == 0) || (x[0].max() < 0.0)) return MT_FALSE; return eq(nroot(x[0],n), x[1]); } /// Extend assignment \a x virtual bool extendAssignement(Assignment& x) const { if ((n == 0) || (x[0].max() < 0)) return false; Gecode::FloatVal d = nroot(x[0],n); if (Gecode::Float::subset(d, dom)) { x.set(1, d); return true; } else { return false; } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::nroot(home, x[0], n, x[1]); } }; /// %Test for nroot constraint with shared variables class NRootXX : public Test { unsigned int n; public: /// Create and register test NRootXX(const std::string& s, const Gecode::FloatVal& d, unsigned int _n, Gecode::FloatNum st) : Test("Arithmetic::NRoot::N::"+str(_n)+"::XX::"+s,1,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if ((n == 0) || (x[0].max() < 0)) return MT_FALSE; return eq(nroot(x[0],n), x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::nroot(home, x[0], n, x[0]); } }; /// %Test for absolute value constraint class AbsXY : public Test { public: /// Create and register test AbsXY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Abs::XY::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(abs(x[0]), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (flip()) Gecode::abs(home, x[0], x[1]); else Gecode::rel(home, abs(x[0]) == x[1]); } }; /// %Test for absolute value constraint with shared variables class AbsXX : public Test { public: /// Create and register test AbsXX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Abs::XX::"+s,1,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(abs(x[0]), x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::abs(home, x[0], x[0]); } }; /// %Test for binary minimum constraint class MinXYZ : public Test { public: /// Create and register test MinXYZ(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Min::Bin::XYZ::"+s,3,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(min(x[0],x[1]), x[2]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (flip()) Gecode::min(home, x[0], x[1], x[2]); else Gecode::rel(home, min(x[0],x[1]) == x[2]); } }; /// %Test for binary minimum constraint with shared variables class MinXXY : public Test { public: /// Create and register test MinXXY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Min::Bin::XXY::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(min(x[0],x[0]), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::min(home, x[0], x[0], x[1]); } }; /// %Test for binary minimum constraint with shared variables class MinXYX : public Test { public: /// Create and register test MinXYX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Min::Bin::XYX::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(min(x[0],x[1]), x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::min(home, x[0], x[1], x[0]); } }; /// %Test for binary minimum constraint with shared variables class MinXYY : public Test { public: /// Create and register test MinXYY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Min::Bin::XYY::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(min(x[0],x[1]), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::min(home, x[0], x[1], x[1]); } }; /// %Test for binary minimum constraint with shared variables class MinXXX : public Test { public: /// Create and register test MinXXX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Min::Bin::XXX::"+s,1,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(min(x[0],x[0]), x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::min(home, x[0], x[0], x[0]); } }; /// %Test for binary maximum constraint class MaxXYZ : public Test { public: /// Create and register test MaxXYZ(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Max::Bin::XYZ::"+s,3,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(max(x[0],x[1]), x[2]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (flip()) Gecode::max(home, x[0], x[1], x[2]); else Gecode::rel(home, max(x[0], x[1]) == x[2]); } }; /// %Test for binary maximum constraint with shared variables class MaxXXY : public Test { public: /// Create and register test MaxXXY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Max::Bin::XXY::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(max(x[0],x[0]), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::max(home, x[0], x[0], x[1]); } }; /// %Test for binary maximum constraint with shared variables class MaxXYX : public Test { public: /// Create and register test MaxXYX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Max::Bin::XYX::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(max(x[0],x[1]), x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::max(home, x[0], x[1], x[0]); } }; /// %Test for binary maximum constraint with shared variables class MaxXYY : public Test { public: /// Create and register test MaxXYY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Max::Bin::XYY::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(max(x[0],x[1]), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::max(home, x[0], x[1], x[1]); } }; /// %Test for binary maximum constraint with shared variables class MaxXXX : public Test { public: /// Create and register test MaxXXX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Arithmetic::Max::Bin::XXX::"+s,1,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(max(x[0],x[0]), x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::max(home, x[0], x[0], x[0]); } }; /// %Test for n-ary minimmum constraint class MinNary : public Test { public: /// Create and register test MinNary(void) : Test("Arithmetic::Min::Nary",4,-4,4,0.5,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(min(min(x[0],x[1]),x[2]), x[3]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::FloatVarArgs m(3); m[0]=x[0]; m[1]=x[1]; m[2]=x[2]; if (flip()) Gecode::min(home, m, x[3]); else Gecode::rel(home, min(m) == x[3]); } }; /// %Test for n-ary minimmum constraint with shared variables class MinNaryShared : public Test { public: /// Create and register test MinNaryShared(void) : Test("Arithmetic::Min::Nary::Shared",3,-4,4,0.5,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(min(min(x[0],x[1]),x[2]), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::FloatVarArgs m(3); m[0]=x[0]; m[1]=x[1]; m[2]=x[2]; Gecode::min(home, m, x[1]); } }; /// %Test for n-ary maximum constraint class MaxNary : public Test { public: /// Create and register test MaxNary(void) : Test("Arithmetic::Max::Nary",4,-4,4,0.5,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(max(max(x[0],x[1]),x[2]), x[3]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::FloatVarArgs m(3); m[0]=x[0]; m[1]=x[1]; m[2]=x[2]; if (flip()) Gecode::max(home, m, x[3]); else Gecode::rel(home, max(m) == x[3]); } }; /// %Test for n-ary maximum constraint with shared variables class MaxNaryShared : public Test { public: /// Create and register test MaxNaryShared(void) : Test("Arithmetic::Max::Nary::Shared",3,-4,4,0.5,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(max(max(x[0],x[1]),x[2]), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::FloatVarArgs m(3); m[0]=x[0]; m[1]=x[1]; m[2]=x[2]; Gecode::max(home, m, x[1]); } }; const Gecode::FloatNum step = 0.15; const Gecode::FloatNum step2 = 2*step; Gecode::FloatVal a(-8,5); Gecode::FloatVal b(9,12); Gecode::FloatVal c(-8,8); MultXXY mult_xxy_a("A",a,step); MultXXY mult_xxy_b("B",b,step); MultXXY mult_xxy_c("C",c,step); MultXXYSol mult_xxy_sol_a("A",a,step); MultXXYSol mult_xxy_sol_b("B",b,step); MultXXYSol mult_xxy_sol_c("C",c,step); MultXYX mult_xyx_a("A",a,step); MultXYX mult_xyx_b("B",b,step); MultXYX mult_xyx_c("C",c,step); MultXYY mult_xyy_a("A",a,step); MultXYY mult_xyy_b("B",b,step); MultXYY mult_xyy_c("C",c,step); MultXXX mult_xxx_a("A",a,step); MultXXX mult_xxx_b("B",b,step); MultXXX mult_xxx_c("C",c,step); MultXYZ mult_xyz_a("A",a,step); MultXYZ mult_xyz_b("B",b,step); MultXYZ mult_xyz_c("C",c,step); MultXYZSol mult_xyz_sol_a("A",a,step); MultXYZSol mult_xyz_sol_b("B",b,step); MultXYZSol mult_xyz_sol_c("C",c,step); Div div_a("A",a,step); Div div_b("B",b,step); Div div_c("C",c,step); DivSol div_sol_a("A",a,step); DivSol div_sol_b("B",b,step); DivSol div_sol_c("C",c,step); SqrXY sqr_xy_a("A",a,step); SqrXY sqr_xy_b("B",b,step); SqrXY sqr_xy_c("C",c,step); SqrXYSol sqr_xy_sol_a("A",a,step); SqrXYSol sqr_xy_sol_b("B",b,step); SqrXYSol sqr_xy_sol_c("C",c,step); SqrXX sqr_xx_a("A",a,step); SqrXX sqr_xx_b("B",b,step); SqrXX sqr_xx_c("C",c,step); SqrtXY sqrt_xy_a("A",a,step); SqrtXY sqrt_xy_b("B",b,step); SqrtXY sqrt_xy_c("C",c,step); SqrtXYSol sqrt_xy_sol_a("A",a,step); SqrtXYSol sqrt_xy_sol_b("B",b,step); SqrtXYSol sqrt_xy_sol_c("C",c,step); SqrtXX sqrt_xx_a("A",a,step); SqrtXX sqrt_xx_b("B",b,step); SqrtXX sqrt_xx_c("C",c,step); PowXY pow_xy_a_1("A",a,2,step); PowXY pow_xy_b_1("B",b,2,step); PowXY pow_xy_c_1("C",c,2,step); PowXYSol pow_xy_sol_a_1("A",a,2,step); PowXYSol pow_xy_sol_b_1("B",b,2,step); PowXYSol pow_xy_sol_c_1("C",c,2,step); PowXX pow_xx_a_1("A",a,2,step); PowXX pow_xx_b_1("B",b,2,step); PowXX pow_xx_c_1("C",c,2,step); PowXY pow_xy_a_2("A",a,3,step); PowXY pow_xy_b_2("B",b,3,step); PowXY pow_xy_c_2("C",c,3,step); PowXYSol pow_xy_sol_a_2("A",a,3,step); PowXYSol pow_xy_sol_b_2("B",b,3,step); PowXYSol pow_xy_sol_c_2("C",c,3,step); PowXX pow_xx_a_2("A",a,3,step); PowXX pow_xx_b_2("B",b,3,step); PowXX pow_xx_c_2("C",c,3,step); PowXY pow_xy_a_3("A",a,0,step); PowXY pow_xy_b_3("B",b,0,step); PowXY pow_xy_c_3("C",c,0,step); PowXYSol pow_xy_sol_a_3("A",a,0,step); PowXYSol pow_xy_sol_b_3("B",b,0,step); PowXYSol pow_xy_sol_c_3("C",c,0,step); PowXX pow_xx_a_3("A",a,0,step); PowXX pow_xx_b_3("B",b,0,step); PowXX pow_xx_c_3("C",c,0,step); NRootXY nroot_xy_a_1("A",a,2,step); NRootXY nroot_xy_b_1("B",b,2,step); NRootXY nroot_xy_c_1("C",c,2,step); NRootXYSol nroot_xy_sol_a_1("A",a,2,step); NRootXYSol nroot_xy_sol_b_1("B",b,2,step); NRootXYSol nroot_xy_sol_c_1("C",c,2,step); NRootXX nroot_xx_a_1("A",a,2,step); NRootXX nroot_xx_b_1("B",b,2,step); NRootXX nroot_xx_c_1("C",c,2,step); NRootXY nroot_xy_a_2("A",a,3,step); NRootXY nroot_xy_b_2("B",b,3,step); NRootXY nroot_xy_c_2("C",c,3,step); NRootXYSol nroot_xy_sol_a_2("A",a,3,step); NRootXYSol nroot_xy_sol_b_2("B",b,3,step); NRootXYSol nroot_xy_sol_c_2("C",c,3,step); NRootXX nroot_xx_a_2("A",a,3,step); NRootXX nroot_xx_b_2("B",b,3,step); NRootXX nroot_xx_c_2("C",c,3,step); NRootXY nroot_xy_a_3("A",a,0,step); NRootXY nroot_xy_b_3("B",b,0,step); NRootXY nroot_xy_c_3("C",c,0,step); NRootXYSol nroot_xy_sol_a_3("A",a,0,step); NRootXYSol nroot_xy_sol_b_3("B",b,0,step); NRootXYSol nroot_xy_sol_c_3("C",c,0,step); NRootXX nroot_xx_a_3("A",a,0,step); NRootXX nroot_xx_b_3("B",b,0,step); NRootXX nroot_xx_c_3("C",c,0,step); AbsXY abs_xy_a("A",a,step); AbsXY abs_xy_b("B",b,step); AbsXY abs_xy_c("C",c,step); AbsXX abs_xx_a("A",a,step); AbsXX abs_xx_b("B",b,step); AbsXX abs_xx_c("C",c,step); MinXYZ min_xyz_a("A",a,step); MinXYZ min_xyz_b("B",b,step); MinXYZ min_xyz_c("C",c,step); MinXXY min_xxy_a("A",a,step); MinXXY min_xxy_b("B",b,step); MinXXY min_xxy_c("C",c,step); MinXYX min_xyx_a("A",a,step); MinXYX min_xyx_b("B",b,step); MinXYX min_xyx_c("C",c,step); MinXYY min_xyy_a("A",a,step); MinXYY min_xyy_b("B",b,step); MinXYY min_xyy_c("C",c,step); MinXXX min_xxx_a("A",a,step); MinXXX min_xxx_b("B",b,step); MinXXX min_xxx_c("C",c,step); MaxXYZ max_xyz_a("A",a,step); MaxXYZ max_xyz_b("B",b,step); MaxXYZ max_xyz_c("C",c,step); MaxXXY max_xxy_a("A",a,step); MaxXXY max_xxy_b("B",b,step); MaxXXY max_xxy_c("C",c,step); MaxXYX max_xyx_a("A",a,step); MaxXYX max_xyx_b("B",b,step); MaxXYX max_xyx_c("C",c,step); MaxXYY max_xyy_a("A",a,step); MaxXYY max_xyy_b("B",b,step); MaxXYY max_xyy_c("C",c,step); MaxXXX max_xxx_a("A",a,step); MaxXXX max_xxx_b("B",b,step); MaxXXX max_xxx_c("C",c,step); MinNary min_nary; MinNaryShared min_s_nary; MaxNary max_nary; MaxNaryShared max_s_nary; //@} } }} // STATISTICS: test-float gecode-4.2.1/test/float/basic.cpp0000644000175000010010000000546412077774005015754 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Vincent Barichard * * Copyright: * Christian Schulte, 2005 * Vincent Barichard, 2012 * * Last modified: * $Date: 2013-01-23 15:47:33 +0100 (Wed, 23 Jan 2013) $ by $Author: schulte $ * $Revision: 13230 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/float.hh" namespace Test { namespace Float { /// %Tests for basic setup namespace Basic { /** * \defgroup TaskTestFloatBasic Basic setup * \ingroup TaskTestFloat */ //@{ /// %Test whether testing infrastructure for float variables works class Basic : public Test { public: /// Initialize test Basic(Gecode::FloatNum n, Gecode::FloatNum s) : Test("Basic",3,-n,n,s,CPLT_ASSIGNMENT,true) {} /// Initialize test Basic(Gecode::FloatVal v, Gecode::FloatNum s) : Test("Basic",3,v,s,CPLT_ASSIGNMENT,true) {} /// Check whether \a x is a solution virtual MaybeType solution(const Assignment&) const { return MT_TRUE; } /// Post constraint on \a x virtual void post(Gecode::Space&, Gecode::FloatVarArray&) { } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::FloatVarArray&, Gecode::Reify r) { Gecode::rel(home, r.var(), Gecode::IRT_EQ, 1); } }; namespace { Basic b1(3,1.5); Basic b2(Gecode::FloatVal(-2,10),1.5); } //@} } }} // STATISTICS: test-float gecode-4.2.1/test/float/channel.cpp0000644000175000010010000000524012100055452016254 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Vincent Barichard * * Copyright: * Christian Schulte, 2006 * Vincent Barichard, 2012 * * Last modified: * $Date: 2013-01-23 22:50:34 +0100 (Wed, 23 Jan 2013) $ by $Author: schulte $ * $Revision: 13232 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/float.hh" #include namespace Test { namespace Float { /// %Tests for channel constraints namespace Channel { /// %Test channel between float and integer class ChannelLinkSingle : public Test { public: /// Construct and register test ChannelLinkSingle(Gecode::FloatNum st) : Test("Channel",2,-1,2,st,CPLT_ASSIGNMENT,false) {} /// Check whether \a x is solution virtual MaybeType solution(const Assignment& x) const { Gecode::FloatNum tmp; return (((modf(x[0].min(),&tmp)==0) || (modf(x[0].max(),&tmp)==0)) && (x[0]==x[1])) ? MT_TRUE : MT_FALSE; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { using namespace Gecode; Gecode::IntVar iv(home,-1000,1000); channel(home, x[0], iv); channel(home, x[1], iv); } }; Gecode::FloatNum step = 0.7; ChannelLinkSingle cls(step); //@} } }} // STATISTICS: test-float gecode-4.2.1/test/float/dom.cpp0000755000175000010010000001144112115365170015435 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Vincent Barichard * * Copyright: * Christian Schulte, 2005 * Vincent Barichard, 2012 * * Last modified: * $Date: 2013-03-05 13:52:08 +0100 (Tue, 05 Mar 2013) $ by $Author: schulte $ * $Revision: 13434 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/float.hh" #include namespace Test { namespace Float { /// %Tests for domain constraints namespace Dom { /** * \defgroup TaskTestFloatDom Domain constraints * \ingroup TaskTestFloat */ //@{ /// %Test for domain constraints with a float value class Val : public Test { protected: /// Float constant Gecode::FloatVal c; public: /// Create and register test Val(int n, Gecode::FloatVal c0, Gecode::FloatNum st) : Test("Dom::Val::"+str(n)+"::"+str(c0), n,-3,3,st,CPLT_ASSIGNMENT,n==1), c(c0) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { for (int i=x.size(); i--; ) if ((x[i].max() > c.max()) || (x[i].min() < c.min())) return MT_FALSE; return MT_TRUE; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (x.size() == 1) Gecode::dom(home, x[0], c); else Gecode::dom(home, x, c); } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x, Gecode::Reify r) { assert(x.size() == 1); Gecode::dom(home, x[0], c, r); } }; /// %Test for domain constraints with float numbers class Num : public Test { protected: /// Float number Gecode::FloatNum min; /// Float number Gecode::FloatNum max; public: /// Create and register test Num(int n, Gecode::FloatNum min0, Gecode::FloatNum max0, Gecode::FloatNum st) : Test("Dom::Num::"+str(n)+"::"+str(min0)+"::"+str(max0), n,-3,3,st,CPLT_ASSIGNMENT,n==1), min(min0), max(max0) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if (max < min) return MT_FALSE; for (int i=x.size(); i--; ) if ((x[i].max() > max) || (x[i].min() < min)) return MT_FALSE; return MT_TRUE; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (x.size() == 1) Gecode::dom(home, x[0], min, max); else Gecode::dom(home, x, min, max); } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x, Gecode::Reify r) { assert(x.size() == 1); Gecode::dom(home, x[0], min, max, r); } }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { using namespace Gecode; FloatNum step = 0.7; for (int c=-4; c<=4; c++) { (void) new Val(1,c,step); (void) new Val(2,c,step); for (int d=-3; d<=3; d++) { (void) new Num(1,c,d,step); (void) new Num(2,c,d,step); } } } }; Create c; //@} } }} // STATISTICS: test-float gecode-4.2.1/test/float/linear.cpp0000644000175000010010000002170712101776031016130 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Vincent Barichard * * Copyright: * Christian Schulte, 2005 * Vincent Barichard, 2012 * * Last modified: * $Date: 2013-01-29 17:43:05 +0100 (Tue, 29 Jan 2013) $ by $Author: schulte $ * $Revision: 13241 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/float.hh" #include namespace Test { namespace Float { /// %Tests for linear constraints namespace Linear { /// Check whether \a has only one coefficients bool one(const Gecode::FloatValArgs& a) { for (int i=a.size(); i--; ) if (a[i] != 1) return false; return true; } /** * \defgroup TaskTestFloatLinear Linear constraints * \ingroup TaskTestFloat */ //@{ /// %Test linear relation over float variables class FloatFloat : public Test { protected: /// Coefficients Gecode::FloatValArgs a; /// Float relation type to propagate Gecode::FloatRelType frt; /// Result Gecode::FloatNum c; public: /// Create and register test FloatFloat(const std::string& s, const Gecode::FloatVal& d, const Gecode::FloatValArgs& a0, Gecode::FloatRelType frt0, Gecode::FloatNum c0, Gecode::FloatNum st) : Test("Linear::Float::"+ str(frt0)+"::"+s+"::"+str(c0)+"::" +str(a0.size()), a0.size(),d,st,CPLT_ASSIGNMENT,true), a(a0), frt(frt0), c(c0) { using namespace Gecode; testfix = false; if ((frt == FRT_NQ) || (frt == FRT_LE) || (frt == FRT_GR) || reified) testsubsumed = false; } /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { Gecode::FloatVal e = 0.0; for (int i=x.size(); i--; ) e += a[i]*x[i]; switch (cmp(e, frt, Gecode::FloatVal(c))) { case MT_FALSE: { Gecode::FloatVal eError = e; for (int i=x.size(); i--; ) eError -= a[i]*x[i]; if (cmp(e+eError, frt, Gecode::FloatVal(c)) == MT_FALSE) return MT_FALSE; else return MT_MAYBE; } case MT_TRUE: return MT_TRUE; case MT_MAYBE: return MT_MAYBE; } GECODE_NEVER; return MT_FALSE; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (one(a)) Gecode::linear(home, x, frt, c); else Gecode::linear(home, a, x, frt, c); } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x, Gecode::Reify r) { if (one(a)) Gecode::linear(home, x, frt, c, r); else Gecode::linear(home, a, x, frt, c, r); } }; /// %Test linear relation over float variables class FloatVar : public Test { protected: /// Coefficients Gecode::FloatValArgs a; /// Float relation type to propagate Gecode::FloatRelType frt; public: /// Create and register test FloatVar(const std::string& s, const Gecode::FloatVal& d, const Gecode::FloatValArgs& a0, Gecode::FloatRelType frt0, Gecode::FloatNum st) : Test("Linear::Var::"+ str(frt0)+"::"+s+"::"+str(a0.size()), a0.size()+1,d,st,CPLT_ASSIGNMENT,true), a(a0), frt(frt0) { using namespace Gecode; testfix = false; if ((frt == FRT_NQ) || (frt == FRT_LE) || (frt == FRT_GR) || reified) testsubsumed = false; } /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { Gecode::FloatVal e = 0.0; for (int i=a.size(); i--; ) e += a[i]*x[i]; switch (cmp(e, frt, x[a.size()])) { case MT_FALSE: { Gecode::FloatVal eError = e; for (int i=a.size(); i--; ) eError -= a[i]*x[i]; if (cmp(e+eError, frt, x[a.size()]) == MT_FALSE) return MT_FALSE; else return MT_MAYBE; } case MT_TRUE: return MT_TRUE; case MT_MAYBE: return MT_MAYBE; } GECODE_NEVER; return MT_FALSE; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { int n = a.size(); Gecode::FloatVarArgs y(n); for (int i=n; i--; ) y[i] = x[i]; if (one(a)) Gecode::linear(home, y, frt, x[n]); else Gecode::linear(home, a, y, frt, x[n]); } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x, Gecode::Reify r) { int n = a.size(); Gecode::FloatVarArgs y(n); for (int i=n; i--; ) y[i] = x[i]; if (one(a)) Gecode::linear(home, y, frt, x[n], r); else Gecode::linear(home, a, y, frt, x[n], r); } }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { using namespace Gecode; { FloatNum step = 0.7; FloatVal f1(-2,2); FloatVal f2(-3,-1); FloatVal f3(3,8); FloatValArgs a1(1, 0.0); for (FloatRelTypes frts; frts(); ++frts) { (void) new FloatFloat("11",f1,a1,frts.frt(),0.0,step); (void) new FloatVar("11",f1,a1,frts.frt(),step); (void) new FloatFloat("21",f2,a1,frts.frt(),0.0,step); (void) new FloatVar("21",f2,a1,frts.frt(),step); (void) new FloatFloat("31",f3,a1,frts.frt(),1.0,step); } const FloatVal av2[4] = {1.0,1.0,1.0,1.0}; const FloatVal av3[4] = {1.0,-1.0,-1.0,1.0}; const FloatVal av4[4] = {2.0,3.0,5.0,7.0}; const FloatVal av5[4] = {-2.0,3.0,-5.0,7.0}; for (int i=1; i<=4; i++) { FloatValArgs a2(i, av2); FloatValArgs a3(i, av3); FloatValArgs a4(i, av4); FloatValArgs a5(i, av5); for (FloatRelTypes frts; frts(); ++frts) { (void) new FloatFloat("12",f1,a2,frts.frt(),0.0,step); (void) new FloatFloat("13",f1,a3,frts.frt(),0.0,step); (void) new FloatFloat("14",f1,a4,frts.frt(),0.0,step); (void) new FloatFloat("15",f1,a5,frts.frt(),0.0,step); (void) new FloatFloat("22",f2,a2,frts.frt(),0.0,step); (void) new FloatFloat("23",f2,a3,frts.frt(),0.0,step); (void) new FloatFloat("24",f2,a4,frts.frt(),0.0,step); (void) new FloatFloat("25",f2,a5,frts.frt(),0.0,step); (void) new FloatFloat("32",f3,a2,frts.frt(),1.0,step); if (i < 4) { (void) new FloatVar("12",f1,a2,frts.frt(),step); (void) new FloatVar("13",f1,a3,frts.frt(),step); (void) new FloatVar("14",f1,a4,frts.frt(),step); (void) new FloatVar("15",f1,a5,frts.frt(),step); (void) new FloatVar("22",f2,a2,frts.frt(),step); (void) new FloatVar("23",f2,a3,frts.frt(),step); (void) new FloatVar("24",f2,a4,frts.frt(),step); (void) new FloatVar("25",f2,a5,frts.frt(),step); } } } } } }; Create c; //@} } }} // STATISTICS: test-float gecode-4.2.1/test/float/mm-lin.cpp0000755000175000010010000021165312104462072016053 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2008, 2012 * * Last modified: * $Date: 2013-02-06 15:10:02 +0100 (Wed, 06 Feb 2013) $ by $Author: schulte $ * $Revision: 13270 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include "test/float.hh" #include namespace Test { namespace Float { /// %Tests for minimal modeling constraints (linear) namespace MiniModelLin { /// Linear opcode enum LinOpcode { LO_ACE, ///< Add float and expression LO_AEC, ///< Add expression and float LO_AEE, ///< Add expressions LO_SCE, ///< Subtract float and expression LO_SEC, ///< Subtract expression and float LO_SEE, ///< Subtract expressions LO_SE, ///< Unary subtraction LO_MCE, ///< Multiply constant and expression LO_MEC, ///< Multiply constant and expression LO_HLT ///< Stop execution }; /// Type for representing a linear instruction class LinInstr { public: LinOpcode o; ///< Which instruction to execute unsigned char x, y, z; ///< Instruction arguments, \a y is destination (or \a z) int c; ///< Numerical constant }; /// Evaluate linear instructions template Expr eval(const LinInstr* pc, Expr reg[]) { while (true) { switch (pc->o) { case LO_ACE: reg[pc->y] = pc->c + reg[pc->x]; break; case LO_AEC: reg[pc->y] = reg[pc->x] + pc->c; break; case LO_AEE: reg[pc->z] = reg[pc->x] + reg[pc->y]; break; case LO_SCE: reg[pc->y] = pc->c - reg[pc->x]; break; case LO_SEC: reg[pc->y] = reg[pc->x] - pc->c; break; case LO_SEE: reg[pc->z] = reg[pc->x] - reg[pc->y]; break; case LO_SE: reg[pc->y] = -reg[pc->x]; break; case LO_MCE: reg[pc->y] = pc->c * reg[pc->x]; break; case LO_MEC: reg[pc->y] = reg[pc->x] * pc->c; break; case LO_HLT: return reg[pc->x]; default: GECODE_NEVER; } pc++; } GECODE_NEVER; } /** * \defgroup TaskTestFloatMiniModelLin Minimal modeling constraints (linear constraints) * \ingroup TaskTestFloat */ //@{ /// %Test linear expressions over float variables class LinExpr : public Int::Test { protected: /// Linear instruction sequence const LinInstr* lis; public: /// Create and register test LinExpr(const LinInstr* lis0, const std::string& s) : Test("Float::","MiniModel::LinExpr::"+s,4,-3,3), lis(lis0) { testfix = false; } /// %Test whether \a x is solution virtual bool solution(const Int::Assignment& x) const { int reg[3] = {x[0],x[1],x[2]}; return eval(lis, reg) == x[3]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; FloatVarArray y(home,4,dom.min(),dom.max()); channel(home, x[0], y[0]); channel(home, x[1], y[1]); channel(home, x[2], y[2]); channel(home, x[3], y[3]); LinFloatExpr reg[3] = {y[0],y[1],y[2]}; rel(home, y[3], FRT_EQ, expr(home, eval(lis,reg))); } }; /// %Test linear relations over float variables class LinRel : public Int::Test { protected: /// Linear instruction sequence for left hand side const LinInstr* l_lis; /// Linear instruction sequence for right hand side const LinInstr* r_lis; /// Float relation type to propagate Gecode::FloatRelType frt; public: /// Create and register test LinRel(const LinInstr* l_lis0, const LinInstr* r_lis0, Gecode::FloatRelType frt0, const std::string& s) : Test("Float::","MiniModel::LinRel::"+s+"::"+ Float::Test::str(frt0),3,-3,3), l_lis(l_lis0), r_lis(r_lis0), frt(frt0) { testfix = false; } /// %Test whether \a x is solution virtual bool solution(const Int::Assignment& x) const { using namespace Gecode; int l_reg[3] = {x[0],x[1],x[2]}; int l = eval(l_lis,l_reg); int r_reg[3] = {x[0],x[1],x[2]}; int r = eval(r_lis,r_reg); switch (frt) { case FRT_EQ: return l == r; case FRT_NQ: return l != r; case FRT_LE: return l < r; case FRT_GR: return l > r; case FRT_LQ: return l <= r; case FRT_GQ: return l >= r; default: GECODE_NEVER; } return false; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; FloatVarArray y(home,3,dom.min(),dom.max()); channel(home, x[0], y[0]); channel(home, x[1], y[1]); channel(home, x[2], y[2]); LinFloatExpr l_reg[3] = {y[0],y[1],y[2]}; LinFloatExpr r_reg[3] = {y[0],y[1],y[2]}; switch (frt) { case FRT_EQ: Gecode::rel(home, eval(l_lis,l_reg) == eval(r_lis,r_reg)); break; case FRT_NQ: Gecode::rel(home, eval(l_lis,l_reg) != eval(r_lis,r_reg)); break; case FRT_LQ: Gecode::rel(home, eval(l_lis,l_reg) <= eval(r_lis,r_reg)); break; case FRT_LE: Gecode::rel(home, eval(l_lis,l_reg) < eval(r_lis,r_reg)); break; case FRT_GQ: Gecode::rel(home, eval(l_lis,l_reg) >= eval(r_lis,r_reg)); break; case FRT_GR: Gecode::rel(home, eval(l_lis,l_reg) > eval(r_lis,r_reg)); break; default: GECODE_NEVER; } } }; const LinInstr li000[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li001[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li002[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li003[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li004[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li005[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li006[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li007[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li008[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li009[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li010[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li011[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li012[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li013[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li014[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li015[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li016[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li017[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li018[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li019[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li020[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li021[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li022[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li023[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li024[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li025[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li026[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li027[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li028[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li029[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li030[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li031[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li032[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li033[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li034[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li035[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li036[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li037[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li038[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li039[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li040[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li041[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li042[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li043[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li044[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li045[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li046[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li047[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li048[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li049[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li050[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li051[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li052[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li053[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li054[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li055[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li056[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li057[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li058[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li059[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li060[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li061[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li062[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li063[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li064[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li065[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li066[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li067[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li068[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li069[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li070[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li071[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li072[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li073[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li074[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li075[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li076[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li077[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li078[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li079[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li080[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li081[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li082[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li083[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li084[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li085[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li086[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li087[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li088[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li089[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li090[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li091[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li092[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li093[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li094[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li095[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li096[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li097[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li098[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li099[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li100[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li101[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li102[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li103[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li104[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li105[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li106[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li107[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li108[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li109[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li110[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li111[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li112[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li113[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li114[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li115[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li116[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li117[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li118[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li119[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li120[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li121[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li122[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li123[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li124[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li125[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li126[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li127[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li128[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li129[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li130[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li131[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li132[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li133[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li134[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li135[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li136[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li137[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li138[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li139[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li140[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li141[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li142[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li143[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li144[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li145[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li146[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li147[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li148[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li149[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li150[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li151[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li152[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li153[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li154[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li155[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li156[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li157[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li158[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li159[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li160[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li161[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li162[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li163[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li164[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li165[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li166[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li167[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li168[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li169[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li170[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li171[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li172[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li173[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li174[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li175[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li176[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li177[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li178[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li179[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li180[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li181[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li182[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li183[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li184[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li185[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li186[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li187[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li188[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li189[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li190[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li191[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li192[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li193[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li194[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li195[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li196[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li197[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li198[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li199[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li200[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li201[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li202[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li203[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li204[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li205[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li206[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li207[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li208[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li209[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li210[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li211[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li212[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li213[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li214[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li215[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li216[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li217[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li218[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li219[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li220[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li221[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li222[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li223[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li224[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li225[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li226[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li227[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li228[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li229[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li230[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li231[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li232[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li233[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li234[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li235[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li236[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li237[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li238[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li239[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li240[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li241[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li242[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li243[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li244[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li245[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li246[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li247[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li248[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li249[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li250[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li251[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li252[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li253[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li254[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li255[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li256[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li257[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li258[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li259[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li260[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li261[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li262[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li263[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li264[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li265[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li266[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li267[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li268[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li269[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li270[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li271[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li272[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li273[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li274[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li275[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li276[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li277[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li278[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li279[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li280[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li281[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li282[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li283[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li284[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li285[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li286[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li287[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li288[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li289[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li290[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li291[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li292[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li293[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li294[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li295[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li296[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li297[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li298[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li299[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li300[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li301[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li302[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li303[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li304[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li305[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li306[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li307[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li308[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li309[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li310[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li311[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li312[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li313[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li314[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li315[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li316[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li317[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li318[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li319[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li320[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li321[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li322[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li323[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li324[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li325[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li326[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li327[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li328[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li329[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li330[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li331[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li332[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li333[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li334[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li335[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li336[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li337[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li338[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li339[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li340[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li341[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li342[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li343[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li344[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li345[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li346[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li347[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li348[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li349[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li350[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li351[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li352[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li353[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li354[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li355[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li356[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li357[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li358[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li359[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li360[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li361[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li362[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li363[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li364[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li365[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li366[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li367[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li368[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li369[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li370[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li371[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li372[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li373[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li374[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li375[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li376[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li377[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li378[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li379[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li380[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li381[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li382[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li383[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li384[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li385[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li386[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li387[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li388[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li389[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li390[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li391[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li392[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li393[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li394[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li395[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li396[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li397[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li398[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li399[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr* li[] = { &li000[0],&li001[0],&li002[0],&li003[0],&li004[0],&li005[0], &li006[0],&li007[0],&li008[0],&li009[0],&li010[0],&li011[0], &li012[0],&li013[0],&li014[0],&li015[0],&li016[0],&li017[0], &li018[0],&li019[0],&li020[0],&li021[0],&li022[0],&li023[0], &li024[0],&li025[0],&li026[0],&li027[0],&li028[0],&li029[0], &li030[0],&li031[0],&li032[0],&li033[0],&li034[0],&li035[0], &li036[0],&li037[0],&li038[0],&li039[0],&li040[0],&li041[0], &li042[0],&li043[0],&li044[0],&li045[0],&li046[0],&li047[0], &li048[0],&li049[0],&li050[0],&li051[0],&li052[0],&li053[0], &li054[0],&li055[0],&li056[0],&li057[0],&li058[0],&li059[0], &li060[0],&li061[0],&li062[0],&li063[0],&li064[0],&li065[0], &li066[0],&li067[0],&li068[0],&li069[0],&li070[0],&li071[0], &li072[0],&li073[0],&li074[0],&li075[0],&li076[0],&li077[0], &li078[0],&li079[0],&li080[0],&li081[0],&li082[0],&li083[0], &li084[0],&li085[0],&li086[0],&li087[0],&li088[0],&li089[0], &li090[0],&li091[0],&li092[0],&li093[0],&li094[0],&li095[0], &li096[0],&li097[0],&li098[0],&li099[0],&li100[0],&li101[0], &li102[0],&li103[0],&li104[0],&li105[0],&li106[0],&li107[0], &li108[0],&li109[0],&li110[0],&li111[0],&li112[0],&li113[0], &li114[0],&li115[0],&li116[0],&li117[0],&li118[0],&li119[0], &li120[0],&li121[0],&li122[0],&li123[0],&li124[0],&li125[0], &li126[0],&li127[0],&li128[0],&li129[0],&li130[0],&li131[0], &li132[0],&li133[0],&li134[0],&li135[0],&li136[0],&li137[0], &li138[0],&li139[0],&li140[0],&li141[0],&li142[0],&li143[0], &li144[0],&li145[0],&li146[0],&li147[0],&li148[0],&li149[0], &li150[0],&li151[0],&li152[0],&li153[0],&li154[0],&li155[0], &li156[0],&li157[0],&li158[0],&li159[0],&li160[0],&li161[0], &li162[0],&li163[0],&li164[0],&li165[0],&li166[0],&li167[0], &li168[0],&li169[0],&li170[0],&li171[0],&li172[0],&li173[0], &li174[0],&li175[0],&li176[0],&li177[0],&li178[0],&li179[0], &li180[0],&li181[0],&li182[0],&li183[0],&li184[0],&li185[0], &li186[0],&li187[0],&li188[0],&li189[0],&li190[0],&li191[0], &li192[0],&li193[0],&li194[0],&li195[0],&li196[0],&li197[0], &li198[0],&li199[0],&li200[0],&li201[0],&li202[0],&li203[0], &li204[0],&li205[0],&li206[0],&li207[0],&li208[0],&li209[0], &li210[0],&li211[0],&li212[0],&li213[0],&li214[0],&li215[0], &li216[0],&li217[0],&li218[0],&li219[0],&li220[0],&li221[0], &li222[0],&li223[0],&li224[0],&li225[0],&li226[0],&li227[0], &li228[0],&li229[0],&li230[0],&li231[0],&li232[0],&li233[0], &li234[0],&li235[0],&li236[0],&li237[0],&li238[0],&li239[0], &li240[0],&li241[0],&li242[0],&li243[0],&li244[0],&li245[0], &li246[0],&li247[0],&li248[0],&li249[0],&li250[0],&li251[0], &li252[0],&li253[0],&li254[0],&li255[0],&li256[0],&li257[0], &li258[0],&li259[0],&li260[0],&li261[0],&li262[0],&li263[0], &li264[0],&li265[0],&li266[0],&li267[0],&li268[0],&li269[0], &li270[0],&li271[0],&li272[0],&li273[0],&li274[0],&li275[0], &li276[0],&li277[0],&li278[0],&li279[0],&li280[0],&li281[0], &li282[0],&li283[0],&li284[0],&li285[0],&li286[0],&li287[0], &li288[0],&li289[0],&li290[0],&li291[0],&li292[0],&li293[0], &li294[0],&li295[0],&li296[0],&li297[0],&li298[0],&li299[0], &li300[0],&li301[0],&li302[0],&li303[0],&li304[0],&li305[0], &li306[0],&li307[0],&li308[0],&li309[0],&li310[0],&li311[0], &li312[0],&li313[0],&li314[0],&li315[0],&li316[0],&li317[0], &li318[0],&li319[0],&li320[0],&li321[0],&li322[0],&li323[0], &li324[0],&li325[0],&li326[0],&li327[0],&li328[0],&li329[0], &li330[0],&li331[0],&li332[0],&li333[0],&li334[0],&li335[0], &li336[0],&li337[0],&li338[0],&li339[0],&li340[0],&li341[0], &li342[0],&li343[0],&li344[0],&li345[0],&li346[0],&li347[0], &li348[0],&li349[0],&li350[0],&li351[0],&li352[0],&li353[0], &li354[0],&li355[0],&li356[0],&li357[0],&li358[0],&li359[0], &li360[0],&li361[0],&li362[0],&li363[0],&li364[0],&li365[0], &li366[0],&li367[0],&li368[0],&li369[0],&li370[0],&li371[0], &li372[0],&li373[0],&li374[0],&li375[0],&li376[0],&li377[0], &li378[0],&li379[0],&li380[0],&li381[0],&li382[0],&li383[0], &li384[0],&li385[0],&li386[0],&li387[0],&li388[0],&li389[0], &li390[0],&li391[0],&li392[0],&li393[0],&li394[0],&li395[0], &li396[0],&li397[0],&li398[0],&li399[0], }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { int n = sizeof(li)/sizeof(LinInstr*); for (int i=0; i * Vincent Barichard * * Copyright: * Christian Schulte, 2005 * Vincent Barichard, 2012 * * Last modified: * $Date: 2013-02-12 20:48:02 +0100 (Tue, 12 Feb 2013) $ by $Author: vbarichard $ * $Revision: 13281 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/float.hh" #include namespace Test { namespace Float { /// %Tests for relation constraints namespace Rel { /** * \defgroup TaskTestFloatRel Relation constraints * \ingroup TaskTestFloat */ //@{ /// %Test for simple relation involving float variables class FloatVarXY : public Test { protected: /// Float relation type to propagate Gecode::FloatRelType frt; public: /// Create and register test FloatVarXY(Gecode::FloatRelType frt0, int n, Gecode::FloatNum st) : Test("Rel::Float::Var::XY::"+str(frt0)+"::"+str(n), n+1,-3,3,st,CPLT_ASSIGNMENT,n==1), frt(frt0) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if (x.size() == 2) { return cmp(x[0],frt,x[1]); } else { MaybeType r1 = cmp(x[0],frt,x[2]); MaybeType r2 = cmp(x[1],frt,x[2]); if ((r1 == MT_TRUE) && (r2 == MT_TRUE)) return MT_TRUE; else if ((r1 == MT_FALSE) || (r2 == MT_FALSE)) return MT_FALSE; else return MT_MAYBE; } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { using namespace Gecode; if (x.size() == 2) { rel(home, x[0], frt, x[1]); } else { FloatVarArgs y(2); y[0]=x[0]; y[1]=x[1]; rel(home, y, frt, x[2]); } } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x, Gecode::Reify r) { assert(x.size() == 2); Gecode::rel(home, x[0], frt, x[1], r); } }; /// %Test for simple relation involving shared float variables class FloatVarXX : public Test { protected: /// Float relation type to propagate Gecode::FloatRelType frt; public: /// Create and register test FloatVarXX(Gecode::FloatRelType frt0, Gecode::FloatNum st) : Test("Rel::Float::Var::XX::"+str(frt0), 1,-3,3,st,CPLT_ASSIGNMENT,true), frt(frt0) { } /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return cmp(x[0],frt,x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::rel(home, x[0], frt, x[0]); } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x, Gecode::Reify r) { Gecode::rel(home, x[0], frt, x[0], r); } }; /// %Test for simple relation involving float variable and float constant class FloatFloat : public Test { protected: /// Float relation type to propagate Gecode::FloatRelType frt; /// Float constant Gecode::FloatVal c; public: /// Create and register test FloatFloat(Gecode::FloatRelType frt0, int n, Gecode::FloatNum c0, Gecode::FloatNum st) : Test("Rel::Float::Float::"+str(frt0)+"::"+str(n)+"::"+str(c0), n,-3,3,st,CPLT_ASSIGNMENT,n==1), frt(frt0), c(c0) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if (x.size() == 1) { return cmp(x[0],frt,c); } else { return cmp(x[0],frt,c) & cmp(x[1],frt,c); } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { using namespace Gecode; if (x.size() == 1) rel(home, x[0], frt, c); else rel(home, x, frt, c); } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x, Gecode::Reify r) { assert(x.size() == 1); Gecode::rel(home, x[0], frt, c, r); } }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { using namespace Gecode; Gecode::FloatNum step = 0.7; for (FloatRelTypes frts; frts(); ++frts) { (void) new FloatVarXY(frts.frt(),1,step); (void) new FloatVarXY(frts.frt(),2,step); (void) new FloatVarXX(frts.frt(),step); for (int c=-4; c<=4; c++) { (void) new FloatFloat(frts.frt(),1,c,step); (void) new FloatFloat(frts.frt(),2,c,step); } } } }; Create c; //@} } }} // STATISTICS: test-float gecode-4.2.1/test/float/transcendental.cpp0000644000175000010010000003612112104025427017656 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Vincent Barichard * * Copyright: * Christian Schulte, 2005 * Vincent Barichard, 2012 * * Last modified: * $Date: 2013-02-04 22:41:43 +0100 (Mon, 04 Feb 2013) $ by $Author: schulte $ * $Revision: 13264 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/float.hh" #include #ifdef GECODE_HAS_MPFR #include #include namespace Test { namespace Float { /// %Tests for transcendental constraints namespace Transcendental { /// %Test for exponent constraint class ExpXY : public Test { public: /// Create and register test ExpXY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Transcendental::Exp::XY::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(exp(x[0]), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (flip()) Gecode::exp(home, x[0], x[1]); else Gecode::rel(home, exp(x[0]) == x[1]); } }; /// %Test for exponent constraint where solution is ensured class ExpXYSol : public Test { public: /// Create and register test ExpXYSol(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Transcendental::Exp::XY::Sol::"+s,2,d,st,EXTEND_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(exp(x[0]), x[1]); } /// Extend assignment \a x virtual bool extendAssignement(Assignment& x) const { Gecode::FloatVal d = exp(x[0]); if (Gecode::Float::subset(d, dom)) { x.set(1, d); return true; } else { return false; } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::exp(home, x[0], x[1]); } }; /// %Test for exponent constraint with shared variables class ExpXX : public Test { public: /// Create and register test ExpXX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Transcendental::Exp::XX::"+s,1,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(exp(x[0]), x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::exp(home, x[0], x[0]); } }; /// %Test for logarithm constraint class LogXY : public Test { public: /// Create and register test LogXY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Transcendental::Log::XY::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if (x[0].max() < 0.0) return MT_FALSE; return eq(log(x[0]), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (flip()) Gecode::log(home, x[0], x[1]); else Gecode::rel(home, log(x[0]) == x[1]); } }; /// %Test for logarithm constraint where solution is ensured class LogXYSol : public Test { public: /// Create and register test LogXYSol(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Transcendental::Log::XY::Sol::"+s,2,d,st,EXTEND_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if (x[0].max() < 0.0) return MT_FALSE; return eq(log(x[0]), x[1]); } /// Extend assignment \a x virtual bool extendAssignement(Assignment& x) const { if (x[0].max() < 0.0) return false; Gecode::FloatVal d = log(x[0]); if (Gecode::Float::subset(d, dom)) { x.set(1, d); return true; } else { return false; } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::log(home, x[0], x[1]); } }; /// %Test for logarithm constraint with shared variables class LogXX : public Test { public: /// Create and register test LogXX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Transcendental::Log::XX::"+s,1,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if (x[0].max() < 0.0) return MT_FALSE; return eq(log(x[0]), x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::log(home, x[0], x[0]); } }; /// %Test for logarithm base n constraint class LogNXY : public Test { Gecode::FloatNum base; public: /// Create and register test LogNXY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum _base, Gecode::FloatNum st) : Test("Transcendental::Log::N::"+str(_base)+"::XY::"+s,2,d,st,CPLT_ASSIGNMENT,false), base(_base) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if ((x[0].max() <= 0.0) || (base <= 0.0)) return MT_FALSE; return eq(log(x[0]) / log(base), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::log(home, base, x[0], x[1]); } }; /// %Test for logarithm base n constraint where solution is ensured class LogNXYSol : public Test { Gecode::FloatNum base; public: /// Create and register test LogNXYSol(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum _base, Gecode::FloatNum st) : Test("Transcendental::Log::N::"+str(_base)+"::XY::Sol::"+s,2,d,st,EXTEND_ASSIGNMENT,false), base(_base) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if ((x[0].max() <= 0.0) || (base <= 0.0)) return MT_FALSE; return eq(log(x[0]) / log(base), x[1]); } /// Extend assignment \a x virtual bool extendAssignement(Assignment& x) const { if ((x[0].max() <= 0.0) || (base <= 0.0)) return false; Gecode::FloatVal d = log(x[0])/log(base); if (Gecode::Float::subset(d, dom)) { x.set(1, d); return true; } else { return false; } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::log(home, base, x[0], x[1]); } }; /// %Test for logarithm base n constraint with shared variables class LogNXX : public Test { Gecode::FloatNum base; public: /// Create and register test LogNXX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum _base, Gecode::FloatNum st) : Test("Transcendental::Log::N::"+str(_base)+"::XX::"+s,1,d,st,CPLT_ASSIGNMENT,false), base(_base) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if ((x[0].max() <= 0.0) || (base <= 0.0)) return MT_FALSE; return eq(log(x[0]) / log(base), x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::log(home, base, x[0], x[0]); } }; /// %Test for pow exponent n constraint class PowXY : public Test { Gecode::FloatNum base; public: /// Create and register test PowXY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum _base, Gecode::FloatNum st) : Test("Transcendental::Pow::N::"+str(_base)+"::XY::"+s,2,d,st,CPLT_ASSIGNMENT,false), base(_base) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if (base <= 0.0) return MT_FALSE; return eq(exp(x[0] * log(base)), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::pow(home, base, x[0], x[1]); } }; /// %Test for pow exponent n constraint where solution is ensured class PowXYSol : public Test { Gecode::FloatNum base; public: /// Create and register test PowXYSol(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum _base, Gecode::FloatNum st) : Test("Transcendental::Pow::N::"+str(_base)+"::XY::Sol::"+s,2,d,st,EXTEND_ASSIGNMENT,false), base(_base) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if (base <= 0.0) return MT_FALSE; return eq(exp(x[0] * log(base)), x[1]); } /// Extend assignment \a x virtual bool extendAssignement(Assignment& x) const { if (base <= 0.0) return false; Gecode::FloatVal d = exp(x[0]*log(base)); if (Gecode::Float::subset(d, dom)) { x.set(1, d); return true; } else { return false; } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::pow(home, base, x[0], x[1]); } }; /// %Test for pow exponent n constraint with shared variables class PowXX : public Test { Gecode::FloatNum base; public: /// Create and register test PowXX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum _base, Gecode::FloatNum st) : Test("Transcendental::Pow::N::"+str(_base)+"::XX::"+s,1,d,st,CPLT_ASSIGNMENT,false), base(_base) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if ((x[0].max() <= 0.0) || (base <= 0.0)) return MT_FALSE; return eq(exp(x[0] * log(base)), x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::pow(home, base, x[0], x[0]); } }; const Gecode::FloatNum step = 0.15; const Gecode::FloatNum step2 = 2*step; Gecode::FloatVal a(-8,5); Gecode::FloatVal b(9,12); Gecode::FloatVal c(-8,8); ExpXY exp_xy_a("A",a,step); ExpXY exp_xy_b("B",b,step); ExpXY exp_xy_c("C",c,step); ExpXYSol exp_xy_sol_a("A",a,step); ExpXYSol exp_xy_sol_b("B",b,step); ExpXYSol exp_xy_sol_c("C",c,step); ExpXX exp_xx_a("A",a,step); ExpXX exp_xx_b("B",b,step); ExpXX exp_xx_c("C",c,step); LogXY log_xy_a("A",a,step); LogXY log_xy_b("B",b,step); LogXY log_xy_c("C",c,step); LogXYSol log_xy_sol_a("A",a,step); LogXYSol log_xy_sol_b("B",b,step); LogXYSol log_xy_sol_c("C",c,step); LogXX log_xx_a("A",a,step); LogXX log_xx_b("B",b,step); LogXX log_xx_c("C",c,step); LogNXY logn_xy_a_1("A",a,-1.5,step); LogNXY logn_xy_b_1("B",b,-1.5,step); LogNXY logn_xy_c_1("C",c,-1.5,step); LogNXYSol logn_xy_sol_a_1("A",a,-1.5,step); LogNXYSol logn_xy_sol_b_1("B",b,-1.5,step); LogNXYSol logn_xy_sol_c_1("C",c,-1.5,step); LogNXX logn_xx_a_1("A",a,-1.5,step); LogNXX logn_xx_b_1("B",b,-1.5,step); LogNXX logn_xx_c_1("C",c,-1.5,step); LogNXY logn_xy_a_2("A",a,1.5,step); LogNXY logn_xy_b_2("B",b,1.5,step); LogNXY logn_xy_c_2("C",c,1.5,step); LogNXYSol logn_xy_sol_a_2("A",a,1.5,step); LogNXYSol logn_xy_sol_b_2("B",b,1.5,step); LogNXYSol logn_xy_sol_c_2("C",c,1.5,step); LogNXX logn_xx_a_2("A",a,1.5,step); LogNXX logn_xx_b_2("B",b,1.5,step); LogNXX logn_xx_c_2("C",c,1.5,step); LogNXY logn_xy_a_3("A",a,0,step); LogNXY logn_xy_b_3("B",b,0,step); LogNXY logn_xy_c_3("C",c,0,step); LogNXYSol logn_xy_sol_a_3("A",a,0,step); LogNXYSol logn_xy_sol_b_3("B",b,0,step); LogNXYSol logn_xy_sol_c_3("C",c,0,step); LogNXX logn_xx_a_3("A",a,0,step); LogNXX logn_xx_b_3("B",b,0,step); LogNXX logn_xx_c_3("C",c,0,step); PowXY pow_xy_a_1("A",a,-1.5,step); PowXY pow_xy_b_1("B",b,-1.5,step); PowXY pow_xy_c_1("C",c,-1.5,step); PowXYSol pow_xy_sol_a_1("A",a,-1.5,step); PowXYSol pow_xy_sol_b_1("B",b,-1.5,step); PowXYSol pow_xy_sol_c_1("C",c,-1.5,step); PowXX pow_xx_a_1("A",a,-1.5,step); PowXX pow_xx_b_1("B",b,-1.5,step); PowXX pow_xx_c_1("C",c,-1.5,step); PowXY pow_xy_a_2("A",a,1.5,step); PowXY pow_xy_b_2("B",b,1.5,step); PowXY pow_xy_c_2("C",c,1.5,step); PowXYSol pow_xy_sol_a_2("A",a,1.5,step); PowXYSol pow_xy_sol_b_2("B",b,1.5,step); PowXYSol pow_xy_sol_c_2("C",c,1.5,step); PowXX pow_xx_a_2("A",a,1.5,step); PowXX pow_xx_b_2("B",b,1.5,step); PowXX pow_xx_c_2("C",c,1.5,step); PowXY pow_xy_a_3("A",a,0,step); PowXY pow_xy_b_3("B",b,0,step); PowXY pow_xy_c_3("C",c,0,step); PowXYSol pow_xy_sol_a_3("A",a,0,step); PowXYSol pow_xy_sol_b_3("B",b,0,step); PowXYSol pow_xy_sol_c_3("C",c,0,step); PowXX pow_xx_a_3("A",a,0,step); PowXX pow_xx_b_3("B",b,0,step); PowXX pow_xx_c_3("C",c,0,step); //@} } }} #endif // STATISTICS: test-float gecode-4.2.1/test/float/trigonometric.cpp0000644000175000010010000004364112104025427017543 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Vincent Barichard * * Copyright: * Christian Schulte, 2005 * Vincent Barichard, 2012 * * Last modified: * $Date: 2013-02-04 22:41:43 +0100 (Mon, 04 Feb 2013) $ by $Author: schulte $ * $Revision: 13264 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/float.hh" #include #ifdef GECODE_HAS_MPFR #include #include namespace Test { namespace Float { /// %Tests for trigonometric constraints namespace Trigonometric { /// %Test for sinus constraint class SinXY : public Test { public: /// Create and register test SinXY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Trigonometric::Sin::XY::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(sin(x[0]), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (flip()) Gecode::sin(home, x[0], x[1]); else Gecode::rel(home, sin(x[0]) == x[1]); } }; /// %Test for sinus constraint where solution is ensured class SinXYSol : public Test { public: /// Create and register test SinXYSol(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Trigonometric::Sin::XY::Sol::"+s,2,d,st,EXTEND_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(sin(x[0]), x[1]); } /// Extend assignment \a x virtual bool extendAssignement(Assignment& x) const { Gecode::FloatVal d = sin(x[0]); if (Gecode::Float::subset(d, dom)) { x.set(1, d); return true; } else { return false; } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::sin(home, x[0], x[1]); } }; /// %Test for sinus constraint with shared variables class SinXX : public Test { public: /// Create and register test SinXX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Trigonometric::Sin::XX::"+s,1,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(sin(x[0]), x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::sin(home, x[0], x[0]); } }; /// %Test for cosinus constraint class CosXY : public Test { public: /// Create and register test CosXY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Trigonometric::Cos::XY::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(cos(x[0]), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (flip()) Gecode::cos(home, x[0], x[1]); else Gecode::rel(home, cos(x[0]) == x[1]); } }; /// %Test for cosinus constraint where solution is ensured class CosXYSol : public Test { public: /// Create and register test CosXYSol(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Trigonometric::Cos::XY::Sol::"+s,2,d,st,EXTEND_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(cos(x[0]), x[1]); } /// Extend assignment \a x virtual bool extendAssignement(Assignment& x) const { Gecode::FloatVal d = cos(x[0]); if (Gecode::Float::subset(d, dom)) { x.set(1, d); return true; } else { return false; } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::cos(home, x[0], x[1]); } }; /// %Test for cosinus constraint with shared variables class CosXX : public Test { public: /// Create and register test CosXX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Trigonometric::Cos::XX::"+s,1,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(cos(x[0]), x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::cos(home, x[0], x[0]); } }; /// %Test for tangent constraint class TanXY : public Test { public: /// Create and register test TanXY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Trigonometric::Tan::XY::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(tan(x[0]), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (flip()) Gecode::tan(home, x[0], x[1]); else Gecode::rel(home, tan(x[0]) == x[1]); } }; /// %Test for tangent constraint where solution is ensured class TanXYSol : public Test { public: /// Create and register test TanXYSol(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Trigonometric::Tan::XY::Sol::"+s,2,d,st,EXTEND_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(tan(x[0]), x[1]); } /// Extend assignment \a x virtual bool extendAssignement(Assignment& x) const { Gecode::FloatVal d = tan(x[0]); if (Gecode::Float::subset(d, dom)) { x.set(1, d); return true; } else { return false; } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::tan(home, x[0], x[1]); } }; /// %Test for tangent constraint with shared variables class TanXX : public Test { public: /// Create and register test TanXX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Trigonometric::Tan::XX::"+s,1,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(tan(x[0]), x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::tan(home, x[0], x[0]); } }; /// %Test for asinus constraint class ASinXY : public Test { public: /// Create and register test ASinXY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Trigonometric::ASin::XY::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if ((x[0].min() > 1.0) || (x[0].max() < -1.0)) return MT_FALSE; return eq(asin(x[0]), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (flip()) Gecode::asin(home, x[0], x[1]); else Gecode::rel(home, asin(x[0]) == x[1]); } }; /// %Test for asinus constraint where solution is ensured class ASinXYSol : public Test { public: /// Create and register test ASinXYSol(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Trigonometric::ASin::XY::Sol::"+s,2,d,st,EXTEND_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if ((x[0].min() > 1.0) || (x[0].max() < -1.0)) return MT_FALSE; return eq(asin(x[0]), x[1]); } /// Extend assignment \a x virtual bool extendAssignement(Assignment& x) const { if ((x[0].min() > 1.0) || (x[0].max() < -1.0)) return false; Gecode::FloatVal d = asin(x[0]); if (Gecode::Float::subset(d, dom)) { x.set(1, d); return true; } else { return false; } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::asin(home, x[0], x[1]); } }; /// %Test for asinus constraint with shared variables class ASinXX : public Test { public: /// Create and register test ASinXX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Trigonometric::ASin::XX::"+s,1,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if ((x[0].min() > 1.0) || (x[0].max() < -1.0)) return MT_FALSE; return eq(asin(x[0]), x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::asin(home, x[0], x[0]); } }; /// %Test for acosinus constraint class ACosXY : public Test { public: /// Create and register test ACosXY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Trigonometric::ACos::XY::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if ((x[0].min() > 1.0) || (x[0].max() < -1.0)) return MT_FALSE; return eq(acos(x[0]), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (flip()) Gecode::acos(home, x[0], x[1]); else Gecode::rel(home, acos(x[0]) == x[1]); } }; /// %Test for acosinus constraint where solution is ensured class ACosXYSol : public Test { public: /// Create and register test ACosXYSol(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Trigonometric::ACos::XY::Sol::"+s,2,d,st,EXTEND_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if ((x[0].min() > 1.0) || (x[0].max() < -1.0)) return MT_FALSE; return eq(acos(x[0]), x[1]); } /// Extend assignment \a x virtual bool extendAssignement(Assignment& x) const { if ((x[0].min() > 1.0) || (x[0].max() < -1.0)) return false; Gecode::FloatVal d = acos(x[0]); if (Gecode::Float::subset(d, dom)) { x.set(1, d); return true; } else { return false; } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::acos(home, x[0], x[1]); } }; /// %Test for acosinus constraint with shared variables class ACosXX : public Test { public: /// Create and register test ACosXX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Trigonometric::ACos::XX::"+s,1,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { if ((x[0].min() > 1.0) || (x[0].max() < -1.0)) return MT_FALSE; return eq(acos(x[0]), x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::acos(home, x[0], x[0]); } }; /// %Test for atangent constraint class ATanXY : public Test { public: /// Create and register test ATanXY(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Trigonometric::ATan::XY::"+s,2,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(atan(x[0]), x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { if (flip()) Gecode::atan(home, x[0], x[1]); else Gecode::rel(home, atan(x[0]) == x[1]); } }; /// %Test for atangent constraint where solution is ensured class ATanXYSol : public Test { public: /// Create and register test ATanXYSol(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Trigonometric::ATan::XY::Sol::"+s,2,d,st,EXTEND_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(atan(x[0]), x[1]); } /// Extend assignment \a x virtual bool extendAssignement(Assignment& x) const { Gecode::FloatVal d = atan(x[0]); if (Gecode::Float::subset(d, dom)) { x.set(1, d); return true; } else { return false; } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::atan(home, x[0], x[1]); } }; /// %Test for atangent constraint with shared variables class ATanXX : public Test { public: /// Create and register test ATanXX(const std::string& s, const Gecode::FloatVal& d, Gecode::FloatNum st) : Test("Trigonometric::ATan::XX::"+s,1,d,st,CPLT_ASSIGNMENT,false) {} /// %Test whether \a x is solution virtual MaybeType solution(const Assignment& x) const { return eq(atan(x[0]), x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) { Gecode::atan(home, x[0], x[0]); } }; const Gecode::FloatNum step = 0.15; const Gecode::FloatNum step2 = 2*step; Gecode::FloatVal a(-8,5); Gecode::FloatVal b(9,12); Gecode::FloatVal c(-8,8); SinXY sin_xy_a("A",a,step); SinXY sin_xy_b("B",b,step); SinXY sin_xy_c("C",c,step); SinXYSol sin_xy_sol_a("A",a,step); SinXYSol sin_xy_sol_b("B",b,step); SinXYSol sin_xy_sol_c("C",c,step); SinXX sin_xx_a("A",a,step); SinXX sin_xx_b("B",b,step); SinXX sin_xx_c("C",c,step); CosXY cos_xy_a("A",a,step); CosXY cos_xy_b("B",b,step); CosXY cos_xy_c("C",c,step); CosXYSol cos_xy_sol_a("A",a,step); CosXYSol cos_xy_sol_b("B",b,step); CosXYSol cos_xy_sol_c("C",c,step); CosXX cos_xx_a("A",a,step); CosXX cos_xx_b("B",b,step); CosXX cos_xx_c("C",c,step); TanXY tan_xy_a("A",a,step); TanXY tan_xy_b("B",b,step); TanXY tan_xy_c("C",c,step); TanXYSol tan_xy_sol_a("A",a,step); TanXYSol tan_xy_sol_b("B",b,step); TanXYSol tan_xy_sol_c("C",c,step); TanXX tan_xx_a("A",a,step); TanXX tan_xx_b("B",b,step); TanXX tan_xx_c("C",c,step); ASinXY asin_xy_a("A",a,step); ASinXY asin_xy_b("B",b,step); ASinXY asin_xy_c("C",c,step); ASinXYSol asin_xy_sol_a("A",a,step); ASinXYSol asin_xy_sol_b("B",b,step); ASinXYSol asin_xy_sol_c("C",c,step); ASinXX asin_xx_a("A",a,step); ASinXX asin_xx_b("B",b,step); ASinXX asin_xx_c("C",c,step); ACosXY acos_xy_a("A",a,step); ACosXY acos_xy_b("B",b,step); ACosXY acos_xy_c("C",c,step); ACosXYSol acos_xy_sol_a("A",a,step); ACosXYSol acos_xy_sol_b("B",b,step); ACosXYSol acos_xy_sol_c("C",c,step); ACosXX acos_xx_a("A",a,step); ACosXX acos_xx_b("B",b,step); ACosXX acos_xx_c("C",c,step); ATanXY atan_xy_a("A",a,step); ATanXY atan_xy_b("B",b,step); ATanXY atan_xy_c("C",c,step); ATanXYSol atan_xy_sol_a("A",a,step); ATanXYSol atan_xy_sol_b("B",b,step); ATanXYSol atan_xy_sol_c("C",c,step); ATanXX atan_xx_a("A",a,step); ATanXX atan_xx_b("B",b,step); ATanXX atan_xx_c("C",c,step); //@} } }} #endif // STATISTICS: test-float gecode-4.2.1/test/float.cpp0000644000175000010010000006475212115372736014676 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Mikael Lagerkvist * Vincent Barichard * * Copyright: * Christian Schulte, 2005 * Mikael Lagerkvist, 2005 * Vincent Barichard, 2012 * * Last modified: * $Date: 2013-03-05 14:40:46 +0100 (Tue, 05 Mar 2013) $ by $Author: schulte $ * $Revision: 13435 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/float.hh" #include namespace Test { namespace Float { /* * Complete assignments * */ void CpltAssignment::operator++(void) { using namespace Gecode; int i = n-1; while (true) { FloatNum ns = dsv[i].min() + step; dsv[i] = FloatVal(ns,nextafter(ns,ns+1)); if ((dsv[i].max() < d.max()) || (i == 0)) return; dsv[i--] = FloatVal(d.min(),nextafter(d.min(),d.max())); } } /* * Extended assignments * */ void ExtAssignment::operator++(void) { using namespace Gecode; assert(n > 1); int i = n-2; while (true) { FloatNum ns = dsv[i].min() + step; dsv[i] = FloatVal(ns,nextafter(ns,ns+1)); if ((dsv[i].max() < d.max()) || (i == 0)) { if (curPb->extendAssignement(*this)) return; if ((dsv[i].max() >= d.max()) && (i == 0)) return; continue; } dsv[i--] = FloatVal(d.min(),nextafter(d.min(),d.max())); } } /* * Random assignments * */ void RandomAssignment::operator++(void) { for (int i = n; i--; ) vals[i]=randval(); a--; } }} std::ostream& operator<<(std::ostream& os, const Test::Float::Assignment& a) { int n = a.size(); os << "{"; for (int i=0; i(Int::Limits::max)), static_cast(Int::Limits::max) ), r.sub_down(u,l) ) ); } Gecode::FloatNum randFValUp(Gecode::FloatNum l, Gecode::FloatNum u) { using namespace Gecode; using namespace Gecode::Float; Rounding r; return r.sub_up( u, r.mul_down( r.div_down( Base::rand(static_cast(Int::Limits::max)), static_cast(Int::Limits::max) ), r.sub_down(u,l) ) ); } TestSpace::TestSpace(int n, Gecode::FloatVal& d0, Gecode::FloatNum s, Test* t) : d(d0), step(s), x(*this,n,Gecode::Float::Limits::min,Gecode::Float::Limits::max), test(t), reified(false) { Gecode::FloatVarArgs _x(*this,n,d.min(),d.max()); if (x.size() == 1) Gecode::dom(*this,x[0],_x[0]); else Gecode::dom(*this,x,_x); Gecode::BoolVar b(*this,0,1); r = Gecode::Reify(b,Gecode::RM_EQV); if (opt.log) olog << ind(2) << "Initial: x[]=" << x << std::endl; } TestSpace::TestSpace(int n, Gecode::FloatVal& d0, Gecode::FloatNum s, Test* t, Gecode::ReifyMode rm) : d(d0), step(s), x(*this,n,d.min(),d.max()), test(t), reified(true) { Gecode::BoolVar b(*this,0,1); r = Gecode::Reify(b,rm); if (opt.log) olog << ind(2) << "Initial: x[]=" << x << " b=" << r.var() << std::endl; } TestSpace::TestSpace(bool share, TestSpace& s) : Gecode::Space(share,s), d(s.d), step(s.step), test(s.test), reified(s.reified) { x.update(*this, share, s.x); Gecode::BoolVar b; Gecode::BoolVar sr(s.r.var()); b.update(*this, share, sr); r.var(b); r.mode(s.r.mode()); } Gecode::Space* TestSpace::copy(bool share) { return new TestSpace(share,*this); } void TestSpace::dropUntil(const Assignment& a) { for (int i = x.size(); i--; ) Gecode::rel(*this, x[i], Gecode::FRT_GQ, a[i].min()); } bool TestSpace::assigned(void) const { for (int i=x.size(); i--; ) if (!x[i].assigned()) return false; return true; } bool TestSpace::matchAssignment(const Assignment& a) const { for (int i=x.size(); i--; ) if ((x[i].min() != a[i].min()) || (x[i].max() != a[i].max())) return false; return true; } void TestSpace::post(void) { if (reified){ test->post(*this,x,r); if (opt.log) olog << ind(3) << "Posting reified propagator" << std::endl; } else { test->post(*this,x); if (opt.log) olog << ind(3) << "Posting propagator" << std::endl; } } bool TestSpace::failed(void) { if (opt.log) { olog << ind(3) << "Fixpoint: " << x; bool f=(status() == Gecode::SS_FAILED); olog << std::endl << ind(3) << " --> " << x << std::endl; return f; } else { return status() == Gecode::SS_FAILED; } } void TestSpace::rel(int i, Gecode::FloatRelType frt, Gecode::FloatVal n) { if (opt.log) { olog << ind(4) << "x[" << i << "] "; switch (frt) { case Gecode::FRT_EQ: olog << "="; break; case Gecode::FRT_NQ: olog << "!="; break; case Gecode::FRT_LQ: olog << "<="; break; case Gecode::FRT_LE: olog << "<"; break; case Gecode::FRT_GQ: olog << ">="; break; case Gecode::FRT_GR: olog << ">"; break; } olog << " [" << n.min() << "," << n.max() << "]" << std::endl; } Gecode::rel(*this, x[i], frt, n); } void TestSpace::rel(bool sol) { int n = sol ? 1 : 0; assert(reified); if (opt.log) olog << ind(4) << "b = " << n << std::endl; Gecode::rel(*this, r.var(), Gecode::IRT_EQ, n); } void TestSpace::assign(const Assignment& a, MaybeType& sol, bool skip) { using namespace Gecode; int i = skip ? static_cast(Base::rand(a.size())) : -1; for (int j=a.size(); j--; ) if (i != j) { if ((x[j].min() == a[j].max()) || (x[j].max() == a[j].min())) { sol = MT_MAYBE; return; } rel(j, FRT_EQ, a[j]); if (Base::fixpoint() && failed()) return; } } void TestSpace::bound(void) { using namespace Gecode; // Select variable to be assigned int i = Base::rand(x.size()); while (x[i].assigned()) { i = (i+1) % x.size(); } bool min = Base::rand(2); if (min) rel(i, FRT_LQ, nextafter(x[i].min(), x[i].max())); else rel(i, FRT_GQ, nextafter(x[i].max(), x[i].min())); } Gecode::FloatNum TestSpace::cut(int* cutDirections) { using namespace Gecode; using namespace Gecode::Float; // Select variable to be cut int i = 0; while (x[i].assigned()) i++; for (int j=x.size(); j--; ) { if (!x[j].assigned() && (x[j].size() > x[i].size())) i = j; } Rounding r; if (cutDirections[i]) { FloatNum m = r.div_up(r.add_up(x[i].min(),x[i].max()),2); FloatNum n = nextafter(x[i].min(), x[i].max()); if (m > n) rel(i, FRT_LQ, m); else rel(i, FRT_LQ, n); } else { FloatNum m = r.div_down(r.add_down(x[i].min(),x[i].max()),2); FloatNum n = nextafter(x[i].max(), x[i].min()); if (m < n) rel(i, FRT_GQ, m); else rel(i, FRT_GQ, n); } return x[i].size(); } void TestSpace::prune(int i) { using namespace Gecode; // Prune values if (Base::rand(2) && !x[i].assigned()) { Gecode::FloatNum v=randFValUp(x[i].min(),x[i].max()); assert((v >= x[i].min()) && (v <= x[i].max())); rel(i, Gecode::FRT_LQ, v); } if (Base::rand(2) && !x[i].assigned()) { Gecode::FloatNum v=randFValDown(x[i].min(),x[i].max()); assert((v <= x[i].max()) && (v >= x[i].min())); rel(i, Gecode::FRT_GQ, v); } } void TestSpace::prune(void) { using namespace Gecode; // Select variable to be pruned int i = Base::rand(x.size()); while (x[i].assigned()) { i = (i+1) % x.size(); } prune(i); } bool TestSpace::prune(const Assignment& a, bool testfix) { // Select variable to be pruned int i = Base::rand(x.size()); while (x[i].assigned()) i = (i+1) % x.size(); // Select mode for pruning switch (Base::rand(2)) { case 0: if (a[i].max() < x[i].max()) { Gecode::FloatNum v=randFValDown(a[i].max(),x[i].max()); assert((v >= a[i].max()) && (v <= x[i].max())); rel(i, Gecode::FRT_LQ, v); } break; case 1: if (a[i].min() > x[i].min()) { Gecode::FloatNum v=randFValUp(x[i].min(),a[i].min()); assert((v <= a[i].min()) && (v >= x[i].min())); rel(i, Gecode::FRT_GQ, v); } break; } if (Base::fixpoint()) { if (failed() || !testfix) return true; TestSpace* c = static_cast(clone()); if (opt.log) olog << ind(3) << "Testing fixpoint on copy" << std::endl; c->post(); if (c->failed()) { delete c; return false; } for (int i=x.size(); i--; ) if (x[i].size() != c->x[i].size()) { delete c; return false; } if (reified && (r.var().size() != c->r.var().size())) { delete c; return false; } if (opt.log) olog << ind(3) << "Finished testing fixpoint on copy" << std::endl; delete c; } return true; } const Gecode::FloatRelType FloatRelTypes::frts[] = {Gecode::FRT_EQ,Gecode::FRT_NQ,Gecode::FRT_LQ,Gecode::FRT_LE, Gecode::FRT_GQ,Gecode::FRT_GR}; Assignment* Test::assignment(void) const { switch (assigmentType) { case CPLT_ASSIGNMENT: return new CpltAssignment(arity,dom,step); case RANDOM_ASSIGNMENT: return new RandomAssignment(arity,dom,step); case EXTEND_ASSIGNMENT: return new ExtAssignment(arity,dom,step,this); default : GECODE_NEVER; } return NULL; // Avoid compiler warnings } bool Test::extendAssignement(Assignment&) const { GECODE_NEVER; return false; } bool Test::subsumed(const TestSpace& ts) const { if (!testsubsumed) return true; if (ts.propagators()==0) return true; if (assigmentType == EXTEND_ASSIGNMENT) return true; return false; } /// Check the test result and handle failed test #define CHECK_TEST(T,M) \ if (opt.log) \ olog << ind(3) << "Check: " << (M) << std::endl; \ if (!(T)) { \ problem = (M); delete s; goto failed; \ } /// Start new test #define START_TEST(T) \ if (opt.log) { \ olog.str(""); \ olog << ind(2) << "Testing: " << (T) << std::endl; \ } \ test = (T); bool Test::ignore(const Assignment&) const { return false; } void Test::post(Gecode::Space&, Gecode::FloatVarArray&, Gecode::Reify) {} bool Test::run(void) { using namespace Gecode; const char* test = "NONE"; const char* problem = "NONE"; // Set up assignments Assignment* ap = assignment(); Assignment& a = *ap; // Set up space for all solution search TestSpace* search_s = new TestSpace(arity,dom,step,this); post(*search_s,search_s->x); branch(*search_s,search_s->x,FLOAT_VAR_NONE(),FLOAT_VAL_SPLIT_MIN()); Search::Options search_o; search_o.threads = 1; DFS * e_s = new DFS(search_s,search_o); while (a()) { MaybeType sol = solution(a); if (opt.log) { olog << ind(1) << "Assignment: " << a; switch (sol) { case MT_TRUE: olog << " (solution)"; break; case MT_FALSE: olog << " (no solution)"; break; case MT_MAYBE: olog << " (maybe)"; break; } olog << std::endl; } START_TEST("Assignment (after posting)"); { TestSpace* s = new TestSpace(arity,dom,step,this); TestSpace* sc = NULL; s->post(); switch (Base::rand(3)) { case 0: if (opt.log) olog << ind(3) << "No copy" << std::endl; sc = s; s = NULL; break; case 1: if (opt.log) olog << ind(3) << "Unshared copy" << std::endl; if (s->status() != SS_FAILED) { sc = static_cast(s->clone(false)); } else { sc = s; s = NULL; } break; case 2: if (opt.log) olog << ind(3) << "Shared copy" << std::endl; if (s->status() != SS_FAILED) { sc = static_cast(s->clone(true)); } else { sc = s; s = NULL; } break; default: assert(false); } sc->assign(a,sol); if (sol == MT_TRUE) { CHECK_TEST(!sc->failed(), "Failed on solution"); CHECK_TEST(subsumed(*sc), "No subsumption"); } else if (sol == MT_FALSE) { CHECK_TEST(sc->failed(), "Solved on non-solution"); } delete s; delete sc; } START_TEST("Partial assignment (after posting)"); { TestSpace* s = new TestSpace(arity,dom,step,this); s->post(); s->assign(a,sol,true); (void) s->failed(); s->assign(a,sol); if (sol == MT_TRUE) { CHECK_TEST(!s->failed(), "Failed on solution"); CHECK_TEST(subsumed(*s), "No subsumption"); } else if (sol == MT_FALSE) { CHECK_TEST(s->failed(), "Solved on non-solution"); } delete s; } START_TEST("Assignment (before posting)"); { TestSpace* s = new TestSpace(arity,dom,step,this); s->assign(a,sol); s->post(); if (sol == MT_TRUE) { CHECK_TEST(!s->failed(), "Failed on solution"); CHECK_TEST(subsumed(*s), "No subsumption"); } else if (sol == MT_FALSE) { CHECK_TEST(s->failed(), "Solved on non-solution"); } delete s; } START_TEST("Partial assignment (before posting)"); { TestSpace* s = new TestSpace(arity,dom,step,this); s->assign(a,sol,true); s->post(); (void) s->failed(); s->assign(a,sol); if (sol == MT_TRUE) { CHECK_TEST(!s->failed(), "Failed on solution"); CHECK_TEST(subsumed(*s), "No subsumption"); } else if (sol == MT_FALSE) { CHECK_TEST(s->failed(), "Solved on non-solution"); } delete s; } START_TEST("Prune"); { TestSpace* s = new TestSpace(arity,dom,step,this); s->post(); while (!s->failed() && !s->assigned() && !s->matchAssignment(a)) if (!s->prune(a,testfix)) { problem = "No fixpoint"; delete s; goto failed; } s->assign(a,sol); if (sol == MT_TRUE) { CHECK_TEST(!s->failed(), "Failed on solution"); CHECK_TEST(subsumed(*s), "No subsumption"); } else if (sol == MT_FALSE) { CHECK_TEST(s->failed(), "Solved on non-solution"); } delete s; } if (reified && !ignore(a) && (sol != MT_MAYBE)) { if (eqv()) { START_TEST("Assignment reified (rewrite after post, <=>)"); TestSpace* s = new TestSpace(arity,dom,step,this,RM_EQV); s->post(); s->rel(sol == MT_TRUE); s->assign(a,sol); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(subsumed(*s), "No subsumption"); delete s; } if (imp()) { START_TEST("Assignment reified (rewrite after post, =>)"); TestSpace* s = new TestSpace(arity,dom,step,this,RM_IMP); s->post(); s->rel(sol == MT_TRUE); s->assign(a,sol); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(subsumed(*s), "No subsumption"); delete s; } if (pmi()) { START_TEST("Assignment reified (rewrite after post, <=)"); TestSpace* s = new TestSpace(arity,dom,step,this,RM_PMI); s->post(); s->rel(sol == MT_TRUE); s->assign(a,sol); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(subsumed(*s), "No subsumption"); delete s; } if (eqv()) { START_TEST("Assignment reified (immediate rewrite, <=>)"); TestSpace* s = new TestSpace(arity,dom,step,this,RM_EQV); s->rel(sol == MT_TRUE); s->post(); s->assign(a,sol); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(subsumed(*s), "No subsumption"); delete s; } if (imp()) { START_TEST("Assignment reified (immediate rewrite, =>)"); TestSpace* s = new TestSpace(arity,dom,step,this,RM_IMP); s->rel(sol == MT_TRUE); s->post(); s->assign(a,sol); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(subsumed(*s), "No subsumption"); delete s; } if (pmi()) { START_TEST("Assignment reified (immediate rewrite, <=)"); TestSpace* s = new TestSpace(arity,dom,step,this,RM_PMI); s->rel(sol == MT_TRUE); s->post(); s->assign(a,sol); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(subsumed(*s), "No subsumption"); delete s; } if (eqv()) { START_TEST("Assignment reified (before posting, <=>)"); TestSpace* s = new TestSpace(arity,dom,step,this,RM_EQV); s->assign(a,sol); s->post(); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(subsumed(*s), "No subsumption"); if (s->r.var().assigned()) { if (sol == MT_TRUE) { CHECK_TEST(s->r.var().val()==1, "Zero on solution"); } else if (sol == MT_FALSE) { CHECK_TEST(s->r.var().val()==0, "One on non-solution"); } } delete s; } if (imp()) { START_TEST("Assignment reified (before posting, =>)"); TestSpace* s = new TestSpace(arity,dom,step,this,RM_IMP); s->assign(a,sol); s->post(); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(subsumed(*s), "No subsumption"); if (sol == MT_TRUE) { CHECK_TEST(!s->r.var().assigned(), "Control variable assigned"); } else if ((sol = MT_FALSE) && s->r.var().assigned()) { CHECK_TEST(s->r.var().val()==0, "One on non-solution"); } delete s; } if (pmi()) { START_TEST("Assignment reified (before posting, <=)"); TestSpace* s = new TestSpace(arity,dom,step,this,RM_PMI); s->assign(a,sol); s->post(); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(subsumed(*s), "No subsumption"); if (sol == MT_TRUE) { if (s->r.var().assigned()) { CHECK_TEST(s->r.var().val()==1, "Zero on solution"); } } else if (sol == MT_FALSE) { CHECK_TEST(!s->r.var().assigned(), "Control variable assigned"); } delete s; } if (eqv()) { START_TEST("Assignment reified (after posting, <=>)"); TestSpace* s = new TestSpace(arity,dom,step,this,RM_EQV); s->post(); s->assign(a,sol); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(subsumed(*s), "No subsumption"); if (s->r.var().assigned()) { if (sol == MT_TRUE) { CHECK_TEST(s->r.var().val()==1, "Zero on solution"); } else if (sol == MT_FALSE) { CHECK_TEST(s->r.var().val()==0, "One on non-solution"); } } delete s; } if (imp()) { START_TEST("Assignment reified (after posting, =>)"); TestSpace* s = new TestSpace(arity,dom,step,this,RM_IMP); s->post(); s->assign(a,sol); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(subsumed(*s), "No subsumption"); if (sol == MT_TRUE) { CHECK_TEST(!s->r.var().assigned(), "Control variable assigned"); } else if (s->r.var().assigned()) { CHECK_TEST(s->r.var().val()==0, "One on non-solution"); } delete s; } if (pmi()) { START_TEST("Assignment reified (after posting, <=)"); TestSpace* s = new TestSpace(arity,dom,step,this,RM_PMI); s->post(); s->assign(a,sol); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(subsumed(*s), "No subsumption"); if (sol == MT_TRUE) { if (s->r.var().assigned()) { CHECK_TEST(s->r.var().val()==1, "Zero on solution"); } } else if (sol == MT_FALSE) { CHECK_TEST(!s->r.var().assigned(), "Control variable assigned"); } delete s; } if (eqv()) { START_TEST("Prune reified, <=>"); TestSpace* s = new TestSpace(arity,dom,step,this,RM_EQV); s->post(); while (!s->failed() && !s->matchAssignment(a) && (!s->assigned() || !s->r.var().assigned())) if (!s->prune(a,testfix)) { problem = "No fixpoint"; delete s; goto failed; } CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(subsumed(*s), "No subsumption"); if (s->r.var().assigned()) { if (sol == MT_TRUE) { CHECK_TEST(s->r.var().val()==1, "Zero on solution"); } else if (sol == MT_FALSE) { CHECK_TEST(s->r.var().val()==0, "One on non-solution"); } } delete s; } if (imp()) { START_TEST("Prune reified, =>"); TestSpace* s = new TestSpace(arity,dom,step,this,RM_IMP); s->post(); while (!s->failed() && !s->matchAssignment(a) && (!s->assigned() || ((sol == MT_FALSE) && !s->r.var().assigned()))) if (!s->prune(a,testfix)) { problem = "No fixpoint"; delete s; goto failed; } CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(subsumed(*s), "No subsumption"); if (sol == MT_TRUE) { CHECK_TEST(!s->r.var().assigned(), "Control variable assigned"); } else if ((sol == MT_FALSE) && s->r.var().assigned()) { CHECK_TEST(s->r.var().val()==0, "One on non-solution"); } delete s; } if (pmi()) { START_TEST("Prune reified, <="); TestSpace* s = new TestSpace(arity,dom,step,this,RM_PMI); s->post(); while (!s->failed() && !s->matchAssignment(a) && (!s->assigned() || ((sol == MT_TRUE) && !s->r.var().assigned()))) if (!s->prune(a,testfix)) { problem = "No fixpoint"; delete s; goto failed; } CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(subsumed(*s), "No subsumption"); if ((sol == MT_TRUE) && s->r.var().assigned()) { CHECK_TEST(s->r.var().val()==1, "Zero on solution"); } else if (sol == MT_FALSE) { CHECK_TEST(!s->r.var().assigned(), "Control variable assigned"); } delete s; } } if (testsearch) { if (sol == MT_TRUE) { START_TEST("Search"); if (!search_s->failed()) { TestSpace* ss = static_cast(search_s->clone(false)); ss->dropUntil(a); delete e_s; e_s = new DFS(ss,search_o); delete ss; } TestSpace* s = e_s->next(); CHECK_TEST(s != NULL, "Solutions exhausted"); CHECK_TEST(subsumed(*s), "No subsumption"); for (int i=a.size(); i--; ) { CHECK_TEST(s->x[i].assigned(), "Unassigned variable"); CHECK_TEST(Gecode::Float::overlap(a[i], s->x[i].val()), "Wrong value in solution"); } delete s; } } ++a; } if (testsearch) { test = "Search"; if (!search_s->failed()) { TestSpace* ss = static_cast(search_s->clone(false)); ss->dropUntil(a); delete e_s; e_s = new DFS(ss,search_o); delete ss; } if (e_s->next() != NULL) { problem = "Excess solutions"; goto failed; } } delete ap; delete search_s; delete e_s; return true; failed: if (opt.log) olog << "FAILURE" << std::endl << ind(1) << "Test: " << test << std::endl << ind(1) << "Problem: " << problem << std::endl; if (a() && opt.log) olog << ind(1) << "Assignment: " << a << std::endl; delete ap; delete search_s; delete e_s; return false; } }} #undef START_TEST #undef CHECK_TEST // STATISTICS: test-float gecode-4.2.1/test/float.hh0000644000175000010010000003224712104025427014473 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Mikael Lagerkvist * Vincent Barichard * * Copyright: * Christian Schulte, 2005 * Mikael Lagerkvist, 2006 * Vincent Barichard, 2012 * * Last modified: * $Date: 2013-02-04 22:41:43 +0100 (Mon, 04 Feb 2013) $ by $Author: schulte $ * $Revision: 13264 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef __GECODE_TEST_FLOAT_HH__ #define __GECODE_TEST_FLOAT_HH__ #include "test/test.hh" #include namespace Test { /// Testing domain floats namespace Float { /// Type for comparisons and solutions enum MaybeType { MT_FALSE = 0, //< Does hold MT_TRUE, //< Does not hold MT_MAYBE //< Might or might not hold }; /// Three-valued conjunction of MaybeType MaybeType operator &(MaybeType a, MaybeType b); /// Assignment possible types enum AssignmentType { CPLT_ASSIGNMENT = 0, RANDOM_ASSIGNMENT, EXTEND_ASSIGNMENT }; class Test; /** * \defgroup TaskTestFloat Testing domain floats * \ingroup TaskTest */ /** * \defgroup TaskTestFloatFloat General test support * \ingroup TaskTestFloat */ //@{ /// %Base class for assignments class Assignment { protected: int n; ///< Number of variables Gecode::FloatVal d; ///< Domain for each variable public: /// Initialize assignments for \a n0 variables and values \a d0 Assignment(int n0, const Gecode::FloatVal& d0); /// Test whether all assignments have been iterated virtual bool operator()(void) const = 0; /// Move to next assignment virtual void operator++(void) = 0; /// Return value for variable \a i virtual Gecode::FloatVal operator[](int i) const = 0; /// Set assignment to value \a val for variable \a i virtual void set(int i, const Gecode::FloatVal& val) = 0; /// Return number of variables int size(void) const; /// Destructor virtual ~Assignment(void); }; /// Generate all assignments class CpltAssignment : public Assignment { protected: Gecode::FloatVal* dsv; ///< Iterator for each variable Gecode::FloatNum step; ///< Step for next assignment public: /// Initialize assignments for \a n variables and values \a d with step \a s CpltAssignment(int n, const Gecode::FloatVal& d, Gecode::FloatNum s); /// Test whether all assignments have been iterated virtual bool operator()(void) const; /// Move to next assignment virtual void operator++(void); /// Return value for variable \a i virtual Gecode::FloatVal operator[](int i) const; /// Set assignment to value \a val for variable \a i virtual void set(int i, const Gecode::FloatVal& val); /// Destructor virtual ~CpltAssignment(void); }; /// Generate all assignments except the last variable and complete it to get a solution class ExtAssignment : public Assignment { protected: const Test* curPb; ///< Current problem used to complete assignment Gecode::FloatVal* dsv; ///< Iterator for each variable Gecode::FloatNum step; ///< Step for next assignment public: /// Initialize assignments for \a n variables and values \a d with step \a s ExtAssignment(int n, const Gecode::FloatVal& d, Gecode::FloatNum s, const Test * pb); /// Test whether all assignments have been iterated virtual bool operator()(void) const; /// Move to next assignment virtual void operator++(void); /// Return value for variable \a i virtual Gecode::FloatVal operator[](int i) const; /// Set assignment to value \a val for variable \a i virtual void set(int i, const Gecode::FloatVal& val); /// Destructor virtual ~ExtAssignment(void); }; /// Generate random selection of assignments class RandomAssignment : public Assignment { protected: Gecode::FloatVal* vals; ///< The current values for the variables int a; ///< How many assigments still to be generated /// Generate new value according to domain Gecode::FloatNum randval(void); public: /// Initialize for \a a assignments for \a n variables and values \a d RandomAssignment(int n, const Gecode::FloatVal& d, int a); /// Test whether all assignments have been iterated virtual bool operator()(void) const; /// Move to next assignment virtual void operator++(void); /// Return value for variable \a i virtual Gecode::FloatVal operator[](int i) const; /// Set assignment to value \a val for variable \a i virtual void set(int i, const Gecode::FloatVal& val); /// Destructor virtual ~RandomAssignment(void); }; /// Space for executing tests class TestSpace : public Gecode::Space { public: /// Initial domain Gecode::FloatVal d; /// Step for going to next solution Gecode::FloatNum step; /// Variables to be tested Gecode::FloatVarArray x; /// Reification information Gecode::Reify r; /// The test currently run Test* test; /// Whether the test is for a reified propagator bool reified; /** * \brief Create test space * * Creates \a n variables with domain \a d and step \a s for * test \a t. * */ TestSpace(int n, Gecode::FloatVal& d, Gecode::FloatNum s, Test* t); /** * \brief Create test space * * Creates \a n variables with domain \a d and step \a s for * test \a t annd reification mode \a rm. * */ TestSpace(int n, Gecode::FloatVal& d, Gecode::FloatNum s, Test* t, Gecode::ReifyMode rm); /// Constructor for cloning \a s TestSpace(bool share, TestSpace& s); /// Copy space during cloning virtual Gecode::Space* copy(bool share); /// Add constraints to skip solutions to the \a a assignment virtual void dropUntil(const Assignment& a); /// Test whether all variables are assigned bool assigned(void) const; /// Test whether all variables match assignment \a a bool matchAssignment(const Assignment& a) const; /// Post propagator void post(void); /// Compute a fixpoint and check for failure bool failed(void); /// Perform integer tell operation on \a x[i] void rel(int i, Gecode::FloatRelType frt, Gecode::FloatVal n); /// Perform Boolean tell on \a b void rel(bool sol); /// Assign all (or all but one, if \a skip is true) variables to values in \a a /// If assignment of a variable is MT_MAYBE (if the two intervals are contiguous), /// \a sol is set to MT_MAYBE void assign(const Assignment& a, MaybeType& sol, bool skip=false); /// Assing a random variable to a random bound void bound(void); /// Cut the bigger variable to an half sized interval. It returns /// the new size of the cut interval. \a cutDirections gives the direction /// to follow (upper part or lower part of the interval). Gecode::FloatNum cut(int* cutDirections); /// Prune some random values from variable \a i void prune(int i); /// Prune some random values for some random variable void prune(void); /// Prune values but not those in assignment \a a bool prune(const Assignment& a, bool testfix); }; /** * \brief %Base class for tests with float constraints * */ class Test : public Base { protected: /// Number of variables int arity; /// Domain of variables Gecode::FloatVal dom; /// Step for going to next solution Gecode::FloatNum step; /// Gives the type of assignment to use AssignmentType assigmentType; /// Does the constraint also exist as reified constraint bool reified; /// Which reification modes are supported int rms; /// Whether to perform search test bool testsearch; /// Whether to perform fixpoint test bool testfix; /// Whether to test for subsumption bool testsubsumed; /// \name Test for reification modes //@{ /// Test whether equivalence as reification mode is supported bool eqv(void) const; /// Test whether implication as reification mode is supported bool imp(void) const; /// Test whether reverse implication as reification mode is supported bool pmi(void) const; //@} public: /** * \brief Constructor * * Constructs a test with name \a s and arity \a a and variable * domain \a d and step \a st and assignment type \a at. Also * tests for a reified constraint, if \a r is true. */ Test(const std::string& s, int a, const Gecode::FloatVal& d, Gecode::FloatNum st, AssignmentType at, bool r); /** * \brief Constructor * * Constructs a test with name \a s and arity \a a and variable * domain \a min ... \a max and step \a st and assignment type \a at. Also * tests for a reified constraint, if \a r is true. */ Test(const std::string& s, int a, Gecode::FloatNum min, Gecode::FloatNum max, Gecode::FloatNum st, AssignmentType at, bool r); /// Create assignment virtual Assignment* assignment(void) const; /// Complete the current assignment to get a feasible one (which satisfies all constraint). /// If such an assignment is computed, it returns true, false otherwise virtual bool extendAssignement(Assignment& a) const; /// Check for solution virtual MaybeType solution(const Assignment&) const = 0; /// Test if \a ts is subsumed or not (i.e. if there is no more propagator unless /// the assignment is an extended assigment. bool subsumed(const TestSpace& ts) const; /// Whether to ignore assignment for reification virtual bool ignore(const Assignment& a) const; /// Post constraint virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x) = 0; /// Post reified constraint virtual void post(Gecode::Space& home, Gecode::FloatVarArray& x, Gecode::Reify r); /// Perform test virtual bool run(void); /// \name Mapping scalar values to strings //@{ /// Map float relation to string static std::string str(Gecode::FloatRelType frt); /// Map floatNum to string static std::string str(Gecode::FloatNum f); /// Map floatVal to string static std::string str(Gecode::FloatVal f); /// Map float array to string static std::string str(const Gecode::FloatValArgs& f); //@} /// \name General support //@{ /// Compare \a x and \a y with respect to \a r static MaybeType cmp(Gecode::FloatVal x, Gecode::FloatRelType r, Gecode::FloatVal y); /// Whether \a x and \a y are equal static MaybeType eq(Gecode::FloatVal x, Gecode::FloatVal y); /// Flip a coin and return true or false randomly bool flip(void); //@} }; //@} /// Iterator for float relation types class FloatRelTypes { private: /// Array of relation types static const Gecode::FloatRelType frts[6]; /// Current position in relation type array int i; public: /// Initialize iterator FloatRelTypes(void); /// Reset iterator void reset(void); /// Test whether iterator is done bool operator()(void) const; /// Increment to next relation type void operator++(void); /// Return current relation type Gecode::FloatRelType frt(void) const; }; } } /** * \brief Print assignment \a * \relates Assignment */ std::ostream& operator<<(std::ostream& os, const Test::Float::Assignment& a); #include "test/float.hpp" #endif // STATISTICS: test-float gecode-4.2.1/test/float.hpp0000644000175000010010000002013212104462072014652 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Mikael Lagerkvist * Vincent Barichard * * Copyright: * Christian Schulte, 2005 * Mikael Lagerkvist, 2006 * Vincent Barichard, 2012 * * Last modified: * $Date: 2013-02-06 15:10:02 +0100 (Wed, 06 Feb 2013) $ by $Author: schulte $ * $Revision: 13270 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ namespace Test { namespace Float { /* * Assignments * */ inline Assignment::Assignment(int n0, const Gecode::FloatVal& d0) : n(n0), d(d0) {} inline int Assignment::size(void) const { return n; } inline Assignment::~Assignment(void) {} inline CpltAssignment::CpltAssignment(int n, const Gecode::FloatVal& d, Gecode::FloatNum s) : Assignment(n,d), dsv(new Gecode::FloatVal[static_cast(n)]), step(s) { using namespace Gecode; for (int i=n; i--; ) dsv[i] = FloatVal(d.min(),nextafter(d.min(),d.max())); } inline bool CpltAssignment::operator()(void) const { return dsv[0].min() <= d.max(); } inline Gecode::FloatVal CpltAssignment::operator[](int i) const { assert((i>=0) && (i=0) && (i(n)]), step(s) { using namespace Gecode; for (int i=n-1; i--; ) dsv[i] = FloatVal(d.min(),nextafter(d.min(),d.max())); ++(*this); } inline bool ExtAssignment::operator()(void) const { return dsv[0].min() <= d.max(); } inline Gecode::FloatVal ExtAssignment::operator[](int i) const { assert((i>=0) && (i=0) && (i(Gecode::Int::Limits::max)), static_cast(Gecode::Int::Limits::max) ), r.sub_down(d.max(),d.min()) ) ); } inline RandomAssignment::RandomAssignment(int n, const Gecode::FloatVal& d, int a0) : Assignment(n,d), vals(new Gecode::FloatVal[n]), a(a0) { for (int i=n; i--; ) vals[i] = randval(); } inline bool RandomAssignment::operator()(void) const { return a>0; } inline Gecode::FloatVal RandomAssignment::operator[](int i) const { assert((i>=0) && (i=0) && (i y) return MT_FALSE; break; case FRT_LE: if (x < y) return MT_TRUE; if (x >= y) return MT_FALSE; break; case FRT_GQ: if (x >= y) return MT_TRUE; if (x < y) return MT_FALSE; break; case FRT_GR: if (x > y) return MT_TRUE; if (x <= y) return MT_FALSE; break; default: ; } return MT_MAYBE; } inline MaybeType Test::eq(Gecode::FloatVal x, Gecode::FloatVal y) { return cmp(x, Gecode::FRT_EQ, y); } inline bool Test::flip(void) { return Base::rand(2U) == 0U; } inline MaybeType operator &(MaybeType a, MaybeType b) { switch (a) { case MT_TRUE: return b; case MT_FALSE: return MT_FALSE; default: ; } return (b == MT_FALSE) ? MT_FALSE : MT_MAYBE; } inline FloatRelTypes::FloatRelTypes(void) : i(sizeof(frts)/sizeof(Gecode::FloatRelType)-1) {} inline void FloatRelTypes::reset(void) { i = sizeof(frts)/sizeof(Gecode::FloatRelType)-1; } inline bool FloatRelTypes::operator()(void) const { return i>=0; } inline void FloatRelTypes::operator++(void) { i--; } inline Gecode::FloatRelType FloatRelTypes::frt(void) const { return frts[i]; } }} // STATISTICS: test-float gecode-4.2.1/test/int/0000755000175000010010000000000012236131645013635 5ustar schulteNonegecode-4.2.1/test/int/arithmetic.cpp0000755000175000010010000010024012207652502016470 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2005 * * Last modified: * $Date: 2013-08-29 16:05:54 +0200 (Thu, 29 Aug 2013) $ by $Author: schulte $ * $Revision: 13993 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include #include #include namespace Test { namespace Int { /// %Tests for arithmetic constraints namespace Arithmetic { /** * \defgroup TaskTestIntArithmetic Arithmetic constraints * \ingroup TaskTestInt */ //@{ /// %Test for multiplication constraint class MultXYZ : public Test { public: /// Create and register test MultXYZ(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Mult::XYZ::"+str(icl)+"::"+s,3,d,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double d0 = static_cast(x[0]); double d1 = static_cast(x[1]); double d2 = static_cast(x[2]); return d0*d1 == d2; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::mult(home, x[0], x[1], x[2], icl); } }; /// %Test for multiplication constraint with shared variables class MultXXY : public Test { public: /// Create and register test MultXXY(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Mult::XXY::"+str(icl)+"::"+s,2,d,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double d0 = static_cast(x[0]); double d1 = static_cast(x[0]); double d2 = static_cast(x[1]); return d0*d1 == d2; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::mult(home, x[0], x[0], x[1], icl); } }; /// %Test for multiplication constraint with shared variables class MultXYX : public Test { public: /// Create and register test MultXYX(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Mult::XYX::"+str(icl)+"::"+s,2,d,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double d0 = static_cast(x[0]); double d1 = static_cast(x[1]); double d2 = static_cast(x[0]); return d0*d1 == d2; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::mult(home, x[0], x[1], x[0], icl); } }; /// %Test for multiplication constraint with shared variables class MultXYY : public Test { public: /// Create and register test MultXYY(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Mult::XYY::"+str(icl)+"::"+s,2,d,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double d0 = static_cast(x[0]); double d1 = static_cast(x[1]); double d2 = static_cast(x[1]); return d0*d1 == d2; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::mult(home, x[0], x[1], x[1], icl); } }; /// %Test for multiplication constraint with shared variables class MultXXX : public Test { public: /// Create and register test MultXXX(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Mult::XXX::"+str(icl)+"::"+s,1,d,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double d0 = static_cast(x[0]); double d1 = static_cast(x[0]); double d2 = static_cast(x[0]); return d0*d1 == d2; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::mult(home, x[0], x[0], x[0], icl); } }; /// %Test for squaring constraint class SqrXY : public Test { public: /// Create and register test SqrXY(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Sqr::XY::"+str(icl)+"::"+s,2,d,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double d0 = static_cast(x[0]); double d1 = static_cast(x[1]); return d0*d0 == d1; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::sqr(home, x[0], x[1], icl); } }; /// %Test for squaring constraint with shared variables class SqrXX : public Test { public: /// Create and register test SqrXX(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Sqr::XX::"+str(icl)+"::"+s,1,d,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double d0 = static_cast(x[0]); return d0*d0 == d0; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::sqr(home, x[0], x[0], icl); } }; /// %Test for square root constraint class SqrtXY : public Test { public: /// Create and register test SqrtXY(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Sqrt::XY::"+str(icl)+"::"+s,2,d,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double d0 = static_cast(x[0]); double d1 = static_cast(x[1]); return (d0 >= 0) && (d0 >= d1*d1) && (d0 < (d1+1)*(d1+1)); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::sqrt(home, x[0], x[1], icl); } }; /// %Test for square root constraint with shared variables class SqrtXX : public Test { public: /// Create and register test SqrtXX(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Sqrt::XX::"+str(icl)+"::"+s,1,d,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double d0 = static_cast(x[0]); return (d0 >= 0) && (d0 >= d0*d0) && (d0 < (d0+1)*(d0+1)); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::sqrt(home, x[0], x[0], icl); } }; /// %Test for power constraint class PowXY : public Test { protected: /// The exponent int n; public: /// Create and register test PowXY(const std::string& s, int n0, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Pow::XY::"+str(n0)+"::"+str(icl)+"::"+s, 2,d,false,icl), n(n0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { long long int p = 1; for (int i=0; i Gecode::Int::Limits::max)) return false; } return p == x[1]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; if (n > 4) pow(home, x[0], n, x[1], icl); else rel(home, expr(home, pow(x[0],n), icl), IRT_EQ, x[1], icl); } }; /// %Test for power constraint with shared variables class PowXX : public Test { protected: /// The exponent int n; public: /// Create and register test PowXX(const std::string& s, int n0, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Pow::XX::"+str(n0)+"::"+str(icl)+"::"+s, 1,d,false,icl), n(n0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { long long int p = 1; for (int i=0; i Gecode::Int::Limits::max)) return false; } return p == x[0]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::pow(home, x[0], n, x[0], icl); } }; bool powgr(int n, long long int r, int x) { assert(r >= 0); long long int y = r; long long int p = 1; do { p *= y; n--; if (p > x) return true; } while (n > 0); return false; } int fnroot(int n, int x) { if (x < 2) return x; /* * We look for l such that: l^n <= x < (l+1)^n */ long long int l = 1; long long int u = x; do { long long int m = (l + u) >> 1; if (powgr(n,m,x)) u=m; else l=m; } while (l+1 < u); return static_cast(l); } bool powle(int n, long long int r, int x) { assert(r >= 0); long long int y = r; long long int p = 1; do { p *= y; n--; if (p >= x) return false; } while (n > 0); assert(y < x); return true; } int cnroot(int n, int x) { if (x < 2) return x; /* * We look for u such that: (u-1)^n < x <= u^n */ long long int l = 1; long long int u = x; do { long long int m = (l + u) >> 1; if (powle(n,m,x)) l=m; else u=m; } while (l+1 < u); return static_cast(u); } /// %Test for nroot constraint class NrootXY : public Test { protected: /// The root index int n; /// Floor public: /// Create and register test NrootXY(const std::string& s, int n0, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Nroot::XY::"+str(n0)+"::"+str(icl)+"::"+s, 2,d,false,icl), n(n0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { if (n == 1) return x[0] == x[1]; if ((n % 2 == 0) && ((x[0] < 0) || (x[1] < 0))) return false; int r = (x[0] < 0) ? -cnroot(n,-x[0]) : fnroot(n,x[0]); return r == x[1]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; if (n > 4) nroot(home, x[0], n, x[1], icl); else rel(home, expr(home, nroot(x[0],n), icl), IRT_EQ, x[1], icl); } }; /// %Test for nroot constraint with shared variables class NrootXX : public Test { protected: /// The root index int n; public: /// Create and register test NrootXX(const std::string& s, int n0, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Nroot::XX::"+str(n0)+"::"+str(icl)+"::"+s, 1,d,false,icl), n(n0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { if (n == 1) return true; if (n % 2 == 0) { return (x[0] >= 0) && (x[0] <= 1); } else { return (x[0] >= -2) && (x[0] <= 1); } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::nroot(home, x[0], n, x[0], icl); } }; /// %Test for division/modulo constraint class DivMod : public Test { private: /// Return the absolute value of \a a static int abs(int a) { return a<0 ? -a:a; } /// Return the sign of \a a static int sgn(int a) { return a<0 ? -1:1; } public: /// Create and register test DivMod(const std::string& s, const Gecode::IntSet& d) : Test("Arithmetic::DivMod::"+s,4,d) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return x[0] == x[1]*x[2]+x[3] && abs(x[3]) < abs(x[1]) && (x[3] == 0 || sgn(x[3]) == sgn(x[0])); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::divmod(home, x[0], x[1], x[2], x[3]); } }; /// %Test for division constraint class Div : public Test { public: /// Create and register test Div(const std::string& s, const Gecode::IntSet& d) : Test("Arithmetic::Div::"+s,3,d) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { if (x[1] == 0) return false; int divsign = (x[0] / x[1] < 0) ? -1 : 1; int divresult = divsign * static_cast(floor(static_cast(std::abs(x[0]))/ static_cast(std::abs(x[1])))); return x[2] == divresult; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::div(home, x[0], x[1], x[2]); } }; /// %Test for modulo constraint class Mod : public Test { public: /// Create and register test Mod(const std::string& s, const Gecode::IntSet& d) : Test("Arithmetic::Mod::"+s,3,d) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { if (x[1] == 0) return false; int divsign = (x[0] / x[1] < 0) ? -1 : 1; int divresult = divsign * static_cast(floor(static_cast(std::abs(x[0]))/ static_cast(std::abs(x[1])))); return x[0] == x[1]*divresult+x[2]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::mod(home, x[0], x[1], x[2]); } }; /// %Test for absolute value constraint class AbsXY : public Test { public: /// Create and register test AbsXY(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Abs::XY::"+str(icl)+"::"+s,2,d,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double d0 = static_cast(x[0]); double d1 = static_cast(x[1]); return (d0<0 ? -d0 : d0) == d1; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::abs(home, x[0], x[1], icl); } }; /// %Test for absolute value constraint with shared variables class AbsXX : public Test { public: /// Create and register test AbsXX(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Abs::XX::"+str(icl)+"::"+s,1,d,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double d0 = static_cast(x[0]); double d1 = static_cast(x[0]); return (d0<0 ? -d0 : d0) == d1; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::abs(home, x[0], x[0], icl); } }; /// %Test for binary minimum constraint class MinXYZ : public Test { public: /// Create and register test MinXYZ(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Min::Bin::XYZ::"+str(icl)+"::"+s,3,d,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return std::min(x[0],x[1]) == x[2]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::min(home, x[0], x[1], x[2], icl); } }; /// %Test for binary minimum constraint with shared variables class MinXXY : public Test { public: /// Create and register test MinXXY(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Min::Bin::XYX::"+str(icl)+"::"+s,2,d) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return std::min(x[0],x[0]) == x[1]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::min(home, x[0], x[0], x[1], icl); } }; /// %Test for binary minimum constraint with shared variables class MinXYX : public Test { public: /// Create and register test MinXYX(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Min::Bin::XYX::"+str(icl)+"::"+s,2,d) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return std::min(x[0],x[1]) == x[0]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::min(home, x[0], x[1], x[0], icl); } }; /// %Test for binary minimum constraint with shared variables class MinXYY : public Test { public: /// Create and register test MinXYY(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Min::Bin::XYY::"+str(icl)+"::"+s,2,d) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return std::min(x[0],x[1]) == x[1]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::min(home, x[0], x[1], x[1], icl); } }; /// %Test for binary minimum constraint with shared variables class MinXXX : public Test { public: /// Create and register test MinXXX(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Min::Bin::XXX::"+str(icl)+"::"+s,1,d) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return std::min(x[0],x[0]) == x[0]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::min(home, x[0], x[0], x[0], icl); } }; /// %Test for binary maximum constraint class MaxXYZ : public Test { public: /// Create and register test MaxXYZ(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Max::Bin::XYZ::"+str(icl)+"::"+s,3,d) { contest = CTL_BOUNDS_Z; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return std::max(x[0],x[1]) == x[2]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::max(home, x[0], x[1], x[2], icl); } }; /// %Test for binary maximum constraint with shared variables class MaxXXY : public Test { public: /// Create and register test MaxXXY(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Max::Bin::XXY::"+str(icl)+"::"+s,2,d) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return std::max(x[0],x[0]) == x[1]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::max(home, x[0], x[0], x[1], icl); } }; /// %Test for binary maximum constraint with shared variables class MaxXYX : public Test { public: /// Create and register test MaxXYX(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Max::Bin::XYX::"+str(icl)+"::"+s,2,d) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return std::max(x[0],x[1]) == x[0]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::max(home, x[0], x[1], x[0], icl); } }; /// %Test for binary maximum constraint with shared variables class MaxXYY : public Test { public: /// Create and register test MaxXYY(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Max::Bin::XYY::"+str(icl)+"::"+s,2,d) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return std::max(x[0],x[1]) == x[1]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::max(home, x[0], x[1], x[1], icl); } }; /// %Test for binary maximum constraint with shared variables class MaxXXX : public Test { public: /// Create and register test MaxXXX(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("Arithmetic::Max::Bin::XXX::"+str(icl)+"::"+s,1,d) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return std::max(x[0],x[0]) == x[0]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::max(home, x[0], x[0], x[0], icl); } }; /// %Test for n-ary minimmum constraint class MinNary : public Test { public: /// Create and register test MinNary(Gecode::IntConLevel icl) : Test("Arithmetic::Min::Nary::"+str(icl),4,-4,4,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return std::min(std::min(x[0],x[1]), x[2]) == x[3]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs m(3); m[0]=x[0]; m[1]=x[1]; m[2]=x[2]; Gecode::min(home, m, x[3], icl); } }; /// %Test for n-ary minimmum constraint with shared variables class MinNaryShared : public Test { public: /// Create and register test MinNaryShared(Gecode::IntConLevel icl) : Test("Arithmetic::Min::Nary::Shared::"+str(icl),3,-4,4,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return std::min(std::min(x[0],x[1]), x[2]) == x[1]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs m(3); m[0]=x[0]; m[1]=x[1]; m[2]=x[2]; Gecode::min(home, m, x[1], icl); } }; /// %Test for n-ary maximum constraint class MaxNary : public Test { public: /// Create and register test MaxNary(Gecode::IntConLevel icl) : Test("Arithmetic::Max::Nary::"+str(icl),4,-4,4,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return std::max(std::max(x[0],x[1]), x[2]) == x[3]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs m(3); m[0]=x[0]; m[1]=x[1]; m[2]=x[2]; Gecode::max(home, m, x[3], icl); } }; /// %Test for n-ary maximum constraint with shared variables class MaxNaryShared : public Test { public: /// Create and register test MaxNaryShared(Gecode::IntConLevel icl) : Test("Arithmetic::Max::Nary::Shared::"+str(icl),3,-4,4,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return std::max(std::max(x[0],x[1]), x[2]) == x[1]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs m(3); m[0]=x[0]; m[1]=x[1]; m[2]=x[2]; Gecode::max(home, m, x[1], icl); } }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { const int va[7] = { Gecode::Int::Limits::min, Gecode::Int::Limits::min+1, -1,0,1, Gecode::Int::Limits::max-1, Gecode::Int::Limits::max }; const int vb[9] = { static_cast(-sqrt(static_cast (-Gecode::Int::Limits::min))), -4,-2,-1,0,1,2,4, static_cast(sqrt(static_cast (Gecode::Int::Limits::max))) }; Gecode::IntSet a(va,7); Gecode::IntSet b(vb,9); Gecode::IntSet c(-8,8); Gecode::IntSet d(-70,70); (void) new DivMod("A",a); (void) new DivMod("B",b); (void) new DivMod("C",c); (void) new Div("A",a); (void) new Div("B",b); (void) new Div("C",c); (void) new Mod("A",a); (void) new Mod("B",b); (void) new Mod("C",c); for (IntConLevels icls; icls(); ++icls) if (icls.icl() != Gecode::ICL_VAL) { (void) new MultXYZ("A",a,icls.icl()); (void) new MultXYZ("B",b,icls.icl()); (void) new MultXYZ("C",c,icls.icl()); (void) new MultXXY("A",a,icls.icl()); (void) new MultXXY("B",b,icls.icl()); (void) new MultXXY("C",c,icls.icl()); (void) new MultXYX("A",a,icls.icl()); (void) new MultXYX("B",b,icls.icl()); (void) new MultXYX("C",c,icls.icl()); (void) new MultXYY("A",a,icls.icl()); (void) new MultXYY("B",b,icls.icl()); (void) new MultXYY("C",c,icls.icl()); (void) new MultXXX("A",a,icls.icl()); (void) new MultXXX("B",b,icls.icl()); (void) new MultXXX("C",c,icls.icl()); (void) new SqrXY("A",a,icls.icl()); (void) new SqrXY("B",b,icls.icl()); (void) new SqrXY("C",c,icls.icl()); (void) new SqrXX("A",a,icls.icl()); (void) new SqrXX("B",b,icls.icl()); (void) new SqrXX("C",c,icls.icl()); for (int n=0; n<=6; n++) { (void) new PowXY("A",n,a,icls.icl()); (void) new PowXY("B",n,b,icls.icl()); (void) new PowXY("C",n,c,icls.icl()); (void) new PowXY("D",n,d,icls.icl()); (void) new PowXX("A",n,a,icls.icl()); (void) new PowXX("B",n,b,icls.icl()); (void) new PowXX("C",n,c,icls.icl()); (void) new PowXX("D",n,d,icls.icl()); } for (int n=1; n<=6; n++) { (void) new NrootXY("A",n,a,icls.icl()); (void) new NrootXY("B",n,b,icls.icl()); (void) new NrootXY("C",n,c,icls.icl()); (void) new NrootXY("D",n,d,icls.icl()); (void) new NrootXX("A",n,a,icls.icl()); (void) new NrootXX("B",n,b,icls.icl()); (void) new NrootXX("C",n,c,icls.icl()); (void) new NrootXX("D",n,d,icls.icl()); } for (int n=30; n<=34; n++) { (void) new PowXY("C",n,c,icls.icl()); (void) new PowXX("C",n,c,icls.icl()); (void) new NrootXY("C",n,c,icls.icl()); (void) new NrootXX("C",n,c,icls.icl()); } (void) new SqrtXY("A",a,icls.icl()); (void) new SqrtXY("B",b,icls.icl()); (void) new SqrtXY("C",c,icls.icl()); (void) new SqrtXX("A",a,icls.icl()); (void) new SqrtXX("B",b,icls.icl()); (void) new SqrtXX("C",c,icls.icl()); (void) new AbsXY("A",a,icls.icl()); (void) new AbsXY("B",b,icls.icl()); (void) new AbsXY("C",c,icls.icl()); (void) new AbsXX("A",a,icls.icl()); (void) new AbsXX("B",b,icls.icl()); (void) new AbsXX("C",c,icls.icl()); (void) new MinXYZ("A",a,icls.icl()); (void) new MinXYZ("B",b,icls.icl()); (void) new MinXYZ("C",c,icls.icl()); (void) new MinXXY("A",a,icls.icl()); (void) new MinXXY("B",b,icls.icl()); (void) new MinXXY("C",c,icls.icl()); (void) new MinXYX("A",a,icls.icl()); (void) new MinXYX("B",b,icls.icl()); (void) new MinXYX("C",c,icls.icl()); (void) new MinXYY("A",a,icls.icl()); (void) new MinXYY("B",b,icls.icl()); (void) new MinXYY("C",c,icls.icl()); (void) new MinXXX("A",a,icls.icl()); (void) new MinXXX("B",b,icls.icl()); (void) new MinXXX("C",c,icls.icl()); (void) new MaxXYZ("A",a,icls.icl()); (void) new MaxXYZ("B",b,icls.icl()); (void) new MaxXYZ("C",c,icls.icl()); (void) new MaxXXY("A",a,icls.icl()); (void) new MaxXXY("B",b,icls.icl()); (void) new MaxXXY("C",c,icls.icl()); (void) new MaxXYX("A",a,icls.icl()); (void) new MaxXYX("B",b,icls.icl()); (void) new MaxXYX("C",c,icls.icl()); (void) new MaxXYY("A",a,icls.icl()); (void) new MaxXYY("B",b,icls.icl()); (void) new MaxXYY("C",c,icls.icl()); (void) new MaxXXX("A",a,icls.icl()); (void) new MaxXXX("B",b,icls.icl()); (void) new MaxXXX("C",c,icls.icl()); (void) new MinNary(icls.icl()); (void) new MinNaryShared(icls.icl()); (void) new MaxNary(icls.icl()); (void) new MaxNaryShared(icls.icl()); } } }; Create c; //@} } }} // STATISTICS: test-int gecode-4.2.1/test/int/basic.cpp0000755000175000010010000000522612040006002015407 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2005 * * Last modified: * $Date: 2012-10-18 16:02:42 +0200 (Thu, 18 Oct 2012) $ by $Author: schulte $ * $Revision: 13154 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" namespace Test { namespace Int { /// %Tests for basic setup namespace Basic { /** * \defgroup TaskTestIntBasic Basic setup * \ingroup TaskTestInt */ //@{ /// %Test whether testing infrastructure for integer variables works class Basic : public Test { public: /// Initialize test Basic(int n) : Test("Basic::A",3,-n,n,true) {} /// Initialize test Basic(Gecode::IntArgs& i) : Test("Basic::B",3,Gecode::IntSet(i),true) {} /// Check whether \a x is a solution virtual bool solution(const Assignment&) const { return true; } /// Post constraint on \a x virtual void post(Gecode::Space&, Gecode::IntVarArray&) { } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray&, Gecode::Reify r) { if (r.mode() != Gecode::RM_IMP) Gecode::rel(home, r.var(), Gecode::IRT_EQ, 1); } }; Gecode::IntArgs i(4, 1,2,3,4); Basic b1(3); Basic b2(i); //@} } }} // STATISTICS: test-int gecode-4.2.1/test/int/bin-packing.cpp0000644000175000010010000001601211727617367016541 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2010 * * Last modified: * $Date: 2012-03-13 11:18:31 +0100 (Tue, 13 Mar 2012) $ by $Author: schulte $ * $Revision: 12572 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include #include namespace Test { namespace Int { /// %Tests for bin-packing constraint namespace BinPacking { /** * \defgroup TaskTestIntBinPacking Bin-packing constraints * \ingroup TaskTestInt */ //@{ /// Generate load and bin assignments class LoadBinAssignment : public Assignment { protected: /// Number of bins int n_bins; /// Number of items int n_items; /// Domain for load variables Gecode::IntSet d_load; /// Domain for bin variables Gecode::IntSet d_bin; /// Load to generate (unless -1) int load; /// Iterator for each variable Gecode::IntSetValues* dsv; public: /// Initialize assignments for load and bin variables LoadBinAssignment(int m, const Gecode::IntSet& d_m, int n, const Gecode::IntSet& d_n, int l) : Assignment(m+n,d_m), n_bins(m), n_items(n), d_load(d_m), d_bin(d_n), load(l), dsv(new Gecode::IntSetValues[static_cast(m+n)]) { for (int i=n_bins; i--; ) dsv[i].init(d_load); for (int i=n_items; i--; ) dsv[n_bins+i].init(d_bin); } /// Test whether all assignments have been iterated virtual bool operator()(void) const { return dsv[0](); } /// Move to next assignment virtual void operator++(void) { // Try to generate next bin assignment { int i = n_items-1; while (i >= 0) { ++dsv[n_bins+i]; if (dsv[n_bins+i]()) return; dsv[n_bins+(i--)].init(d_bin); } } // Try to generate next load assignment { retry: int i = n_bins-1; while (true) { ++dsv[i]; if (dsv[i]() || (i == 0)) { if (dsv[i]() && (load >= 0)) { int l = 0; for (int k=0;k=0) && (i * * Copyright: * Christian Schulte, 2005 * * Last modified: * $Date: 2013-04-17 17:43:48 +0200 (Wed, 17 Apr 2013) $ by $Author: schulte $ * $Revision: 13581 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include namespace Test { namespace Int { /// %Tests for Boolean constraints namespace Bool { inline int check(int x0, Gecode::BoolOpType op, int x1) { switch (op) { case Gecode::BOT_AND: return x0 & x1; case Gecode::BOT_OR: return x0 | x1; case Gecode::BOT_IMP: return !x0 | x1; case Gecode::BOT_EQV: return x0 == x1; case Gecode::BOT_XOR: return x0 != x1; default: GECODE_NEVER; } GECODE_NEVER; return 0; } /** * \defgroup TaskTestIntBool Boolean constraints * \ingroup TaskTestInt */ //@{ /// %Test for binary Boolean operation class BinXYZ : public Test { protected: /// Boolean operation type for test Gecode::BoolOpType op; public: /// Construct and register test BinXYZ(Gecode::BoolOpType op0) : Test("Bool::Bin::XYZ::"+str(op0),3,0,1), op(op0) {} /// Check whether \a x is solution virtual bool solution(const Assignment& x) const { return check(x[0],op,x[1]) == x[2]; } /// Post constraint virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; rel(home, channel(home,x[0]), op, channel(home,x[1]), channel(home,x[2])); } }; /// %Test for binary Boolean operation with shared variables class BinXXY : public Test { protected: /// Boolean operation type for test Gecode::BoolOpType op; public: /// Construct and register test BinXXY(Gecode::BoolOpType op0) : Test("Bool::Bin::XXY::"+str(op0),2,0,1), op(op0) {} /// Check whether \a x is solution virtual bool solution(const Assignment& x) const { return check(x[0],op,x[0]) == x[1]; } /// Post constraint virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; BoolVar b = channel(home,x[0]); rel(home, b, op, b, channel(home,x[1])); } }; /// %Test for binary Boolean operation with shared variables class BinXYX : public Test { protected: /// Boolean operation type for test Gecode::BoolOpType op; public: /// Construct and register test BinXYX(Gecode::BoolOpType op0) : Test("Bool::Bin::XYX::"+str(op0),2,0,1), op(op0) {} /// Check whether \a x is solution virtual bool solution(const Assignment& x) const { return check(x[0],op,x[1]) == x[0]; } /// Post constraint virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; BoolVar b = channel(home,x[0]); rel(home, b, op, channel(home,x[1]), b); } }; /// %Test for binary Boolean operation with shared variables class BinXYY : public Test { protected: /// Boolean operation type for test Gecode::BoolOpType op; public: /// Construct and register test BinXYY(Gecode::BoolOpType op0) : Test("Bool::Bin::XYY::"+str(op0),2,0,1), op(op0) {} /// Check whether \a x is solution virtual bool solution(const Assignment& x) const { return check(x[0],op,x[1]) == x[1]; } /// Post constraint virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; BoolVar b = channel(home,x[1]); rel(home, channel(home,x[0]), op, b, b); } }; /// %Test for binary Boolean operation with shared variables class BinXXX : public Test { protected: /// Boolean operation type for test Gecode::BoolOpType op; public: /// Construct and register test BinXXX(Gecode::BoolOpType op0) : Test("Bool::Bin::XXX::"+str(op0),1,0,1), op(op0) {} /// Check whether \a x is solution virtual bool solution(const Assignment& x) const { return check(x[0],op,x[0]) == x[0]; } /// Post constraint virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; BoolVar b = channel(home,x[0]); rel(home, b, op, b, b); } }; /// %Test for binary Boolean operation with constant class BinConstXY : public Test { protected: /// Boolean operation type for test Gecode::BoolOpType op; /// Integer constant int c; public: /// Construct and register test BinConstXY(Gecode::BoolOpType op0, int c0) : Test("Bool::Bin::XY::"+str(op0)+"::"+str(c0),2,0,1), op(op0), c(c0) {} /// Check whether \a x is solution virtual bool solution(const Assignment& x) const { return check(x[0],op,x[1]) == c; } /// Post constraint virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; rel(home, channel(home,x[0]), op, channel(home,x[1]), c); } }; /// %Test for binary Boolean operation with shared variables and constant class BinConstXX : public Test { protected: /// Boolean operation type for test Gecode::BoolOpType op; /// Integer constant int c; public: /// Construct and register test BinConstXX(Gecode::BoolOpType op0, int c0) : Test("Bool::Bin::XX::"+str(op0)+"::"+str(c0),1,0,1), op(op0), c(c0) {} /// Check whether \a x is solution virtual bool solution(const Assignment& x) const { return check(x[0],op,x[0]) == c; } /// Post constraint virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; BoolVar b = channel(home,x[0]); rel(home, b, op, b, c); } }; /// %Test for Nary Boolean operation class Nary : public Test { protected: /// Boolean operation type for test Gecode::BoolOpType op; public: /// Construct and register test Nary(Gecode::BoolOpType op0, int n) : Test("Bool::Nary::"+str(op0)+"::"+str(n),n+1,0,1), op(op0) {} /// Check whether \a x is solution virtual bool solution(const Assignment& x) const { int n = x.size()-1; int b = check(x[n-2],op,x[n-1]); for (int i=0; i 1)) return false; if (x[0] == 1) return x[1] == x[3]; else return x[2] == x[3]; } /// Post constraint virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; if (Base::rand(2) != 0) ite(home,channel(home,x[0]),x[1],x[2],x[3]); else rel(home, ite(channel(home,x[0]),x[1],x[2]) == x[3]); } }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { using namespace Gecode; for (BoolOpTypes bots; bots(); ++bots) { (void) new BinXYZ(bots.bot()); (void) new BinXXY(bots.bot()); (void) new BinXYX(bots.bot()); (void) new BinXYY(bots.bot()); (void) new BinXXX(bots.bot()); (void) new BinConstXY(bots.bot(),0); (void) new BinConstXY(bots.bot(),1); (void) new BinConstXX(bots.bot(),0); (void) new BinConstXX(bots.bot(),1); (void) new Nary(bots.bot(),2); (void) new Nary(bots.bot(),6); (void) new Nary(bots.bot(),10); (void) new NaryShared(bots.bot(),2); (void) new NaryShared(bots.bot(),6); (void) new NaryShared(bots.bot(),10); (void) new NaryConst(bots.bot(),2,0); (void) new NaryConst(bots.bot(),6,0); (void) new NaryConst(bots.bot(),10,0); (void) new NaryConst(bots.bot(),2,1); (void) new NaryConst(bots.bot(),6,1); (void) new NaryConst(bots.bot(),10,1); if ((bots.bot() == BOT_AND) || (bots.bot() == BOT_OR)) { (void) new ClauseXYZ(bots.bot(),2); (void) new ClauseXYZ(bots.bot(),6); (void) new ClauseXYZ(bots.bot(),10); (void) new ClauseXXYYX(bots.bot(),2); (void) new ClauseXXYYX(bots.bot(),6); (void) new ClauseXXYYX(bots.bot(),10); (void) new ClauseXXY(bots.bot(),2); (void) new ClauseXXY(bots.bot(),6); (void) new ClauseXXY(bots.bot(),10); (void) new ClauseConst(bots.bot(),2,0); (void) new ClauseConst(bots.bot(),6,0); (void) new ClauseConst(bots.bot(),10,0); (void) new ClauseConst(bots.bot(),2,1); (void) new ClauseConst(bots.bot(),6,1); (void) new ClauseConst(bots.bot(),10,1); } } } }; Create c; ITE itebnd(Gecode::ICL_BND); ITE itedom(Gecode::ICL_DOM); //@} } }} // STATISTICS: test-int gecode-4.2.1/test/int/channel.cpp0000755000175000010010000001650411653507044015764 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2006 * * Last modified: * $Date: 2011-10-31 13:01:40 +0100 (Mon, 31 Oct 2011) $ by $Author: schulte $ * $Revision: 12449 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include namespace Test { namespace Int { /// %Tests for channel constraints namespace Channel { /** * \defgroup TaskTestIntChannel Channel constraints * \ingroup TaskTestInt */ //@{ /// Simple test for channel (testing all variables) class ChannelFull : public Test { private: int xoff; //< Offset for the x variables int yoff; //< Offset for the y variables public: /// Construct and register test ChannelFull(int xoff0, int yoff0, Gecode::IntConLevel icl) : Test("Channel::Full::"+str(xoff0)+"::"+str(yoff0)+"::"+str(icl), 8,0,3,false,icl), xoff(xoff0), yoff(yoff0) { contest = CTL_NONE; } /// Check whether \a x is solution virtual bool solution(const Assignment& x) const { for (int i=0; i<4; i++) if (x[4+x[i]] != i) return false; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; IntVarArgs xa(4); IntVarArgs ya(4); for (int i=4; i--; ) { if (xoff != 0) { IntVar xo(home, xoff, 3+xoff); Gecode::rel(home, x[i] == xo-xoff); xa[i] = xo; } else { xa[i] = x[i]; } if (yoff != 0) { IntVar yo(home, yoff, 3+yoff); Gecode::rel(home, x[4+i] == yo-yoff); ya[i] = yo; } else { ya[i] = x[4+i]; } } channel(home, xa, xoff, ya, yoff, icl); } }; /// Simple test for channel (testing single set of variables) class ChannelHalf : public Test { public: /// Construct and register test ChannelHalf(Gecode::IntConLevel icl) : Test("Channel::Half::"+str(icl),6,0,5,false,icl) { contest = CTL_NONE; } /// Check whether \a x is solution virtual bool solution(const Assignment& x) const { for (int i=0; i<6; i++) for (int j=i+1; j<6; j++) if (x[i] == x[j]) return false; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; Gecode::IntVarArgs y(home,6,dom); for (int i=0; i<6; i++) for (int j=0; j<6; j++) { Gecode::BoolVar b(home,0,1); rel(home, x[i], Gecode::IRT_EQ, j, b); rel(home, y[j], Gecode::IRT_EQ, i, b); } channel(home, x, y, icl); } }; /// %Test channel with shared variables class ChannelShared : public Test { public: /// Construct and register test ChannelShared(Gecode::IntConLevel icl) : Test("Channel::Shared::"+str(icl),6,0,5,false,icl) { contest = CTL_NONE; } /// Check whether \a x is solution virtual bool solution(const Assignment& x) const { for (int i=0; i<6; i++) if (x[x[i]] != i) return false; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; channel(home, x, x, icl); } }; /// %Test channel between integer and Boolean variable class ChannelLinkSingle : public Test { public: /// Construct and register test ChannelLinkSingle(void) : Test("Channel::Bool::Single",2,-1,2) { contest = CTL_NONE; } /// Check whether \a x is solution virtual bool solution(const Assignment& x) const { return ((x[0]==0) || (x[0]==1)) && (x[0]==x[1]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; Gecode::BoolVar b(home,0,1); channel(home, x[0], b); channel(home, x[1], b); } }; /// %Test channel between integer variable and array of Boolean variables class ChannelLinkMulti : public Test { private: int o; public: /// Construct and register test ChannelLinkMulti(const std::string& s, int min, int max, int o0) : Test("Channel::Bool::Multi::"+s,7,min,max), o(o0) { } /// Check whether \a x is solution virtual bool solution(const Assignment& x) const { int n = x.size()-1; for (int i=n; i--; ) if ((x[i] != 0) && (x[i] != 1)) return false; int k=x[n]-o; if ((k<0) || (k>=n)) return false; for (int i=0; i * * Copyright: * Christian Schulte, 2007 * * Last modified: * $Date: 2011-06-01 18:12:15 +0200 (Wed, 01 Jun 2011) $ by $Author: schulte $ * $Revision: 12036 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include namespace Test { namespace Int { /// %Tests for circuit constraints namespace Circuit { /** * \defgroup TaskTestIntCircuit Circuit constraints * \ingroup TaskTestInt */ //@{ /// Simple test for circuit constraint class Circuit : public Test { private: /// Offset int offset; public: /// Create and register test Circuit(int n, int min, int max, int off, Gecode::IntConLevel icl) : Test("Circuit::" + str(icl) + "::" + str(n) + "::" + str(off), n,min,max,false,icl), offset(off) { contest = CTL_NONE; } /// Check whether \a x is solution virtual bool solution(const Assignment& x) const { for (int i=x.size(); i--; ) if ((x[i] < 0) || (x[i] > x.size()-1)) return false; int reachable = 0; { int j=0; for (int i=x.size(); i--; ) { j=x[j]; reachable |= (1 << j); } } for (int i=x.size(); i--; ) if (!(reachable & (1 << i))) return false; return true; } /// Post circuit constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { if (offset > 0) { Gecode::IntVarArgs xx(x.size()); for (int i=x.size(); i--;) xx[i] = Gecode::expr(home, x[i]+offset); Gecode::circuit(home, offset, xx, icl); } else { Gecode::circuit(home, x, icl); } } }; /// Simple test for Hamiltonian path constraint class Path : public Test { private: /// Offset int offset; public: /// Create and register test Path(int n, int min, int max, int off, Gecode::IntConLevel icl) : Test("Path::" + str(icl) + "::" + str(n) + "::" + str(off), n+2,min,max,false,icl), offset(off) { contest = CTL_NONE; } /// Check whether \a x is solution virtual bool solution(const Assignment& x) const { int n = x.size() - 2; int s = x[n]; int e = x[n+1]; if ((s < 0) || (s > n) || (e < 0) || (e > n) || (x[e] != n)) return false; for (int i=n; i--; ) if ((i != e) && ((x[i] < 0) || (x[i] > n))) return false; int reachable = (1 << s); { int j=s; for (int i=n; i--; ) { j=x[j]; reachable |= (1 << j); } } for (int i=n; i--; ) if (!(reachable & (1 << i))) return false; return true; } /// Post path constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { int n = x.size() - 2; Gecode::IntVarArgs xx(n); if (offset > 0) { for (int i=n; i--;) xx[i] = Gecode::expr(home, x[i]+offset); Gecode::path(home, offset, xx, Gecode::expr(home, x[n]+offset), Gecode::expr(home, x[n+1]+offset),icl); } else { for (int i=n; i--;) xx[i] = x[i]; Gecode::path(home, xx, x[n], x[n+1], icl); } } }; /// Simple test for circuit constraint with total cost class CircuitCost : public Test { private: /// Offset int offset; public: /// Create and register test CircuitCost(int n, int min, int max, int off, Gecode::IntConLevel icl) : Test("Circuit::Cost::"+str(icl)+"::"+str(n)+"::"+str(off), n+1,min,max,false,icl), offset(off) { contest = CTL_NONE; } /// Check whether \a x is solution virtual bool solution(const Assignment& x) const { int n=x.size()-1; for (int i=n; i--; ) if ((x[i] < 0) || (x[i] > n-1)) return false; int reachable = 0; { int j=0; for (int i=n; i--; ) { j=x[j]; reachable |= (1 << j); } } for (int i=n; i--; ) if (!(reachable & (1 << i))) return false; int c=0; for (int i=n; i--; ) c += x[i]; return c == x[n]; } /// Post circuit constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; int n=x.size()-1; IntArgs c(n*n); for (int i=0; i 0) { for (int i=n; i--;) y[i] = Gecode::expr(home, x[i]+offset); Gecode::circuit(home, c, offset, y, x[n], icl); } else { for (int i=0; i n) || (e < 0) || (e > n) || (x[e] != n)) return false; for (int i=n; i--; ) if ((i != e) && ((x[i] < 0) || (x[i] > n))) return false; int reachable = (1 << s); { int j=s; for (int i=n; i--; ) { j=x[j]; reachable |= (1 << j); } } for (int i=n; i--; ) if (!(reachable & (1 << i))) return false; for (int i=n; i--; ) c -= x[i]; return c == 0; } /// Post circuit constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; int n=x.size()-3; IntArgs c(n*n); for (int i=0; i 0) { for (int i=n; i--;) y[i] = Gecode::expr(home, x[i]+offset); path(home, c, offset, y, expr(home, x[n]+offset), expr(home, x[n+1]+offset), x[n+2], icl); } else { for (int i=0; i n-1)) return false; int reachable = 0; { int j=0; for (int i=n; i--; ) { j=x[j]; reachable |= (1 << j); } } for (int i=n; i--; ) if (!(reachable & (1 << i))) return false; for (int i=n; i--; ) if ((x[i]/2) != x[n+i]) return false; int c=0; for (int i=n; i--; ) c += x[n+i]; return c == x[2*n]; } /// Post circuit constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; int n=(x.size()-1)/2; IntArgs c(n*n); for (int i=0; i 0) { for (int i=n; i--;) y[i] = Gecode::expr(home, x[i]+offset); Gecode::circuit(home, c, offset, y, z, x[2*n], icl); } else { for (int i=0; i * * Copyright: * Christian Schulte, 2005 * * Last modified: * $Date: 2011-08-22 13:08:29 +0200 (Mon, 22 Aug 2011) $ by $Author: schulte $ * $Revision: 12326 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" namespace Test { namespace Int { /// %Tests for count constraints namespace Count { /** * \defgroup TaskTestIntCount Count constraints * \ingroup TaskTestInt */ //@{ /// %Test number of equal integers equal to integer class IntInt : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test IntInt(Gecode::IntRelType irt0) : Test("Count::Int::Int::"+str(irt0),4,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=x.size(); i--; ) if (x[i] == 0) m++; return cmp(m,irt,2); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::count(home, x, 0, irt, 2); } }; /// %Test number of integers contained in an integer set equal to integer class SetInt : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test SetInt(Gecode::IntRelType irt0) : Test("Count::Set::Int::"+str(irt0),4,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=x.size(); i--; ) if ((x[i] >= -1) && (x[i] <= 1)) m++; return cmp(m,irt,2); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntSet s(-1,1); Gecode::count(home, x, s, irt, 2); } }; /// %Test number of equal integers equal to integer with duplicate variables class IntIntDup : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test IntIntDup(Gecode::IntRelType irt0) : Test("Count::Int::Int::Dup::"+str(irt0),4,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=x.size(); i--; ) if (x[i] == 0) m += 2; return cmp(m,irt,4); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs y(8); for (int i=x.size(); i--; ) y[i]=y[4+i]=x[i]; Gecode::count(home, y, 0, irt, 4); } }; /// %Test number of equal integers equal to integer variable class IntVar : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test IntVar(Gecode::IntRelType irt0) : Test("Count::Int::Var::"+str(irt0),5,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=0; i<4; i++) if (x[i] == 0) m++; return cmp(m,irt,x[4]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs y(4); for (int i=0; i<4; i++) y[i]=x[i]; Gecode::count(home, y, 0, irt, x[4]); } }; /// %Test number of integers contained in an integer set equal to integer variable class SetVar : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test SetVar(Gecode::IntRelType irt0) : Test("Count::Set::Var::"+str(irt0),5,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=0; i<4; i++) if ((x[i] >= -1) && (x[i] <= 1)) m++; return cmp(m,irt,x[4]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs y(4); for (int i=0; i<4; i++) y[i]=x[i]; Gecode::IntSet s(-1,1); Gecode::count(home, y, s, irt, x[4]); } }; Gecode::IntArgs ints(4, 1,0,3,2); /// %Test number of several equal integers equal to integer class IntArrayInt : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test IntArrayInt(Gecode::IntRelType irt0) : Test("Count::IntArray::Int::"+str(irt0),5,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=0; i<4; i++) if (x[i] == ints[i]) m++; return cmp(m,irt,2); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs y(4); for (int i=0; i<4; i++) y[i]=x[i]; Gecode::count(home, y, ints, irt, 2); } }; /// %Test number of several equal integers equal to integer variable class IntArrayVar : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test IntArrayVar(Gecode::IntRelType irt0) : Test("Count::IntArray::Var::"+str(irt0),5,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=0; i<4; i++) if (x[i] == ints[i]) m++; return cmp(m,irt,x[4]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs y(4); for (int i=0; i<4; i++) y[i]=x[i]; Gecode::count(home, y, ints, irt, x[4]); } }; /// %Test number of equal integers equal to integer variable with sharing class IntVarShared : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test IntVarShared(Gecode::IntRelType irt0) : Test("Count::Int::Var::Shared::"+str(irt0),4,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=0; i<4; i++) if (x[i] == 0) m++; return cmp(m,irt,x[2]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::count(home, x, 0, irt, x[2]); } }; /// %Test number of equal variables equal to integer variable class VarVar : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test VarVar(Gecode::IntRelType irt0) : Test("Count::Var::Var::"+str(irt0),5,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=0; i<3; i++) if (x[i] == x[3]) m++; return cmp(m,irt,x[4]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs y(3); for (int i=0; i<3; i++) y[i]=x[i]; Gecode::count(home, y, x[3], irt, x[4]); } }; /// %Test number of equal variables equal to integer class VarInt : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test VarInt(Gecode::IntRelType irt0) : Test("Count::Var::Int::"+str(irt0),4,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=0; i<3; i++) if (x[i] == x[3]) m++; return cmp(m,irt,2); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs y(3); for (int i=0; i<3; i++) y[i]=x[i]; Gecode::count(home, y, x[3], irt, 2); } }; /// %Test number of equal variables equal to integer variable with sharing class VarVarSharedA : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test VarVarSharedA(Gecode::IntRelType irt0) : Test("Count::Var::Var::Shared::A::"+str(irt0),5,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=0; i<4; i++) if (x[i] == x[1]) m++; return cmp(m,irt,x[4]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs y(4); for (int i=0; i<4; i++) y[i]=x[i]; Gecode::count(home, y, x[1], irt, x[4]); } }; /// %Test number of equal variables equal to integer variable with sharing class VarVarSharedB : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test VarVarSharedB(Gecode::IntRelType irt0) : Test("Count::Var::Var::Shared::B::"+str(irt0),5,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=0; i<4; i++) if (x[i] == x[4]) m++; return cmp(m,irt,x[3]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs y(4); for (int i=0; i<4; i++) y[i]=x[i]; Gecode::count(home, y, x[4], irt, x[3]); } }; /// %Test number of equal variables equal to integer variable with sharing class VarVarSharedC : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test VarVarSharedC(Gecode::IntRelType irt0) : Test("Count::Var::Var::Shared::C::"+str(irt0),4,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=0; i<4; i++) if (x[i] == x[1]) m++; return cmp(m,irt,x[3]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::count(home, x, x[1], irt, x[3]); } }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { for (IntRelTypes irts; irts(); ++irts) { (void) new IntInt(irts.irt()); (void) new SetInt(irts.irt()); (void) new IntIntDup(irts.irt()); (void) new IntVar(irts.irt()); (void) new SetVar(irts.irt()); (void) new IntArrayInt(irts.irt()); (void) new IntArrayVar(irts.irt()); (void) new IntVarShared(irts.irt()); (void) new VarVar(irts.irt()); (void) new VarInt(irts.irt()); (void) new VarVarSharedA(irts.irt()); (void) new VarVarSharedB(irts.irt()); (void) new VarVarSharedC(irts.irt()); } } }; Create c; //@} } }} // STATISTICS: test-int gecode-4.2.1/test/int/cumulative.cpp0000644000175000010010000004706212216041354016523 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2009 * * Last modified: * $Date: 2013-09-17 13:54:20 +0200 (Tue, 17 Sep 2013) $ by $Author: tack $ * $Revision: 14006 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include namespace Test { namespace Int { /// Tests for cumulative scheduling constraints namespace Cumulative { /** * \defgroup TaskTestIntCumulative Cumulative scheduling constraints * \ingroup TaskTestInt */ //@{ /// Test for cumulative constraint with mandatory tasks class ManFixPCumulative : public Test { protected: /// Capacity of resource int c; /// The processing times Gecode::IntArgs p; /// The resource usage Gecode::IntArgs u; /// Get a reasonable maximal start time static int st(int c, const Gecode::IntArgs& p, const Gecode::IntArgs& u) { double e = 0; for (int i=p.size(); i--; ) e += static_cast(p[i])*u[i]; return e / std::max(1,std::abs(c)); } /// Offset int o; public: /// Create and register test ManFixPCumulative(int c0, const Gecode::IntArgs& p0, const Gecode::IntArgs& u0, int o0) : Test("Cumulative::Man::Fix::"+str(o0)+"::"+ str(c0)+"::"+str(p0)+"::"+str(u0), (c0 >= 0) ? p0.size():p0.size()+1,0,st(c0,p0,u0)), c(c0), p(p0), u(u0), o(o0) { testsearch = false; testfix = false; contest = CTL_NONE; } /// Create and register initial assignment virtual Assignment* assignment(void) const { return new RandomAssignment(arity,dom,500); } /// Test whether \a x is solution virtual bool solution(const Assignment& x) const { int cmax = (c >= 0) ? c : x[x.size()-1]; int n = (c >= 0) ? x.size() : x.size()-1; if (c < 0 && x[n] > -c) return false; // Compute maximal time int t = 0; for (int i=0; i cmax) { delete [] used; return false; } // Compute resource usage (only internal) for (int i=0; i cmax) { delete [] used; return false; } delete [] used; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { int n = (c >= 0) ? x.size() : x.size()-1; Gecode::IntVarArgs xx; if (o==0) { xx=x.slice(0,1,n); } else { xx=Gecode::IntVarArgs(n); for (int i=n; i--;) xx[i]=Gecode::expr(home,x[i]+o,Gecode::ICL_DOM); } if (c >= 0) { Gecode::cumulative(home, c, xx, p, u); } else { Gecode::rel(home, x[n] <= -c); Gecode::cumulative(home, x[n], xx, p, u); } } }; /// Test for cumulative constraint with optional tasks class OptFixPCumulative : public Test { protected: /// Capacity of resource int c; /// The processing times Gecode::IntArgs p; /// The resource usage Gecode::IntArgs u; /// Limit for optional tasks int l; /// Offset int o; /// Get a reasonable maximal start time static int st(int c, const Gecode::IntArgs& p, const Gecode::IntArgs& u) { double e = 0; for (int i=p.size(); i--; ) e += static_cast(p[i])*u[i]; return e / std::max(1,std::abs(c)); } public: /// Create and register test OptFixPCumulative(int c0, const Gecode::IntArgs& p0, const Gecode::IntArgs& u0, int o0) : Test("Cumulative::Opt::Fix::"+str(o0)+"::"+ str(c0)+"::"+str(p0)+"::"+str(u0), (c0 >= 0) ? 2*p0.size() : 2*p0.size()+1,0,st(c0,p0,u0)), c(c0), p(p0), u(u0), l(st(c,p,u)/2), o(o0) { testsearch = false; testfix = false; contest = CTL_NONE; } /// Create and register initial assignment virtual Assignment* assignment(void) const { return new RandomAssignment(arity,dom,500); } /// Test whether \a x is solution virtual bool solution(const Assignment& x) const { int nn = (c >= 0) ? x.size() : x.size()-1; int cmax = (c >= 0) ? c : x[nn]; if (c < 0 && x[nn] > -c) return false; int n = nn / 2; // Compute maximal time int t = 0; for (int i=0; i l) for (int t=0; t cmax) { delete [] used; return false; } } // Compute resource usage (only internal) for (int i=0; i l) { for (int t=1; t l) if (used[x[i]]+u[i] > cmax) { delete [] used; return false; } delete [] used; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { int nn=(c >= 0) ? x.size() : x.size()-1; int n=nn / 2; Gecode::IntVarArgs s(n); Gecode::BoolVarArgs m(n); for (int i=0; i= 0) ? x[i] : Gecode::expr(home,x[i]+o,Gecode::ICL_DOM); m[i]=Gecode::expr(home, x[n+i] > l); } if (c >= 0) { Gecode::cumulative(home, c, s, p, u, m); } else { Gecode::rel(home, x[nn] <= -c); Gecode::cumulative(home, x[nn], s, p, u, m); } } }; /// Test for cumulative constraint with flexible mandatory tasks class ManFlexCumulative : public Test { protected: /// Capacity of resource int c; /// Minimum processing time int _minP; /// Maximum processing time int _maxP; /// The resource usage Gecode::IntArgs u; /// Get a reasonable maximal start time static int st(int c, int maxP, const Gecode::IntArgs& u) { double e = 0; for (int i=u.size(); i--; ) e += static_cast(maxP)*u[i]; return e / std::max(1,std::abs(c)); } /// Offset int o; public: /// Create and register test ManFlexCumulative(int c0, int minP, int maxP, const Gecode::IntArgs& u0, int o0) : Test("Cumulative::Man::Flex::"+str(o0)+"::"+ str(c0)+"::"+str(minP)+"::"+str(maxP)+"::"+str(u0), (c0 >= 0) ? 2*u0.size() : 2*u0.size()+1, 0,std::max(maxP,st(c0,maxP,u0))), c(c0), _minP(minP), _maxP(maxP), u(u0), o(o0) { testsearch = false; testfix = false; contest = CTL_NONE; } /// Create and register initial assignment virtual Assignment* assignment(void) const { return new RandomMixAssignment((c >= 0) ? arity/2 : arity/2+1, dom,arity/2, Gecode::IntSet(_minP,_maxP),500); } /// Test whether \a x is solution virtual bool solution(const Assignment& x) const { int nn = (c >= 0) ? x.size() : x.size()-1; int n = nn/2; int cmax = (c >= 0) ? c : x[n]; int pstart = (c >= 0) ? n : n+1; if (c < 0 && cmax > -c) return false; // Compute maximal time int t = 0; for (int i=0; i cmax) { delete [] used; return false; } // Compute resource usage (only internal) for (int i=0; i cmax) { delete [] used; return false; } delete [] used; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { int nn = (c >= 0) ? x.size() : x.size()-1; int n = nn/2; int pstart = (c >= 0) ? n : n+1; Gecode::IntVarArgs s(n); Gecode::IntVarArgs px(x.slice(pstart,1,n)); Gecode::IntVarArgs e(home,n, Gecode::Int::Limits::min, Gecode::Int::Limits::max); for (int i=s.size(); i--;) { s[i] = expr(home, o+x[i], Gecode::ICL_DOM); rel(home, s[i]+px[i] == e[i]); rel(home, _minP <= px[i]); rel(home, _maxP >= px[i]); } if (c >= 0) { Gecode::cumulative(home, c, s, px, e, u); } else { rel(home, x[n] <= -c); Gecode::cumulative(home, x[n], s, px, e, u); } } }; /// Test for cumulative constraint with optional flexible tasks class OptFlexCumulative : public Test { protected: /// Capacity of resource int c; /// Minimum processing time int _minP; /// Maximum processing time int _maxP; /// The resource usage Gecode::IntArgs u; /// Limit for optional tasks int l; /// Offset int o; /// Get a reasonable maximal start time static int st(int c, int maxP, const Gecode::IntArgs& u) { double e = 0; for (int i=u.size(); i--; ) e += static_cast(maxP)*u[i]; return e / std::max(1,std::abs(c)); } public: /// Create and register test OptFlexCumulative(int c0, int minP, int maxP, const Gecode::IntArgs& u0, int o0) : Test("Cumulative::Opt::Flex::"+str(o0)+"::"+ str(c0)+"::"+str(minP)+"::"+str(maxP)+"::"+str(u0), (c0 >= 0) ? 3*u0.size() : 3*u0.size()+1, 0,std::max(maxP,st(c0,maxP,u0))), c(c0), _minP(minP), _maxP(maxP), u(u0), l(std::max(maxP,st(c0,maxP,u0))/2), o(o0) { testsearch = false; testfix = false; contest = CTL_NONE; } /// Create and register initial assignment virtual Assignment* assignment(void) const { return new RandomMixAssignment((c >= 0) ? 2*(arity/3) : 2*(arity/3)+1, dom,arity/3, Gecode::IntSet(_minP,_maxP),500); } /// Test whether \a x is solution virtual bool solution(const Assignment& x) const { int nn = (c >= 0) ? x.size() : x.size()-1; int n = nn / 3; int cmax = (c >= 0) ? c : x[2*n]; int pstart = (c >= 0) ? 2*n : 2*n+1; if (c < 0 && cmax > -c) return false; // Compute maximal time int t = 0; for (int i=0; i l) for (int t=0; t cmax) { delete [] used; return false; } // Compute resource usage (only internal) for (int i=0; i l) for (int t=1; t l && used[x[i]]+u[i] > cmax) { delete [] used; return false; } delete [] used; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { int nn = (c >= 0) ? x.size() : x.size()-1; int n=nn / 3; int pstart= (c >= 0) ? 2*n : 2*n+1; Gecode::IntVarArgs s(n); Gecode::IntVarArgs px(n); Gecode::IntVarArgs e(home,n, Gecode::Int::Limits::min, Gecode::Int::Limits::max); for (int i=n; i--;) { s[i] = expr(home, o+x[i]); px[i] = x[pstart+i]; rel(home, s[i]+px[i] == e[i]); rel(home, _minP <= px[i]); rel(home, _maxP >= px[i]); } Gecode::BoolVarArgs m(n); for (int i=0; i l)); if (c >= 0) { Gecode::cumulative(home, c, s, px, e, u, m); } else { Gecode::rel(home, x[2*n] <= -c); Gecode::cumulative(home, x[2*n], s, px, e, u, m); } } }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { using namespace Gecode; IntArgs p1(4, 1,1,1,1); IntArgs p2(4, 2,2,2,2); IntArgs p3(4, 4,3,3,5); IntArgs p4(4, 4,0,3,5); IntArgs u1(4, 1,1,1,1); IntArgs u2(4, 2,2,2,2); IntArgs u3(4, 2,3,4,5); IntArgs u4(4, 2,3,0,5); // Regression test: check correct detection of disjunctive case IntArgs p5(3, 1,1,1); IntArgs u5(3, 1,3,2); (void) new ManFixPCumulative(3,p5,u5,0); for (int c=-7; c<8; c++) { int off = 0; for (int coff=0; coff<2; coff++) { (void) new ManFixPCumulative(c,p1,u1,off); (void) new ManFixPCumulative(c,p1,u2,off); (void) new ManFixPCumulative(c,p1,u3,off); (void) new ManFixPCumulative(c,p1,u4,off); (void) new ManFixPCumulative(c,p2,u1,off); (void) new ManFixPCumulative(c,p2,u2,off); (void) new ManFixPCumulative(c,p2,u3,off); (void) new ManFixPCumulative(c,p2,u4,off); (void) new ManFixPCumulative(c,p3,u1,off); (void) new ManFixPCumulative(c,p3,u2,off); (void) new ManFixPCumulative(c,p3,u3,off); (void) new ManFixPCumulative(c,p3,u4,off); (void) new ManFixPCumulative(c,p4,u1,off); (void) new ManFixPCumulative(c,p4,u2,off); (void) new ManFixPCumulative(c,p4,u3,off); (void) new ManFixPCumulative(c,p4,u4,off); (void) new ManFlexCumulative(c,0,1,u1,off); (void) new ManFlexCumulative(c,0,1,u2,off); (void) new ManFlexCumulative(c,0,1,u3,off); (void) new ManFlexCumulative(c,0,1,u4,off); (void) new ManFlexCumulative(c,0,2,u1,off); (void) new ManFlexCumulative(c,0,2,u2,off); (void) new ManFlexCumulative(c,0,2,u3,off); (void) new ManFlexCumulative(c,0,2,u4,off); (void) new ManFlexCumulative(c,3,5,u1,off); (void) new ManFlexCumulative(c,3,5,u2,off); (void) new ManFlexCumulative(c,3,5,u3,off); (void) new ManFlexCumulative(c,3,5,u4,off); (void) new OptFixPCumulative(c,p1,u1,off); (void) new OptFixPCumulative(c,p1,u2,off); (void) new OptFixPCumulative(c,p1,u3,off); (void) new OptFixPCumulative(c,p1,u4,off); (void) new OptFixPCumulative(c,p2,u1,off); (void) new OptFixPCumulative(c,p2,u2,off); (void) new OptFixPCumulative(c,p2,u3,off); (void) new OptFixPCumulative(c,p2,u4,off); (void) new OptFixPCumulative(c,p3,u1,off); (void) new OptFixPCumulative(c,p3,u2,off); (void) new OptFixPCumulative(c,p3,u3,off); (void) new OptFixPCumulative(c,p3,u4,off); (void) new OptFixPCumulative(c,p4,u1,off); (void) new OptFixPCumulative(c,p4,u2,off); (void) new OptFixPCumulative(c,p4,u3,off); (void) new OptFixPCumulative(c,p4,u4,off); (void) new OptFlexCumulative(c,0,1,u1,off); (void) new OptFlexCumulative(c,0,1,u2,off); (void) new OptFlexCumulative(c,0,1,u3,off); (void) new OptFlexCumulative(c,0,1,u4,off); (void) new OptFlexCumulative(c,0,2,u1,off); (void) new OptFlexCumulative(c,0,2,u2,off); (void) new OptFlexCumulative(c,0,2,u3,off); (void) new OptFlexCumulative(c,0,2,u4,off); (void) new OptFlexCumulative(c,3,5,u1,off); (void) new OptFlexCumulative(c,3,5,u2,off); (void) new OptFlexCumulative(c,3,5,u3,off); (void) new OptFlexCumulative(c,3,5,u4,off); off = Gecode::Int::Limits::min; } } } }; Create c; //@} } }} // STATISTICS: test-int gecode-4.2.1/test/int/cumulatives.cpp0000644000175000010010000002166212022337225016704 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Mikael Lagerkvist * * Copyright: * Mikael Lagerkvist, 2005 * * Last modified: * $Date: 2012-09-07 11:29:57 +0200 (Fri, 07 Sep 2012) $ by $Author: schulte $ * $Revision: 13061 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include #include #include #include #include #include namespace Test { namespace Int { /// %Tests for scheduling constraints namespace Cumulatives { /** * \defgroup TaskTestIntCumulatives Cumnulatives scheduling constraint * \ingroup TaskTestInt */ //@{ /** * \brief Script for generating assignments. * * We are only interested in assignments that represent tasks (s_i, * d_i, e_i, h_i) such that the following hold: * - The task starts at a positive time and has some extension. * - The equation s_i + d_i = e_i holds. * - The tasks are ordered to remove some symmetries, i.e., * s_i <= s_{i+1} */ class Ass : public Gecode::Space { public: /// Store task information Gecode::IntVarArray x; /// Initialize model for assignments Ass(int n, const Gecode::IntSet& d) : x(*this, n, d) { using namespace Gecode; for (int i = 0; i < n; i += 4) { rel(*this, x[i+0] >= 0); rel(*this, x[i+1] >= 0); rel(*this, x[i+2] >= 0); rel(*this, x[i] + x[i+1] == x[i+2]); branch(*this, x, INT_VAR_NONE(), INT_VAL_MIN()); } } /// Constructor for cloning \a s Ass(bool share, Ass& s) : Gecode::Space(share,s) { x.update(*this, share, s.x); } /// Create copy during cloning virtual Gecode::Space* copy(bool share) { return new Ass(share,*this); } }; /// Class for generating reasonable assignments class CumulativeAssignment : public Assignment { /// Current assignment Ass* cur; /// Next assignment Ass* nxt; /// Search engine to find assignments Gecode::DFS* e; public: /// Initialize assignments for \a n0 variables and values \a d0 CumulativeAssignment(int n, const Gecode::IntSet& d) : Assignment(n,d) { Ass* a = new Ass(n, d); e = new Gecode::DFS(a); delete a; nxt = cur = e->next(); if (cur != NULL) nxt = e->next(); } /// %Test whether all assignments have been iterated virtual bool operator()(void) const { return nxt != NULL; } /// Move to next assignment virtual void operator++(void) { delete cur; cur = nxt; if (cur != NULL) nxt = e->next(); } /// Return value for variable \a i virtual int operator[](int i) const { assert((i>=0) && (ix[i].val(); } /// Destructor virtual ~CumulativeAssignment(void) { delete cur; delete nxt; delete e; } }; /// %Event to be scheduled class Event { public: int p, h; ///< Position and height of event bool start; ///< Whether event has just started /// Initialize event Event(int pos, int height, bool s) : p(pos), h(height), start(s) {} /// %Test whether this event is before event \a e bool operator<(const Event& e) const { return p= limit; } }; /// Check whether event \a e is valid template bool valid(std::vector e, C comp) { std::sort(e.begin(), e.end()); unsigned int i = 0; int p = 0; int h = 0; int n = 0; while (i < e.size()) { p = e[i].p; while (i < e.size() && e[i].p == p) { h += e[i].h; n += (e[i].start ? +1 : -1); ++i; } if (n && !comp(h)) return false; } return true; } /// %Test for cumulatives constraint class Cumulatives : public Test { protected: int ntasks; ///< Number of tasks bool at_most; ///< Whether to use atmost reasoning int limit; ///< Limit public: /// Create and register test Cumulatives(const std::string& s, int nt, bool am, int l) : Test("Cumulatives::"+s,nt*4,-1,2), ntasks(nt), at_most(am), limit(l) { testsearch = false; } /// Create first assignment virtual Assignment* assignment(void) const { assert(arity == 4*ntasks); return new CumulativeAssignment(arity, dom); } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { std::vector e; for (int i = 0; i < ntasks; ++i) { int p = i*4; // Positive start, duration and end if (x[p+0] < 0 || x[p+1] < 1 || x[p+2] < 1) return false; // Start + Duration == End if (x[p+0] + x[p+1] != x[p+2]) { return false; } } for (int i = 0; i < ntasks; ++i) { int p = i*4; // Up at start, down at end. e.push_back(Event(x[p+0], +x[p+3], true)); e.push_back(Event(x[p+2], -x[p+3], false)); } if (at_most) { return valid(e, Below(limit)); } else { return valid(e, Above(limit)); } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; IntArgs m(ntasks), l(1, limit); IntVarArgs s(ntasks), d(ntasks), e(ntasks), h(ntasks); for (int i = 0; i < ntasks; ++i) { int p = i*4; m[i] = 0; s[i] = x[p+0]; rel(home, x[p+0], Gecode::IRT_GQ, 0); d[i] = x[p+1]; rel(home, x[p+1], Gecode::IRT_GQ, 1); e[i] = x[p+2]; rel(home, x[p+2], Gecode::IRT_GQ, 1); h[i] = x[p+3]; } cumulatives(home, m, s, d, e, h, l, at_most); } }; Cumulatives c1t1("1t1", 1, true, 1); Cumulatives c1f1("1f1", 1, false, 1); Cumulatives c1t2("1t2", 1, true, 2); Cumulatives c1f2("1f2", 1, false, 2); Cumulatives c1t3("1t3", 1, true, 3); Cumulatives c1f3("1f3", 1, false, 3); Cumulatives c2t1("2t1", 2, true, 1); Cumulatives c2f1("2f1", 2, false, 1); Cumulatives c2t2("2t2", 2, true, 2); Cumulatives c2f2("2f2", 2, false, 2); Cumulatives c2t3("2t3", 2, true, 3); Cumulatives c2f3("2f3", 2, false, 3); Cumulatives c3t1("3t1", 3, true, 1); Cumulatives c3f1("3f1", 3, false, 1); Cumulatives c3t2("3t2", 3, true, 2); Cumulatives c3f2("3f2", 3, false, 2); Cumulatives c3t3("3t3", 3, true, 3); Cumulatives c3f3("3f3", 3, false, 3); Cumulatives c3t_1("3t-1", 3, true, -1); Cumulatives c3f_1("3f-1", 3, false, -1); Cumulatives c3t_2("3t-2", 3, true, -2); Cumulatives c3f_2("3f-2", 3, false, -2); Cumulatives c3t_3("3t-3", 3, true, -3); Cumulatives c3f_3("3f-3", 3, false, -3); //@} } }} // STATISTICS: test-int gecode-4.2.1/test/int/distinct.cpp0000755000175000010010000002055112120430051016151 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Mikael Lagerkvist * * Copyright: * Christian Schulte, 2005 * Mikael Lagerkvist, 2006 * * Last modified: * $Date: 2013-03-14 21:16:41 +0100 (Thu, 14 Mar 2013) $ by $Author: schulte $ * $Revision: 13539 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" namespace Test { namespace Int { /// %Tests for distinct constraints namespace Distinct { /** * \defgroup TaskTestIntDistinct Distinct constraints * \ingroup TaskTestInt */ //@{ /// Simple test for distinct constraint template class Distinct : public Test { public: /// Create and register test Distinct(const Gecode::IntSet& d0, Gecode::IntConLevel icl) : Test(std::string(useCount ? "Count::Distinct::" : "Distinct::")+ str(icl)+"::Sparse",6,d0,false,icl) {} /// Create and register test Distinct(int min, int max, Gecode::IntConLevel icl) : Test(std::string(useCount ? "Count::Distinct::" : "Distinct::")+ str(icl)+"::Dense",6,min,max,false,icl) {} /// Check whether \a x is solution virtual bool solution(const Assignment& x) const { for (int i=0; istatus() == SS_FAILED) { delete s; return false; } for (int i=0; istatus() == SS_FAILED) { delete s; return false; } for (int i=0; i dom_d(-3,3,Gecode::ICL_DOM); Distinct bnd_d(-3,3,Gecode::ICL_BND); Distinct val_d(-3,3,Gecode::ICL_VAL); Distinct dom_s(d,Gecode::ICL_DOM); Distinct bnd_s(d,Gecode::ICL_BND); Distinct val_s(d,Gecode::ICL_VAL); Distinct count_dom_d(-3,3,Gecode::ICL_DOM); Distinct count_bnd_d(-3,3,Gecode::ICL_BND); Distinct count_val_d(-3,3,Gecode::ICL_VAL); Distinct count_dom_s(d,Gecode::ICL_DOM); Distinct count_bnd_s(d,Gecode::ICL_BND); Distinct count_val_s(d,Gecode::ICL_VAL); Offset dom_od(-3,3,Gecode::ICL_DOM); Offset bnd_od(-3,3,Gecode::ICL_BND); Offset val_od(-3,3,Gecode::ICL_VAL); Offset dom_os(d,Gecode::ICL_DOM); Offset bnd_os(d,Gecode::ICL_BND); Offset val_os(d,Gecode::ICL_VAL); Random dom_r(20,-50,50,Gecode::ICL_DOM); Random bnd_r(50,-500,500,Gecode::ICL_BND); Random val_r(50,-500,500,Gecode::ICL_VAL); Pathological p_16_v(16,Gecode::ICL_VAL); Pathological p_16_b(16,Gecode::ICL_BND); Pathological p_16_d(16,Gecode::ICL_DOM); Pathological p_32_v(32,Gecode::ICL_VAL); Pathological p_32_b(32,Gecode::ICL_BND); Pathological p_32_d(32,Gecode::ICL_DOM); //@} } }} // STATISTICS: test-int gecode-4.2.1/test/int/dom.cpp0000755000175000010010000001307611665203125015130 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2005 * * Last modified: * $Date: 2011-11-29 17:20:37 +0100 (Tue, 29 Nov 2011) $ by $Author: schulte $ * $Revision: 12486 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" namespace Test { namespace Int { /// %Tests for domain constraints namespace Dom { /** * \defgroup TaskTestIntDom Domain constraints * \ingroup TaskTestInt */ //@{ /// %Test for domain constraint (integer) class DomInt : public Test { public: /// Create and register test DomInt(int n) : Test("Dom::Int::"+str(n),n,-4,4,n == 1) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { for (int i=x.size(); i--; ) if (x[i] != -2) return false; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { if (x.size() == 1) Gecode::dom(home, x[0], -2); else Gecode::dom(home, x, -2); } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { assert(x.size() == 1); Gecode::dom(home, x[0], -2, r); } }; /// %Test for domain constraint (range) class DomRange : public Test { public: /// Create and register test DomRange(int n) : Test("Dom::Range::"+str(n),n,-4,4,n == 1) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { for (int i=x.size(); i--; ) if ((x[i] < -2) || (x[i] > 2)) return false; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { if (x.size() == 1) Gecode::dom(home, x[0], -2, 2); else Gecode::dom(home, x, -2, 2); } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { assert(x.size() == 1); Gecode::dom(home, x[0], -2, 2, r); } }; /// %Test for domain constraint (empty range) class DomRangeEmpty : public Test { public: /// Create and register test DomRangeEmpty(void) : Test("Dom::Range::Empty",1,-4,4,true) {} /// %Test whether \a x is solution virtual bool solution(const Assignment&) const { return false; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray&) { home.fail(); } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { Gecode::dom(home, x[0], 3, 2, r); } }; const int r[4][2] = { {-4,-3},{-1,-1},{1,1},{3,5} }; Gecode::IntSet d(r,4); /// %Test for domain constraint (full integer set) class DomDom : public Test { public: /// Create and register test DomDom(int n) : Test("Dom::Dom::"+str(n),n,-6,6,n == 1) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { for (int i=x.size(); i--; ) if (!(((x[i] >= -4) && (x[i] <= -3)) || ((x[i] >= -1) && (x[i] <= -1)) || ((x[i] >= 1) && (x[i] <= 1)) || ((x[i] >= 3) && (x[i] <= 5)))) return false; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { if (x.size() == 1) Gecode::dom(home, x[0], d); else Gecode::dom(home, x, d); } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { assert(x.size() == 1); Gecode::dom(home, x[0], d, r); } }; DomInt di1(1); DomInt di3(3); DomRange dr1(1); DomRange dr3(3); DomDom dd1(1); DomDom dd3(3); DomRangeEmpty dre; //@} } }} // STATISTICS: test-int gecode-4.2.1/test/int/element.cpp0000755000175000010010000005202011357330563015777 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2005 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ by $Author: schulte $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include #include namespace Test { namespace Int { /// %Tests for element constraints namespace Element { /** * \defgroup TaskTestIntElement Element constraints * \ingroup TaskTestInt */ //@{ /// %Test for element with integer array and integer variables class IntIntVar : public Test { protected: /// Array of integers Gecode::IntArgs c; public: /// Create and register test IntIntVar(const std::string& s, const Gecode::IntArgs& c0, int min, int max) : Test("Element::Int::Int::Var::"+s,2,min,max), c(c0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return (x[0]>= 0) && (x[0]= 0) && (x[0]= 0) && (x[0]= 0) && (x[0]= 0) && (x[0]= 0) && (x[0]= 0) && (x[0]= 0) && (x[0]1)) return false; return ((x[0]>= 0) && (x[0]=0) && (x[1]<=1)); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; BoolVarArgs c(x.size()-2); for (int i=0; i1)) return false; return ((x[0]>= 0) && (x[0] 2) || (x[1] > 1)) return false; Matrix m(tm,3,2); return m(x[0],x[1]) == x[2]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { // x-coordinate: x[0], y-coordinate: x[1], result: x[2] using namespace Gecode; Matrix m(tm,3,2); element(home, m, x[0], x[1], x[2]); } }; /// %Test for matrix element with integer array and integer variable class MatrixIntIntVarXX : public Test { protected: /// Array for test matrix Gecode::IntArgs tm; public: /// Create and register test MatrixIntIntVarXX(void) : Test("Element::Matrix::Int::IntVar::XX",2,0,3,false), tm(4, 0,1,2,3) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { // x-coordinate: x[0], y-coordinate: x[0], result: x[1] using namespace Gecode; if (x[0] > 1) return false; Matrix m(tm,2,2); return m(x[0],x[0]) == x[1]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { // x-coordinate: x[0], y-coordinate: x[0], result: x[1] using namespace Gecode; Matrix m(tm,2,2); element(home, m, x[0], x[0], x[1]); } }; /// %Test for matrix element with integer array and Boolean variable class MatrixIntBoolVarXY : public Test { protected: /// Array for test matrix Gecode::IntArgs tm; public: /// Create and register test MatrixIntBoolVarXY(void) : Test("Element::Matrix::Int::BoolVar::XY",3,0,3,false), tm(4, 0,1,1,0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { // x-coordinate: x[0], y-coordinate: x[1], result: x[2] using namespace Gecode; if ((x[0] > 1) || (x[1] > 1)) return false; Matrix m(tm,2,2); return m(x[0],x[1]) == x[2]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { // x-coordinate: x[0], y-coordinate: x[1], result: x[2] using namespace Gecode; Matrix m(tm,2,2); element(home, m, x[0], x[1], channel(home,x[2])); } }; /// %Test for matrix element with integer array and Boolean variable class MatrixIntBoolVarXX : public Test { protected: /// Array for test matrix Gecode::IntArgs tm; public: /// Create and register test MatrixIntBoolVarXX(void) : Test("Element::Matrix::Int::BoolVar::XX",2,0,3,false), tm(4, 0,1,1,0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { // x-coordinate: x[0], y-coordinate: x[0], result: x[1] using namespace Gecode; if (x[0] > 1) return false; Matrix m(tm,2,2); return m(x[0],x[0]) == x[1]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { // x-coordinate: x[0], y-coordinate: x[0], result: x[1] using namespace Gecode; Matrix m(tm,2,2); element(home, m, x[0], x[0], channel(home,x[1])); } }; /// %Test for matrix element with integer variable array and integer variable class MatrixIntVarIntVarXY : public Test { public: /// Create and register test MatrixIntVarIntVarXY(void) : Test("Element::Matrix::IntVar::IntVar::XY",3+4,0,3,false) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { // x-coordinate: x[0], y-coordinate: x[1], result: x[2] // remaining: matrix using namespace Gecode; if ((x[0] > 1) || (x[1] > 1)) return false; IntArgs tm(4); tm[0]=x[3]; tm[1]=x[4]; tm[2]=x[5]; tm[3]=x[6]; Matrix m(tm,2,2); return m(x[0],x[1]) == x[2]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { // x-coordinate: x[0], y-coordinate: x[1], result: x[2] using namespace Gecode; IntVarArgs tm(4); tm[0]=x[3]; tm[1]=x[4]; tm[2]=x[5]; tm[3]=x[6]; Matrix m(tm,2,2); element(home, m, x[0], x[1], x[2]); } }; /// %Test for matrix element with integer variable array and integer variable class MatrixIntVarIntVarXX : public Test { public: /// Create and register test MatrixIntVarIntVarXX(void) : Test("Element::Matrix::IntVar::IntVar::XX",2+4,0,3,false) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { // x-coordinate: x[0], y-coordinate: x[0], result: x[1] // remaining: matrix using namespace Gecode; if (x[0] > 1) return false; IntArgs tm(4); tm[0]=x[2]; tm[1]=x[3]; tm[2]=x[4]; tm[3]=x[5]; Matrix m(tm,2,2); return m(x[0],x[0]) == x[1]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { // x-coordinate: x[0], y-coordinate: x[1], result: x[1] using namespace Gecode; IntVarArgs tm(4); tm[0]=x[2]; tm[1]=x[3]; tm[2]=x[4]; tm[3]=x[5]; Matrix m(tm,2,2); element(home, m, x[0], x[0], x[1]); } }; /// %Test for matrix element with Boolean variable array and Boolean variable class MatrixBoolVarBoolVarXY : public Test { public: /// Create and register test MatrixBoolVarBoolVarXY(void) : Test("Element::Matrix::BoolVar::BoolVar::XY",3+4,0,1,false) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { // x-coordinate: x[0], y-coordinate: x[1], result: x[2] // remaining: matrix using namespace Gecode; IntArgs tm(4); tm[0]=x[3]; tm[1]=x[4]; tm[2]=x[5]; tm[3]=x[6]; Matrix m(tm,2,2); return m(x[0],x[1]) == x[2]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { // x-coordinate: x[0], y-coordinate: x[1], result: x[2] using namespace Gecode; BoolVarArgs tm(4); tm[0]=channel(home,x[3]); tm[1]=channel(home,x[4]); tm[2]=channel(home,x[5]); tm[3]=channel(home,x[6]); Matrix m(tm,2,2); element(home, m, x[0], x[1], channel(home,x[2])); } }; /// %Test for matrix element with Boolean variable array and Boolean variable class MatrixBoolVarBoolVarXX : public Test { public: /// Create and register test MatrixBoolVarBoolVarXX(void) : Test("Element::Matrix::BoolVar::BoolVar::XX",2+4,0,1,false) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { // x-coordinate: x[0], y-coordinate: x[0], result: x[1] // remaining: matrix using namespace Gecode; IntArgs tm(4); tm[0]=x[2]; tm[1]=x[3]; tm[2]=x[4]; tm[3]=x[5]; Matrix m(tm,2,2); return m(x[0],x[0]) == x[1]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { // x-coordinate: x[0], y-coordinate: x[1], result: x[1] using namespace Gecode; BoolVarArgs tm(4); tm[0]=channel(home,x[2]); tm[1]=channel(home,x[3]); tm[2]=channel(home,x[4]); tm[3]=channel(home,x[5]); Matrix m(tm,2,2); element(home, m, x[0], x[0], channel(home,x[1])); } }; /// Help class to create and register tests class Create { public: /// %Test size-dependent optimizations void optimized(int idx, int val) { Gecode::IntArgs c(idx); for (int i=0; i * * Copyright: * Christian Schulte, 2009 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ by $Author: schulte $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include namespace Test { namespace Int { /// %Tests for synchronized execution namespace Exec { /** * \defgroup TaskTestIntExec Synchronized execution * \ingroup TaskTestInt */ //@{ /// Simple test for wait (integer variables) class IntWait : public Test { public: /// Create and register test IntWait(int n) : Test("Wait::Int::"+str(n),n,0,n,false) {} /// Check whether \a x is solution virtual bool solution(const Assignment& x) const { for (int i=0; i 1) Gecode::wait(home, x, &c); else Gecode::wait(home, x[0], &c); } /// Continuation to be executed static void c(Gecode::Space& _home) { TestSpace& home = static_cast(_home); for (int i=0; i 1) Gecode::wait(home, b, &c); else Gecode::wait(home, b[0], &c); } /// Continuation to be executed static void c(Gecode::Space& _home) { TestSpace& home = static_cast(_home); int t=0; for (int i=0; i * Christian Schulte * * Copyright: * Mikael Lagerkvist, 2007 * Christian Schulte, 2005 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ by $Author: schulte $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include #include namespace Test { namespace Int { /// %Tests for extensional (relation) constraints namespace Extensional { /** * \defgroup TaskTestIntExtensional Extensional (relation) constraints * \ingroup TaskTestInt */ //@{ /// %Test with simple regular expression class RegSimpleA : public Test { public: /// Create and register test RegSimpleA(void) : Test("Extensional::Reg::Simple::A",4,2,2) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return (((x[0] == 0) || (x[0] == 2)) && ((x[1] == -1) || (x[1] == 1)) && ((x[2] == 0) || (x[2] == 1)) && ((x[3] == 0) || (x[3] == 1))); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; extensional(home, x, (REG(0) | REG(2)) + (REG(-1) | REG(1)) + (REG(7) | REG(0) | REG(1)) + (REG(0) | REG(1))); } }; /// %Test with simple regular expression class RegSimpleB : public Test { public: /// Create and register test RegSimpleB(void) : Test("Extensional::Reg::Simple::B",4,2,2) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return (x[0] s) return false; for (int i = 0; i < 2; ++i, ++pos) if (x[pos] != 1) return false; if (pos + 2 > s) return false; for (int i = 0; i < 1; ++i, ++pos) if (x[pos] != 0) return false; while (pos < s && x[pos] == 0) ++pos; if (pos + 1 > s) return false; for (int i = 0; i < 1; ++i, ++pos) if (x[pos] != 1) return false; while (pos < s) if (x[pos++] != 0) return false; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; extensional(home, x, *REG(0) + REG(1)(2,2) + +REG(0) + REG(1)(1,1) + *REG(0)); } }; /// %Test with regular expression for distinct constraint class RegDistinct : public Test { public: /// Create and register test RegDistinct(void) : Test("Extensional::Reg::Distinct",4,-1,4) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { for (int i=0; i 3)) return false; for (int j=i+1; j 1) && (x[n-2] == 0)) || ((n > 0) && (x[n-1] == 0)); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; REG r0(0), r1(1); REG r01 = r0 | r1; extensional(home, x, *r01 + r0 + r01(0,1)); } }; /// %Test with simple regular expression and shared variables (uses unsharing) class RegSharedA : public Test { public: /// Create and register test RegSharedA(void) : Test("Extensional::Reg::Shared::A",4,2,2) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return (((x[0] == 0) || (x[0] == 2)) && ((x[1] == -1) || (x[1] == 1)) && ((x[2] == 0) || (x[2] == 1)) && ((x[3] == 0) || (x[3] == 1))); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; IntVarArgs y(8); for (int i=0; i<4; i++) y[i]=y[i+4]=x[i]; unshare(home,y); extensional(home, y, ((REG(0) | REG(2)) + (REG(-1) | REG(1)) + (REG(7) | REG(0) | REG(1)) + (REG(0) | REG(1)))(2,2)); } }; /// %Test with simple regular expression and shared variables (uses unsharing) class RegSharedB : public Test { public: /// Create and register test RegSharedB(void) : Test("Extensional::Reg::Shared::B",4,2,2) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return (((x[0] == 0) || (x[0] == 2)) && ((x[1] == -1) || (x[1] == 1)) && ((x[2] == 0) || (x[2] == 1)) && ((x[3] == 0) || (x[3] == 1))); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; IntVarArgs y(12); for (int i=0; i<4; i++) y[i]=y[i+4]=y[i+8]=x[i]; unshare(home,y); extensional(home, y, ((REG(0) | REG(2)) + (REG(-1) | REG(1)) + (REG(7) | REG(0) | REG(1)) + (REG(0) | REG(1)))(3,3)); } }; /// %Test with simple regular expression and shared variables (uses unsharing) class RegSharedC : public Test { public: /// Create and register test RegSharedC(void) : Test("Extensional::Reg::Shared::C",4,0,1) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return (x[1]==1) && (x[2]==0) && (x[3]==1); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; Gecode::BoolVarArgs y(8); for (int i=0; i<4; i++) y[i]=y[i+4]=channel(home,x[i]); unshare(home,y); extensional(home,y, ((REG(0) | REG(1)) + REG(1) + REG(0) + REG(1))(2,2)); } }; /// %Test with simple regular expression and shared variables (uses unsharing) class RegSharedD : public Test { public: /// Create and register test RegSharedD(void) : Test("Extensional::Reg::Shared::D",4,0,1) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return (x[1]==1) && (x[2]==0) && (x[3]==1); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; Gecode::BoolVarArgs y(12); for (int i=0; i<4; i++) y[i]=y[i+4]=y[i+8]=channel(home,x[i]); unshare(home, y); extensional(home, y, ((REG(0) | REG(1)) + REG(1) + REG(0) + REG(1))(3,3)); } }; /// %Test for empty DFA class RegEmptyDFA : public Test { public: /// Create and register test RegEmptyDFA(void) : Test("Extensional::Reg::Empty::DFA",1,0,0) { testsearch = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { (void)x; return false; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::DFA d; Gecode::extensional(home, x, d); } }; /// %Test for empty regular expression class RegEmptyREG : public Test { public: /// Create and register test RegEmptyREG(void) : Test("Extensional::Reg::Empty::REG",1,0,0) { testsearch = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { (void)x; return false; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::REG r; Gecode::extensional(home, x, r); } }; /// %Test for optimizations class RegOpt : public Test { protected: /// DFA size characteristic int n; public: /// Create and register test RegOpt(int n0) : Test("Extensional::Reg::Opt::"+str(n0),1,0,15), n(n0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return (x[0] < n) && ((x[0] & 1) == 0); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; DFA::Transition* t = new DFA::Transition[n+1]; DFA::Transition* ti = t; int* f = new int[n+1]; int* fi = f; for (int i=0; ii_state = 0; ti->symbol = i; ti->o_state = i+1; ti++; if ((i & 1) == 0) { *fi = i+1; fi++; } } ti->i_state = -1; *fi = -1; DFA d(0, t, f, false); delete [] t; delete [] f; extensional(home, x, d); } }; /// %Test with tuple set class TupleSetA : public Test { protected: /// Extensional propagation kind Gecode::ExtensionalPropKind epk; public: /// Create and register test TupleSetA(Gecode::ExtensionalPropKind epk0) : Test("Extensional::TupleSet::A::"+str(epk0), 4,1,5,false,Gecode::ICL_DOM), epk(epk0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return ((x[0] == 1 && x[1] == 3 && x[2] == 2 && x[3] == 3) || (x[0] == 2 && x[1] == 1 && x[2] == 2 && x[3] == 4) || (x[0] == 2 && x[1] == 2 && x[2] == 1 && x[3] == 4) || (x[0] == 3 && x[1] == 3 && x[2] == 3 && x[3] == 2) || (x[0] == 4 && x[1] == 3 && x[2] == 4 && x[3] == 1) ); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; TupleSet t; IntArgs t1(4, 2, 1, 2, 4); IntArgs t2(4, 2, 2, 1, 4); IntArgs t3(4, 4, 3, 4, 1); IntArgs t4(4, 1, 3, 2, 3); IntArgs t5(4, 3, 3, 3, 2); t.add(t1); t.add(t1); t.add(t2); t.add(t2); t.add(t3); t.add(t3); t.add(t4); t.add(t4); t.add(t5); t.add(t5); t.add(t5); t.add(t5); t.add(t5); t.add(t5); t.add(t5); t.add(t5); t.finalize(); extensional(home, x, t, epk, ICL_DEF); } }; /// %Test with tuple set class TupleSetB : public Test { mutable Gecode::TupleSet t; protected: /// Extensional propagation kind Gecode::ExtensionalPropKind epk; public: /// Create and register test TupleSetB(Gecode::ExtensionalPropKind epk0) : Test("Extensional::TupleSet::B::"+str(epk0), 4,1,5,false,Gecode::ICL_DOM), epk(epk0) { using namespace Gecode; IntArgs t1 (4, 2, 1, 2, 4); IntArgs t2 (4, 2, 2, 1, 4); IntArgs t3 (4, 4, 3, 4, 1); IntArgs t4 (4, 1, 3, 2, 3); IntArgs t5 (4, 3, 3, 3, 2); IntArgs t6 (4, 5, 1, 4, 4); IntArgs t7 (4, 2, 5, 1, 5); IntArgs t8 (4, 4, 3, 5, 1); IntArgs t9 (4, 1, 5, 2, 5); IntArgs t10(4, 5, 3, 3, 2); t.add(t1); t.add(t2); t.add(t3); t.add(t4); t.add(t5); t.add(t6); t.add(t7); t.add(t8); t.add(t9); t.add(t10); t.finalize(); } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { using namespace Gecode; for (int i = 0; i < t.tuples(); ++i) { TupleSet::Tuple l = t[i]; bool same = true; for (int j = 0; j < t.arity() && same; ++j) if (l[j] != x[j]) same = false; if (same) return true; } return false; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; extensional(home, x, t, epk, ICL_DEF); } }; /// %Test with bool tuple set class TupleSetBool : public Test { mutable Gecode::TupleSet t; protected: /// Extensional propagation kind Gecode::ExtensionalPropKind epk; public: /// Create and register test TupleSetBool(Gecode::ExtensionalPropKind epk0, double prob) : Test("Extensional::TupleSet::Bool::"+str(epk0), 5,0,1,false,Gecode::ICL_DOM), epk(epk0) { using namespace Gecode; CpltAssignment ass(5, IntSet(0, 1)); while (ass()) { if (Base::rand(100) <= prob*100) { IntArgs tuple(5); for (int i = 5; i--; ) tuple[i] = ass[i]; t.add(tuple); } ++ass; } t.finalize(); } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { using namespace Gecode; for (int i = 0; i < t.tuples(); ++i) { TupleSet::Tuple l = t[i]; bool same = true; for (int j = 0; j < t.arity() && same; ++j) if (l[j] != x[j]) same = false; if (same) return true; } return false; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; BoolVarArgs y(x.size()); for (int i = x.size(); i--; ) y[i] = channel(home, x[i]); extensional(home, y, t, epk, ICL_DEF); } }; RegSimpleA ra; RegSimpleB rb; RegSimpleC rc; RegDistinct rd; RegRoland rr1(1); RegRoland rr2(2); RegRoland rr3(3); RegRoland rr4(4); RegSharedA rsa; RegSharedB rsb; RegSharedC rsc; RegSharedD rsd; RegEmptyDFA redfa; RegEmptyREG rereg; RegOpt ro0(CHAR_MAX-1); RegOpt ro1(CHAR_MAX); RegOpt ro2(static_cast(UCHAR_MAX-1)); RegOpt ro3(static_cast(UCHAR_MAX)); RegOpt ro4(SHRT_MAX-1); RegOpt ro5(SHRT_MAX); RegOpt ro6(static_cast(USHRT_MAX-1)); RegOpt ro7(static_cast(USHRT_MAX)); TupleSetA tsam(Gecode::EPK_MEMORY); TupleSetA tsas(Gecode::EPK_SPEED); TupleSetB tsbm(Gecode::EPK_MEMORY); TupleSetB tsbs(Gecode::EPK_SPEED); TupleSetBool tsboolm(Gecode::EPK_MEMORY, 0.3); TupleSetBool tsbools(Gecode::EPK_SPEED, 0.3); //@} } }} // STATISTICS: test-int gecode-4.2.1/test/int/gcc.cpp0000644000175000010010000002411711357330563015105 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Patrick Pekczynski * * Contributing authors: * Christian Schulte * * Copyright: * Patrick Pekczynski, 2005 * Christian Schulte, 2007 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ by $Author: schulte $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" namespace Test { namespace Int { /// %Tests for counting constraints (global cardinality) namespace GCC { /** * \defgroup TaskTestIntGCC Counting constraints (global cardinality) * \ingroup TaskTestInt */ //@{ /// %Test for integer cardinality with min and max for all variables class IntAllMinMax : public Test { public: /// Create and register test IntAllMinMax(Gecode::IntConLevel icl) : Test("GCC::Int::All::MinMax::"+str(icl),4,-1,3,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int n[5]; for (int i=5; i--; ) n[i]=0; for (int i=x.size(); i--; ) n[x[i]+1]++; if (n[2] > 0) return false; for (int i=5; i--;) if (n[i]>2) return false; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; IntArgs values(5); IntSet fixed(0,2); IntSetArgs cards(5); for (int i=0; i<5; i++) { values[i] = i-1; cards[i] = fixed; } cards[2] = IntSet(0,0); count(home, x, cards, values, icl); } }; /// %Test for integer cardinality with min and max for all variables class IntAllMinMaxDef : public Test { public: /// Create and register test IntAllMinMaxDef(Gecode::IntConLevel icl) : Test("GCC::Int::All::MinMaxDef::"+str(icl),4,0,3,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int n[4]; for (int i=4; i--; ) n[i]=0; for (int i=x.size(); i--; ) n[x[i]]++; if (n[2] > 0) return false; for (int i=4; i--;) if (n[i]>2) return false; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; IntSet fixed(0,2); IntSetArgs cards(4); for (int i=0; i<4; i++) { cards[i] = fixed; } cards[2] = IntSet(0,0); count(home, x, cards, icl); } }; /// %Test for integer cardinality with max cardinality for all variables class IntAllMax : public Test { public: /// Create and register test IntAllMax(Gecode::IntConLevel icl) : Test("GCC::Int::All::Max::"+str(icl), 4, 1,2, false, icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int n[2]; for (int i=2; i--; ) n[i] = 0; for (int i=x.size(); i--; ) n[x[i] - 1]++; if (n[0] != 2 || n[1] != 2) return false; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntArgs values(2, 1,2); Gecode::count(home, x, Gecode::IntSet(2,2), values, icl); } }; /// %Test for integer cardinality for some variables template class IntSome : public Test { public: /// Create and register test IntSome(Gecode::IntConLevel icl) : Test(std::string("GCC::Int::Some::")+ (hole ? "::Hole" : "::Full")+str(icl),4,1,4,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int n[4]; for (int i=4; i--; ) n[i]=0; for (int i=x.size(); i--; ) n[x[i]-1]++; if ((n[0] < 2) || (n[1] < 2) || (n[2] > 0) || (n[3] > 0)) return false; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; IntArgs values(2, 1,2); Gecode::IntSet fixed; if (!hole) { fixed = IntSet(0,2); } else { int ish[] = {0,2}; fixed = IntSet(ish,2); } Gecode::IntSetArgs cards(2); cards[0]=fixed; cards[1]=fixed; count(home, x, cards, values, icl); } }; /// %Test for variable cardinality for all cardinality values class VarAll : public Test { protected: /// Number of non-cardinality variables static const int n = 4; public: /// Create and register test VarAll(Gecode::IntConLevel icl) : Test("GCC::Var::All::"+str(icl),7,0,2,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { // Number of cardinality variables int m = x.size()-n; for (int i=0; i 2)) return false; int* card = new int[m]; for (int i=0; i 2)) { delete [] card; return false; } } for (int i=0; irandomArity) testsearch = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { // Number of cardinality variables int m = x.size()-n; int* card = new int[m]; for (int i=0; i n)) { delete [] card; return false; } } for (int i=0; i randomArity) return new RandomAssignment(arity,dom,4000); else return new CpltAssignment(arity,dom); } /// Post constraint on \a xy virtual void post(Gecode::Space& home, Gecode::IntVarArray& xy) { using namespace Gecode; // Number of cardinality variables int m = xy.size()-n; IntVarArgs x(n), y(m); for (int i=0; i(icls.icl()); (void) new IntSome(icls.icl()); (void) new VarAll(icls.icl()); (void) new VarSome("Small",2,-1,3,icls.icl()); (void) new VarSome("Large",3,-1,4,icls.icl()); } } }; Create c; //@} } }} // STATISTICS: test-int gecode-4.2.1/test/int/linear.cpp0000755000175000010010000003407012040006002015577 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2005 * * Last modified: * $Date: 2012-10-18 16:02:42 +0200 (Thu, 18 Oct 2012) $ by $Author: schulte $ * $Revision: 13154 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include namespace Test { namespace Int { /// %Tests for linear constraints namespace Linear { /// Check whether \a a has only one coefficients bool one(const Gecode::IntArgs& a) { for (int i=a.size(); i--; ) if (a[i] != 1) return false; return true; } /** * \defgroup TaskTestIntLinear Linear constraints * \ingroup TaskTestInt */ //@{ /// %Test linear relation over integer variables class IntInt : public Test { protected: /// Coefficients Gecode::IntArgs a; /// Integer relation type to propagate Gecode::IntRelType irt; /// Result int c; public: /// Create and register test IntInt(const std::string& s, const Gecode::IntSet& d, const Gecode::IntArgs& a0, Gecode::IntRelType irt0, int c0, Gecode::IntConLevel icl=Gecode::ICL_BND) : Test("Linear::Int::Int::"+ str(irt0)+"::"+str(icl)+"::"+s+"::"+str(c0)+"::" +str(a0.size()), a0.size(),d,icl != Gecode::ICL_DOM,icl), a(a0), irt(irt0), c(c0) { testfix=false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double e = 0.0; for (int i=0; i(c)); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { if (one(a)) Gecode::linear(home, x, irt, c, icl); else Gecode::linear(home, a, x, irt, c, icl); } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { if (one(a)) Gecode::linear(home, x, irt, c, r, icl); else Gecode::linear(home, a, x, irt, c, r, icl); } }; /// %Test linear relation over integer variables class IntVar : public Test { protected: /// Coefficients Gecode::IntArgs a; /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test IntVar(const std::string& s, const Gecode::IntSet& d, const Gecode::IntArgs& a0, Gecode::IntRelType irt0, Gecode::IntConLevel icl=Gecode::ICL_BND) : Test("Linear::Int::Var::"+ str(irt0)+"::"+str(icl)+"::"+s+"::"+str(a0.size()), a0.size()+1,d,icl != Gecode::ICL_DOM,icl), a(a0), irt(irt0) { testfix=false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double e = 0.0; for (int i=0; i(x[a.size()])); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { int n = a.size(); Gecode::IntVarArgs y(n); for (int i=n; i--; ) y[i] = x[i]; if (one(a)) Gecode::linear(home, y, irt, x[n], icl); else Gecode::linear(home, a, y, irt, x[n], icl); } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { int n = a.size(); Gecode::IntVarArgs y(n); for (int i=n; i--; ) y[i] = x[i]; if (one(a)) Gecode::linear(home, y, irt, x[n], r, icl); else Gecode::linear(home, a, y, irt, x[n], r, icl); } }; /// %Test linear relation over Boolean variables equal to constant class BoolInt : public Test { protected: /// Coefficients Gecode::IntArgs a; /// Integer relation type to propagate Gecode::IntRelType irt; /// Righthand-side constant int c; public: /// Create and register test BoolInt(const std::string& s, const Gecode::IntArgs& a0, Gecode::IntRelType irt0, int c0) : Test("Linear::Bool::Int::"+ str(irt0)+"::"+s+"::"+str(a0.size())+"::"+str(c0), a0.size(),0,1,true,Gecode::ICL_DEF), a(a0), irt(irt0), c(c0) { testfix=false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double e = 0.0; for (int i=0; i(c)); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::BoolVarArgs y(x.size()); for (int i=x.size(); i--; ) y[i]=Gecode::channel(home,x[i]); if (one(a)) Gecode::linear(home, y, irt, c, Gecode::ICL_DEF); else Gecode::linear(home, a, y, irt, c, Gecode::ICL_DEF); } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { Gecode::BoolVarArgs y(x.size()); for (int i=x.size(); i--; ) y[i]=Gecode::channel(home,x[i]); if (one(a)) Gecode::linear(home, y, irt, c, r, Gecode::ICL_DEF); else Gecode::linear(home, a, y, irt, c, r, Gecode::ICL_DEF); } }; /// %Test linear relation over Boolean variables equal to integer variable class BoolVar : public Test { protected: /// Coefficients Gecode::IntArgs a; /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test BoolVar(const std::string& s, int min, int max, const Gecode::IntArgs& a0, Gecode::IntRelType irt0) : Test("Linear::Bool::Var::"+str(irt0)+"::"+s,a0.size()+1, min,max,true), a(a0), irt(irt0) { testfix=false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int n=x.size()-1; for (int i=0; i 1)) return false; double e = 0.0; for (int i=0; i(x[n])); } /// %Test whether \a x is to be ignored virtual bool ignore(const Assignment& x) const { for (int i=x.size()-1; i--; ) if ((x[i] < 0) || (x[i] > 1)) return true; return false; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { int n=x.size()-1; Gecode::BoolVarArgs y(n); for (int i=n; i--; ) y[i]=Gecode::channel(home,x[i]); if (one(a)) Gecode::linear(home, y, irt, x[n]); else Gecode::linear(home, a, y, irt, x[n]); } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { int n=x.size()-1; Gecode::BoolVarArgs y(n); for (int i=n; i--; ) y[i]=Gecode::channel(home,x[i]); if (one(a)) Gecode::linear(home, y, irt, x[n], r); else Gecode::linear(home, a, y, irt, x[n], r); } }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { using namespace Gecode; { IntSet d1(-2,2); const int dv2[] = {-4,-1,0,1,4}; IntSet d2(dv2,5); const int dv3[] = {0,1500000000}; IntSet d3(dv3,2); IntArgs a1(1, 0); for (IntRelTypes irts; irts(); ++irts) { (void) new IntInt("11",d1,a1,irts.irt(),0); (void) new IntVar("11",d1,a1,irts.irt()); (void) new IntInt("21",d2,a1,irts.irt(),0); (void) new IntVar("21",d2,a1,irts.irt()); (void) new IntInt("31",d3,a1,irts.irt(),150000000); } (void) new IntInt("11",d1,a1,IRT_EQ,0,ICL_DOM); (void) new IntVar("11",d1,a1,IRT_EQ,ICL_DOM); (void) new IntInt("21",d2,a1,IRT_EQ,0,ICL_DOM); (void) new IntVar("21",d2,a1,IRT_EQ,ICL_DOM); const int av2[5] = {1,1,1,1,1}; const int av3[5] = {1,-1,-1,1,-1}; const int av4[5] = {2,3,5,7,11}; const int av5[5] = {-2,3,-5,7,-11}; for (int i=1; i<=5; i++) { IntArgs a2(i, av2); IntArgs a3(i, av3); IntArgs a4(i, av4); IntArgs a5(i, av5); for (IntRelTypes irts; irts(); ++irts) { (void) new IntInt("12",d1,a2,irts.irt(),0); (void) new IntInt("13",d1,a3,irts.irt(),0); (void) new IntInt("14",d1,a4,irts.irt(),0); (void) new IntInt("15",d1,a5,irts.irt(),0); (void) new IntInt("22",d2,a2,irts.irt(),0); (void) new IntInt("23",d2,a3,irts.irt(),0); (void) new IntInt("24",d2,a4,irts.irt(),0); (void) new IntInt("25",d2,a5,irts.irt(),0); (void) new IntInt("32",d3,a2,irts.irt(),1500000000); if (i < 5) { (void) new IntVar("12",d1,a2,irts.irt()); (void) new IntVar("13",d1,a3,irts.irt()); (void) new IntVar("14",d1,a4,irts.irt()); (void) new IntVar("15",d1,a5,irts.irt()); (void) new IntVar("22",d2,a2,irts.irt()); (void) new IntVar("23",d2,a3,irts.irt()); (void) new IntVar("24",d2,a4,irts.irt()); (void) new IntVar("25",d2,a5,irts.irt()); } } (void) new IntInt("12",d1,a2,IRT_EQ,0,ICL_DOM); (void) new IntInt("13",d1,a3,IRT_EQ,0,ICL_DOM); (void) new IntInt("14",d1,a4,IRT_EQ,0,ICL_DOM); (void) new IntInt("15",d1,a5,IRT_EQ,0,ICL_DOM); (void) new IntInt("22",d2,a2,IRT_EQ,0,ICL_DOM); (void) new IntInt("23",d2,a3,IRT_EQ,0,ICL_DOM); (void) new IntInt("24",d2,a4,IRT_EQ,0,ICL_DOM); (void) new IntInt("25",d2,a5,IRT_EQ,0,ICL_DOM); if (i < 4) { (void) new IntVar("12",d1,a2,IRT_EQ,ICL_DOM); (void) new IntVar("13",d1,a3,IRT_EQ,ICL_DOM); (void) new IntVar("14",d1,a4,IRT_EQ,ICL_DOM); (void) new IntVar("15",d1,a5,IRT_EQ,ICL_DOM); } } } { const int av1[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; const int av2[10] = { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 }; for (int i=1; i<=10; i += 3) { IntArgs a1(i, av1); IntArgs a2(i, av2); for (int c=0; c<=6; c++) for (IntRelTypes irts; irts(); ++irts) { (void) new BoolInt("1",a1,irts.irt(),c); (void) new BoolInt("2",a2,irts.irt(),-c); } } IntArgs a3(5, 1,2,3,4,5); IntArgs a4(5, -1,-2,-3,-4,-5); IntArgs a5(5, -1,-2,1,2,4); for (IntRelTypes irts; irts(); ++irts) { for (int c=0; c<=16; c++) { (void) new BoolInt("3",a3,irts.irt(),c); (void) new BoolInt("4",a4,irts.irt(),-c); (void) new BoolInt("5",a5,irts.irt(),c); (void) new BoolInt("6",a5,irts.irt(),-c); } } for (int i=1; i<=5; i += 2) { IntArgs a1(i, av1); IntArgs a2(i, av2); for (IntRelTypes irts; irts(); ++irts) { (void) new BoolVar("1::"+Test::str(i),0,5,a1,irts.irt()); (void) new BoolVar("2::"+Test::str(i),-5,0,a2,irts.irt()); } } IntArgs a6(4, 1,2,3,4); IntArgs a7(4, -1,-2,-3,-4); IntArgs a8(4, -1,-2,1,2); IntArgs a9(6, -1,-2,1,2,-3,3); for (IntRelTypes irts; irts(); ++irts) { (void) new BoolVar("6",0,10,a6,irts.irt()); (void) new BoolVar("7",-10,0,a7,irts.irt()); (void) new BoolVar("8",-3,3,a8,irts.irt()); (void) new BoolVar("9",-3,3,a9,irts.irt()); } } } }; Create c; //@} } }} // STATISTICS: test-int gecode-4.2.1/test/int/member.cpp0000755000175000010010000001044511665203125015615 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2011 * * Last modified: * $Date: 2011-11-29 17:20:37 +0100 (Tue, 29 Nov 2011) $ by $Author: schulte $ * $Revision: 12486 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include "test/int.hh" namespace Test { namespace Int { /// %Tests for membership constraints namespace Member { /** * \defgroup TaskTestIntMember Membership constraints * \ingroup TaskTestInt */ //@{ /// %Test membership for integer variables class Int : public Test { public: /// Create and register test Int(int n) : Test("Member::Int::"+str(n),n+1,0,n,true) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int n = x.size() - 1; for (int i=n; i--; ) if (x[i] == x[n]) return true; return false; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; int n = x.size() - 1; IntVarArgs y(n); for (int i=n; i--; ) y[i] = x[i]; member(home, y, x[n]); } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { using namespace Gecode; int n = x.size() - 1; IntVarArgs y(n); for (int i=n; i--; ) y[i] = x[i]; member(home, y, x[n], r); } }; /// %Test membership for Boolean variables class Bool : public Test { public: /// Create and register test Bool(int n) : Test("Member::Bool::"+str(n),n+1,0,1,true) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int n = x.size() - 1; for (int i=n; i--; ) if (x[i] == x[n]) return true; return false; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; int n = x.size() - 1; BoolVarArgs y(n); for (int i=n; i--; ) y[i] = channel(home,x[i]); member(home, y, channel(home,x[n])); } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { using namespace Gecode; int n = x.size() - 1; BoolVarArgs y(n); for (int i=n; i--; ) y[i] = channel(home,x[i]); member(home, y, channel(home,x[n]), r); } }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { for (int i=0; i<=4; i++) { (void) new Int(i); (void) new Bool(i); } } }; Create c; //@} } }} // STATISTICS: test-int gecode-4.2.1/test/int/mm-arithmetic.cpp0000755000175000010010000002770411417670240017115 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2008 * * Last modified: * $Date: 2010-07-15 22:33:36 +0200 (Thu, 15 Jul 2010) $ by $Author: tack $ * $Revision: 11206 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include namespace Test { namespace Int { /// %Tests for minimal modelling constraints (arithmetic) namespace MiniModelArithmetic { /** * \defgroup TaskTestIntMiniModelArithmetic Minimal modelling constraints (arithmetic) * \ingroup TaskTestInt */ //@{ /// %Test for multiplication constraint class Mult : public Test { public: /// Create and register test Mult(const std::string& s, const Gecode::IntSet& d) : Test("MiniModel::Mult::"+s,3,d) { testfix = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double d0 = static_cast(x[0]); double d1 = static_cast(x[1]); double d2 = static_cast(x[2]); return d0*d1 == d2; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; rel(home, expr(home, x[0] * x[1]), IRT_EQ, x[2], ICL_DOM); } }; /// %Test for division constraint class Div : public Test { public: /// Create and register test Div(const std::string& s, const Gecode::IntSet& d) : Test("MiniModel::Div::"+s,3,d) { testfix = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return (x[1] != 0) && (x[0] / x[1] == x[2]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; rel(home, expr(home, x[0] / x[1]), IRT_EQ, x[2], ICL_DOM); } }; /// %Test for division constraint class Mod : public Test { public: /// Create and register test Mod(const std::string& s, const Gecode::IntSet& d) : Test("MiniModel::Mod::"+s,3,d) { testfix = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return (x[1] != 0) && (x[0] % x[1] == x[2]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; rel(home, expr(home, x[0] % x[1]), IRT_EQ, x[2], ICL_DOM); } }; /// %Test for addition constraint class Plus : public Test { public: /// Create and register test Plus(const std::string& s, const Gecode::IntSet& d) : Test("MiniModel::Plus::"+s,3,d) { testfix = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double d0 = static_cast(x[0]); double d1 = static_cast(x[1]); double d2 = static_cast(x[2]); return ((d0+d1 >= Gecode::Int::Limits::min) && (d0+d1 <= Gecode::Int::Limits::max) && (d0+d1 == d2)); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; rel(home, expr(home, x[0] + x[1]), IRT_EQ, x[2], ICL_DOM); } }; /// %Test for subtraction constraint class Minus : public Test { public: /// Create and register test Minus(const std::string& s, const Gecode::IntSet& d) : Test("MiniModel::Minus::"+s,3,d) { testfix = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double d0 = static_cast(x[0]); double d1 = static_cast(x[1]); double d2 = static_cast(x[2]); return ((d0-d1 >= Gecode::Int::Limits::min) && (d0-d1 <= Gecode::Int::Limits::max) && (d0-d1 == d2)); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; rel(home, expr(home, x[0] - x[1]), IRT_EQ, x[2], ICL_DOM); } }; /// %Test for sqr constraint class Sqr : public Test { public: /// Create and register test Sqr(const std::string& s, const Gecode::IntSet& d) : Test("MiniModel::Sqr::"+s,2,d) { testfix = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double d0 = static_cast(x[0]); double d1 = static_cast(x[1]); return d0*d0 == d1; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; rel(home, expr(home, sqr(x[0])), IRT_EQ, x[1], ICL_DOM); } }; /// %Test for sqrt constraint class Sqrt : public Test { public: /// Create and register test Sqrt(const std::string& s, const Gecode::IntSet& d) : Test("MiniModel::Sqrt::"+s,2,d) { testfix = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double d0 = static_cast(x[0]); double d1 = static_cast(x[1]); return (d0 >= 0) && (d0 >= d1*d1) && (d0 < (d1+1)*(d1+1)); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; rel(home, expr(home, sqrt(x[0])), IRT_EQ, x[1], ICL_DOM); } }; /// %Test for absolute value constraint class Abs : public Test { public: /// Create and register test Abs(const std::string& s, const Gecode::IntSet& d, Gecode::IntConLevel icl) : Test("MiniModel::Abs::"+str(icl)+"::"+s, 2,d,false,icl) { testfix = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { double d0 = static_cast(x[0]); double d1 = static_cast(x[1]); return (d0<0.0 ? -d0 : d0) == d1; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; rel(home, expr(home, abs(x[0]), icl), IRT_EQ, x[1], ICL_DOM); } }; /// %Test for binary minimum constraint class Min : public Test { public: /// Create and register test Min(const std::string& s, const Gecode::IntSet& d) : Test("MiniModel::Min::Bin::"+s,3,d) { testfix = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return std::min(x[0],x[1]) == x[2]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; rel(home, expr(home, min(x[0], x[1])), IRT_EQ, x[2], ICL_DOM); } }; /// %Test for binary maximum constraint class Max : public Test { public: /// Create and register test Max(const std::string& s, const Gecode::IntSet& d) : Test("MiniModel::Max::Bin::"+s,3,d) { testfix = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return std::max(x[0],x[1]) == x[2]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; rel(home, expr(home, max(x[0], x[1])), IRT_EQ, x[2], ICL_DOM); } }; /// %Test for n-ary minimmum constraint class MinNary : public Test { public: /// Create and register test MinNary(void) : Test("MiniModel::Min::Nary",4,-4,4) { testfix = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return std::min(std::min(x[0],x[1]), x[2]) == x[3]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; IntVarArgs m(3); m[0]=x[0]; m[1]=x[1]; m[2]=x[2]; rel(home, expr(home, min(m)), IRT_EQ, x[3], ICL_DOM); } }; /// %Test for n-ary maximum constraint class MaxNary : public Test { public: /// Create and register test MaxNary(void) : Test("MiniModel::Max::Nary",4,-4,4) { testfix = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return std::max(std::max(x[0],x[1]), x[2]) == x[3]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; IntVarArgs m(3); m[0]=x[0]; m[1]=x[1]; m[2]=x[2]; rel(home, expr(home, max(m)), IRT_EQ, x[3], ICL_DOM); } }; const int v1[7] = { Gecode::Int::Limits::min, Gecode::Int::Limits::min+1, -1,0,1, Gecode::Int::Limits::max-1, Gecode::Int::Limits::max }; const int v2[9] = { static_cast(-sqrt(static_cast(-Gecode::Int::Limits::min))), -4,-2,-1,0,1,2,4, static_cast(sqrt(static_cast(Gecode::Int::Limits::max))) }; Gecode::IntSet d1(v1,7); Gecode::IntSet d2(v2,9); Gecode::IntSet d3(-8,8); Mult mult_max("A",d1); Mult mult_med("B",d2); Mult mult_min("C",d3); Div div_max("A",d1); Div div_med("B",d2); Div div_min("C",d3); Mod mod_max("A",d1); Mod mod_med("B",d2); Mod mod_min("C",d3); Plus plus_max("A",d1); Plus plus_med("B",d2); Plus plus_min("C",d3); Minus minus_max("A",d1); Minus minus_med("B",d2); Minus minus_min("C",d3); Sqr sqr_max("A",d1); Sqr sqr_med("B",d2); Sqr sqr_min("C",d3); Sqrt sqrt_max("A",d1); Sqrt sqrt_med("B",d2); Sqrt sqrt_min("C",d3); Abs abs_bnd_max("A",d1,Gecode::ICL_BND); Abs abs_bnd_med("B",d2,Gecode::ICL_BND); Abs abs_bnd_min("C",d3,Gecode::ICL_BND); Abs abs_dom_max("A",d1,Gecode::ICL_DOM); Abs abs_dom_med("B",d2,Gecode::ICL_DOM); Abs abs_dom_min("C",d3,Gecode::ICL_DOM); Min min_max("A",d1); Min min_med("B",d2); Min min_min("C",d3); Max max_max("A",d1); Max max_med("B",d2); Max max_min("C",d3); MinNary min_nary; MaxNary max_nary; //@} } }} // STATISTICS: test-minimodel gecode-4.2.1/test/int/mm-bool.cpp0000755000175000010010000041264411371243141015713 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2008 * * Last modified: * $Date: 2010-05-08 13:09:21 +0200 (Sat, 08 May 2010) $ by $Author: tack $ * $Revision: 10907 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include namespace Test { namespace Int { /// %Tests for minimal modelling constraints (Boolean) namespace MiniModelBoolean { /// Boolean opcode enum BoolOpcode { BO_NOT, ///< Negation BO_AND, ///< Conjunction BO_OR, ///< Disjunction BO_IMP, ///< Implication BO_XOR, ///< Exclusive or BO_EQV, ///< Equivalence BO_HLT ///< Stop execution }; /// Type for representing a Boolean instruction class BoolInstr { public: BoolOpcode o; ///< Which instruction to execute unsigned char x, y, z; ///< Instruction arguments, \a z is destination (or \a y for negation) }; /// Executes Boolean instruction for evaluation (checking) int eval(const BoolInstr* pc, int reg[]) { while (true) { switch (pc->o) { case BO_NOT: reg[pc->y] = !reg[pc->x]; break; case BO_AND: reg[pc->z] = reg[pc->x] & reg[pc->y]; break; case BO_OR: reg[pc->z] = reg[pc->x] | reg[pc->y]; break; case BO_IMP: reg[pc->z] = !reg[pc->x] | reg[pc->y]; break; case BO_XOR: reg[pc->z] = reg[pc->x] ^ reg[pc->y]; break; case BO_EQV: reg[pc->z] = reg[pc->x] == reg[pc->y]; break; case BO_HLT: return reg[pc->x]; default: GECODE_NEVER; } pc++; } GECODE_NEVER; } /// Executes Boolean instruction for constructing Boolean expressions Gecode::BoolExpr eval(const BoolInstr* pc, Gecode::BoolExpr reg[]) { using namespace Gecode; while (true) { switch (pc->o) { case BO_NOT: reg[pc->y] = !reg[pc->x]; break; case BO_AND: reg[pc->z] = reg[pc->x] && reg[pc->y]; break; case BO_OR: reg[pc->z] = reg[pc->x] || reg[pc->y]; break; case BO_IMP: reg[pc->z] = (reg[pc->x] >> reg[pc->y]); break; case BO_XOR: reg[pc->z] = reg[pc->x] ^ reg[pc->y]; break; case BO_EQV: reg[pc->z] = (reg[pc->x] == reg[pc->y]); break; case BO_HLT: return reg[pc->x]; default: GECODE_NEVER; } pc++; } GECODE_NEVER; } /** * \defgroup TaskTestIntMiniModelBool Minimal modelling constraints (Boolean constraints) * \ingroup TaskTestInt */ //@{ /// %Test Boolean expressions with integer result class BoolExprInt : public Test { protected: /// Boolean instruction sequence const BoolInstr* bis; /// Result of expression int c; public: /// Create and register test BoolExprInt(const BoolInstr* bis0, const std::string& s, int c0) : Test("MiniModel::BoolExpr::Int::"+s+"::"+str(c0),4,0,1), bis(bis0), c(c0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int reg[4] = {(x[0] != x[2]), x[1], (x[2] > 0), x[3]}; return eval(bis, reg) == c; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; Gecode::BoolExpr reg[4] = { (x[0] != x[2]),channel(home,x[1]), (x[2] > 0),channel(home,x[3]) }; if (c == 0) Gecode::rel(home, !(eval(bis,reg))); else Gecode::rel(home, eval(bis,reg)); } }; /// %Test posting Boolean expressions class BoolExprVar : public Test { protected: /// Boolean instruction sequence const BoolInstr* bis; public: /// Create and register test BoolExprVar(const BoolInstr* bis0, const std::string& s) : Test("MiniModel::BoolExpr::Var::"+s,5,0,1), bis(bis0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int reg[4] = {(x[0] > x[2]), x[1], (x[2] != 1), x[3]}; return eval(bis, reg) == x[4]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; Gecode::BoolExpr reg[4] = { (x[0] > x[2]),channel(home,x[1]), (channel(home,x[2]) != 1),channel(home,x[3]) }; rel(home, Gecode::expr(home, eval(bis,reg)), IRT_EQ, channel(home,x[4])); } }; const BoolInstr bi000[] = { {BO_AND,0,1,0},{BO_AND,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi001[] = { {BO_AND,0,1,0},{BO_AND,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi002[] = { {BO_AND,2,3,2},{BO_AND,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi003[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_AND,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi004[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_AND,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi005[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi006[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi007[] = { {BO_AND,0,1,0},{BO_AND,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi008[] = { {BO_AND,0,1,0},{BO_AND,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi009[] = { {BO_AND,2,3,2},{BO_AND,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi010[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_AND,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi011[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_AND,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi012[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi013[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi014[] = { {BO_AND,0,1,0},{BO_AND,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi015[] = { {BO_AND,0,1,0},{BO_AND,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi016[] = { {BO_AND,2,3,2},{BO_AND,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi017[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_AND,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi018[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_AND,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi019[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi020[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi021[] = { {BO_AND,0,1,0},{BO_AND,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi022[] = { {BO_AND,0,1,0},{BO_AND,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi023[] = { {BO_AND,2,3,2},{BO_AND,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi024[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_AND,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi025[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_AND,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi026[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi027[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi028[] = { {BO_AND,0,1,0},{BO_AND,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi029[] = { {BO_AND,0,1,0},{BO_AND,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi030[] = { {BO_AND,2,3,2},{BO_AND,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi031[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_AND,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi032[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_AND,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi033[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi034[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi035[] = { {BO_AND,0,1,0},{BO_OR ,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi036[] = { {BO_AND,0,1,0},{BO_OR ,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi037[] = { {BO_AND,2,3,2},{BO_OR ,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi038[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_OR ,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi039[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_OR ,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi040[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi041[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi042[] = { {BO_AND,0,1,0},{BO_OR ,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi043[] = { {BO_AND,0,1,0},{BO_OR ,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi044[] = { {BO_AND,2,3,2},{BO_OR ,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi045[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_OR ,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi046[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_OR ,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi047[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi048[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi049[] = { {BO_AND,0,1,0},{BO_OR ,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi050[] = { {BO_AND,0,1,0},{BO_OR ,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi051[] = { {BO_AND,2,3,2},{BO_OR ,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi052[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_OR ,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi053[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_OR ,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi054[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi055[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi056[] = { {BO_AND,0,1,0},{BO_OR ,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi057[] = { {BO_AND,0,1,0},{BO_OR ,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi058[] = { {BO_AND,2,3,2},{BO_OR ,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi059[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_OR ,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi060[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_OR ,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi061[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi062[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi063[] = { {BO_AND,0,1,0},{BO_OR ,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi064[] = { {BO_AND,0,1,0},{BO_OR ,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi065[] = { {BO_AND,2,3,2},{BO_OR ,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi066[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_OR ,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi067[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_OR ,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi068[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi069[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi070[] = { {BO_AND,0,1,0},{BO_IMP,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi071[] = { {BO_AND,0,1,0},{BO_IMP,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi072[] = { {BO_AND,2,3,2},{BO_IMP,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi073[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_IMP,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi074[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_IMP,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi075[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi076[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi077[] = { {BO_AND,0,1,0},{BO_IMP,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi078[] = { {BO_AND,0,1,0},{BO_IMP,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi079[] = { {BO_AND,2,3,2},{BO_IMP,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi080[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_IMP,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi081[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_IMP,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi082[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi083[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi084[] = { {BO_AND,0,1,0},{BO_IMP,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi085[] = { {BO_AND,0,1,0},{BO_IMP,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi086[] = { {BO_AND,2,3,2},{BO_IMP,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi087[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_IMP,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi088[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_IMP,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi089[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi090[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi091[] = { {BO_AND,0,1,0},{BO_IMP,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi092[] = { {BO_AND,0,1,0},{BO_IMP,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi093[] = { {BO_AND,2,3,2},{BO_IMP,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi094[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_IMP,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi095[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_IMP,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi096[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi097[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi098[] = { {BO_AND,0,1,0},{BO_IMP,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi099[] = { {BO_AND,0,1,0},{BO_IMP,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi100[] = { {BO_AND,2,3,2},{BO_IMP,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi101[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_IMP,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi102[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_IMP,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi103[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi104[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi105[] = { {BO_AND,0,1,0},{BO_XOR,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi106[] = { {BO_AND,0,1,0},{BO_XOR,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi107[] = { {BO_AND,2,3,2},{BO_XOR,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi108[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_XOR,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi109[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_XOR,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi110[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi111[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi112[] = { {BO_AND,0,1,0},{BO_XOR,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi113[] = { {BO_AND,0,1,0},{BO_XOR,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi114[] = { {BO_AND,2,3,2},{BO_XOR,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi115[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_XOR,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi116[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_XOR,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi117[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi118[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi119[] = { {BO_AND,0,1,0},{BO_XOR,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi120[] = { {BO_AND,0,1,0},{BO_XOR,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi121[] = { {BO_AND,2,3,2},{BO_XOR,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi122[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_XOR,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi123[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_XOR,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi124[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi125[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi126[] = { {BO_AND,0,1,0},{BO_XOR,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi127[] = { {BO_AND,0,1,0},{BO_XOR,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi128[] = { {BO_AND,2,3,2},{BO_XOR,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi129[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_XOR,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi130[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_XOR,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi131[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi132[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi133[] = { {BO_AND,0,1,0},{BO_XOR,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi134[] = { {BO_AND,0,1,0},{BO_XOR,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi135[] = { {BO_AND,2,3,2},{BO_XOR,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi136[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_XOR,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi137[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_XOR,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi138[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi139[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi140[] = { {BO_AND,0,1,0},{BO_EQV,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi141[] = { {BO_AND,0,1,0},{BO_EQV,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi142[] = { {BO_AND,2,3,2},{BO_EQV,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi143[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_EQV,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi144[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_EQV,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi145[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi146[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi147[] = { {BO_AND,0,1,0},{BO_EQV,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi148[] = { {BO_AND,0,1,0},{BO_EQV,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi149[] = { {BO_AND,2,3,2},{BO_EQV,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi150[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_EQV,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi151[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_EQV,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi152[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi153[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi154[] = { {BO_AND,0,1,0},{BO_EQV,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi155[] = { {BO_AND,0,1,0},{BO_EQV,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi156[] = { {BO_AND,2,3,2},{BO_EQV,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi157[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_EQV,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi158[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_EQV,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi159[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi160[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi161[] = { {BO_AND,0,1,0},{BO_EQV,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi162[] = { {BO_AND,0,1,0},{BO_EQV,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi163[] = { {BO_AND,2,3,2},{BO_EQV,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi164[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_EQV,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi165[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_EQV,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi166[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi167[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi168[] = { {BO_AND,0,1,0},{BO_EQV,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi169[] = { {BO_AND,0,1,0},{BO_EQV,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi170[] = { {BO_AND,2,3,2},{BO_EQV,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi171[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_AND,0,1,0},{BO_EQV,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi172[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_AND,0,1,0}, {BO_EQV,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi173[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi174[] = { {BO_AND,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi175[] = { {BO_OR ,0,1,0},{BO_AND,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi176[] = { {BO_OR ,0,1,0},{BO_AND,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi177[] = { {BO_OR ,2,3,2},{BO_AND,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi178[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_AND,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi179[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_AND,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi180[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi181[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi182[] = { {BO_OR ,0,1,0},{BO_AND,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi183[] = { {BO_OR ,0,1,0},{BO_AND,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi184[] = { {BO_OR ,2,3,2},{BO_AND,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi185[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_AND,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi186[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_AND,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi187[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi188[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi189[] = { {BO_OR ,0,1,0},{BO_AND,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi190[] = { {BO_OR ,0,1,0},{BO_AND,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi191[] = { {BO_OR ,2,3,2},{BO_AND,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi192[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_AND,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi193[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_AND,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi194[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi195[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi196[] = { {BO_OR ,0,1,0},{BO_AND,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi197[] = { {BO_OR ,0,1,0},{BO_AND,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi198[] = { {BO_OR ,2,3,2},{BO_AND,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi199[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_AND,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi200[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_AND,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi201[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi202[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi203[] = { {BO_OR ,0,1,0},{BO_AND,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi204[] = { {BO_OR ,0,1,0},{BO_AND,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi205[] = { {BO_OR ,2,3,2},{BO_AND,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi206[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_AND,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi207[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_AND,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi208[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi209[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi210[] = { {BO_OR ,0,1,0},{BO_OR ,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi211[] = { {BO_OR ,0,1,0},{BO_OR ,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi212[] = { {BO_OR ,2,3,2},{BO_OR ,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi213[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_OR ,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi214[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_OR ,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi215[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi216[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi217[] = { {BO_OR ,0,1,0},{BO_OR ,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi218[] = { {BO_OR ,0,1,0},{BO_OR ,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi219[] = { {BO_OR ,2,3,2},{BO_OR ,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi220[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_OR ,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi221[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_OR ,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi222[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi223[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi224[] = { {BO_OR ,0,1,0},{BO_OR ,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi225[] = { {BO_OR ,0,1,0},{BO_OR ,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi226[] = { {BO_OR ,2,3,2},{BO_OR ,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi227[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_OR ,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi228[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_OR ,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi229[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi230[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi231[] = { {BO_OR ,0,1,0},{BO_OR ,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi232[] = { {BO_OR ,0,1,0},{BO_OR ,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi233[] = { {BO_OR ,2,3,2},{BO_OR ,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi234[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_OR ,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi235[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_OR ,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi236[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi237[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi238[] = { {BO_OR ,0,1,0},{BO_OR ,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi239[] = { {BO_OR ,0,1,0},{BO_OR ,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi240[] = { {BO_OR ,2,3,2},{BO_OR ,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi241[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_OR ,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi242[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_OR ,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi243[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi244[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi245[] = { {BO_OR ,0,1,0},{BO_IMP,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi246[] = { {BO_OR ,0,1,0},{BO_IMP,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi247[] = { {BO_OR ,2,3,2},{BO_IMP,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi248[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_IMP,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi249[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_IMP,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi250[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi251[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi252[] = { {BO_OR ,0,1,0},{BO_IMP,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi253[] = { {BO_OR ,0,1,0},{BO_IMP,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi254[] = { {BO_OR ,2,3,2},{BO_IMP,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi255[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_IMP,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi256[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_IMP,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi257[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi258[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi259[] = { {BO_OR ,0,1,0},{BO_IMP,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi260[] = { {BO_OR ,0,1,0},{BO_IMP,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi261[] = { {BO_OR ,2,3,2},{BO_IMP,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi262[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_IMP,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi263[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_IMP,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi264[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi265[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi266[] = { {BO_OR ,0,1,0},{BO_IMP,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi267[] = { {BO_OR ,0,1,0},{BO_IMP,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi268[] = { {BO_OR ,2,3,2},{BO_IMP,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi269[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_IMP,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi270[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_IMP,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi271[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi272[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi273[] = { {BO_OR ,0,1,0},{BO_IMP,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi274[] = { {BO_OR ,0,1,0},{BO_IMP,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi275[] = { {BO_OR ,2,3,2},{BO_IMP,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi276[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_IMP,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi277[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_IMP,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi278[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi279[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi280[] = { {BO_OR ,0,1,0},{BO_XOR,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi281[] = { {BO_OR ,0,1,0},{BO_XOR,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi282[] = { {BO_OR ,2,3,2},{BO_XOR,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi283[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_XOR,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi284[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_XOR,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi285[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi286[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi287[] = { {BO_OR ,0,1,0},{BO_XOR,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi288[] = { {BO_OR ,0,1,0},{BO_XOR,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi289[] = { {BO_OR ,2,3,2},{BO_XOR,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi290[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_XOR,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi291[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_XOR,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi292[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi293[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi294[] = { {BO_OR ,0,1,0},{BO_XOR,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi295[] = { {BO_OR ,0,1,0},{BO_XOR,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi296[] = { {BO_OR ,2,3,2},{BO_XOR,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi297[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_XOR,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi298[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_XOR,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi299[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi300[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi301[] = { {BO_OR ,0,1,0},{BO_XOR,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi302[] = { {BO_OR ,0,1,0},{BO_XOR,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi303[] = { {BO_OR ,2,3,2},{BO_XOR,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi304[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_XOR,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi305[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_XOR,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi306[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi307[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi308[] = { {BO_OR ,0,1,0},{BO_XOR,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi309[] = { {BO_OR ,0,1,0},{BO_XOR,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi310[] = { {BO_OR ,2,3,2},{BO_XOR,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi311[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_XOR,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi312[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_XOR,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi313[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi314[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi315[] = { {BO_OR ,0,1,0},{BO_EQV,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi316[] = { {BO_OR ,0,1,0},{BO_EQV,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi317[] = { {BO_OR ,2,3,2},{BO_EQV,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi318[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_EQV,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi319[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_EQV,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi320[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi321[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi322[] = { {BO_OR ,0,1,0},{BO_EQV,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi323[] = { {BO_OR ,0,1,0},{BO_EQV,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi324[] = { {BO_OR ,2,3,2},{BO_EQV,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi325[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_EQV,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi326[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_EQV,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi327[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi328[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi329[] = { {BO_OR ,0,1,0},{BO_EQV,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi330[] = { {BO_OR ,0,1,0},{BO_EQV,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi331[] = { {BO_OR ,2,3,2},{BO_EQV,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi332[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_EQV,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi333[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_EQV,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi334[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi335[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi336[] = { {BO_OR ,0,1,0},{BO_EQV,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi337[] = { {BO_OR ,0,1,0},{BO_EQV,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi338[] = { {BO_OR ,2,3,2},{BO_EQV,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi339[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_EQV,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi340[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_EQV,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi341[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi342[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi343[] = { {BO_OR ,0,1,0},{BO_EQV,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi344[] = { {BO_OR ,0,1,0},{BO_EQV,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi345[] = { {BO_OR ,2,3,2},{BO_EQV,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi346[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_OR ,0,1,0},{BO_EQV,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi347[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_OR ,0,1,0}, {BO_EQV,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi348[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi349[] = { {BO_OR ,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi350[] = { {BO_IMP,0,1,0},{BO_AND,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi351[] = { {BO_IMP,0,1,0},{BO_AND,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi352[] = { {BO_IMP,2,3,2},{BO_AND,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi353[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_AND,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi354[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_AND,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi355[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi356[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi357[] = { {BO_IMP,0,1,0},{BO_AND,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi358[] = { {BO_IMP,0,1,0},{BO_AND,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi359[] = { {BO_IMP,2,3,2},{BO_AND,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi360[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_AND,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi361[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_AND,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi362[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi363[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi364[] = { {BO_IMP,0,1,0},{BO_AND,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi365[] = { {BO_IMP,0,1,0},{BO_AND,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi366[] = { {BO_IMP,2,3,2},{BO_AND,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi367[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_AND,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi368[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_AND,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi369[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi370[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi371[] = { {BO_IMP,0,1,0},{BO_AND,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi372[] = { {BO_IMP,0,1,0},{BO_AND,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi373[] = { {BO_IMP,2,3,2},{BO_AND,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi374[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_AND,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi375[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_AND,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi376[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi377[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi378[] = { {BO_IMP,0,1,0},{BO_AND,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi379[] = { {BO_IMP,0,1,0},{BO_AND,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi380[] = { {BO_IMP,2,3,2},{BO_AND,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi381[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_AND,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi382[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_AND,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi383[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi384[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi385[] = { {BO_IMP,0,1,0},{BO_OR ,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi386[] = { {BO_IMP,0,1,0},{BO_OR ,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi387[] = { {BO_IMP,2,3,2},{BO_OR ,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi388[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_OR ,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi389[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_OR ,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi390[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi391[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi392[] = { {BO_IMP,0,1,0},{BO_OR ,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi393[] = { {BO_IMP,0,1,0},{BO_OR ,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi394[] = { {BO_IMP,2,3,2},{BO_OR ,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi395[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_OR ,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi396[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_OR ,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi397[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi398[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi399[] = { {BO_IMP,0,1,0},{BO_OR ,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi400[] = { {BO_IMP,0,1,0},{BO_OR ,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi401[] = { {BO_IMP,2,3,2},{BO_OR ,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi402[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_OR ,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi403[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_OR ,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi404[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi405[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi406[] = { {BO_IMP,0,1,0},{BO_OR ,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi407[] = { {BO_IMP,0,1,0},{BO_OR ,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi408[] = { {BO_IMP,2,3,2},{BO_OR ,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi409[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_OR ,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi410[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_OR ,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi411[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi412[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi413[] = { {BO_IMP,0,1,0},{BO_OR ,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi414[] = { {BO_IMP,0,1,0},{BO_OR ,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi415[] = { {BO_IMP,2,3,2},{BO_OR ,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi416[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_OR ,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi417[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_OR ,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi418[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi419[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi420[] = { {BO_IMP,0,1,0},{BO_IMP,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi421[] = { {BO_IMP,0,1,0},{BO_IMP,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi422[] = { {BO_IMP,2,3,2},{BO_IMP,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi423[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_IMP,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi424[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_IMP,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi425[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi426[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi427[] = { {BO_IMP,0,1,0},{BO_IMP,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi428[] = { {BO_IMP,0,1,0},{BO_IMP,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi429[] = { {BO_IMP,2,3,2},{BO_IMP,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi430[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_IMP,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi431[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_IMP,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi432[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi433[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi434[] = { {BO_IMP,0,1,0},{BO_IMP,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi435[] = { {BO_IMP,0,1,0},{BO_IMP,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi436[] = { {BO_IMP,2,3,2},{BO_IMP,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi437[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_IMP,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi438[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_IMP,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi439[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi440[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi441[] = { {BO_IMP,0,1,0},{BO_IMP,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi442[] = { {BO_IMP,0,1,0},{BO_IMP,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi443[] = { {BO_IMP,2,3,2},{BO_IMP,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi444[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_IMP,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi445[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_IMP,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi446[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi447[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi448[] = { {BO_IMP,0,1,0},{BO_IMP,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi449[] = { {BO_IMP,0,1,0},{BO_IMP,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi450[] = { {BO_IMP,2,3,2},{BO_IMP,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi451[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_IMP,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi452[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_IMP,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi453[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi454[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi455[] = { {BO_IMP,0,1,0},{BO_XOR,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi456[] = { {BO_IMP,0,1,0},{BO_XOR,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi457[] = { {BO_IMP,2,3,2},{BO_XOR,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi458[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_XOR,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi459[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_XOR,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi460[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi461[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi462[] = { {BO_IMP,0,1,0},{BO_XOR,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi463[] = { {BO_IMP,0,1,0},{BO_XOR,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi464[] = { {BO_IMP,2,3,2},{BO_XOR,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi465[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_XOR,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi466[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_XOR,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi467[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi468[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi469[] = { {BO_IMP,0,1,0},{BO_XOR,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi470[] = { {BO_IMP,0,1,0},{BO_XOR,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi471[] = { {BO_IMP,2,3,2},{BO_XOR,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi472[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_XOR,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi473[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_XOR,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi474[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi475[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi476[] = { {BO_IMP,0,1,0},{BO_XOR,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi477[] = { {BO_IMP,0,1,0},{BO_XOR,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi478[] = { {BO_IMP,2,3,2},{BO_XOR,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi479[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_XOR,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi480[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_XOR,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi481[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi482[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi483[] = { {BO_IMP,0,1,0},{BO_XOR,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi484[] = { {BO_IMP,0,1,0},{BO_XOR,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi485[] = { {BO_IMP,2,3,2},{BO_XOR,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi486[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_XOR,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi487[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_XOR,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi488[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi489[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi490[] = { {BO_IMP,0,1,0},{BO_EQV,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi491[] = { {BO_IMP,0,1,0},{BO_EQV,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi492[] = { {BO_IMP,2,3,2},{BO_EQV,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi493[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_EQV,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi494[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_EQV,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi495[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi496[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi497[] = { {BO_IMP,0,1,0},{BO_EQV,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi498[] = { {BO_IMP,0,1,0},{BO_EQV,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi499[] = { {BO_IMP,2,3,2},{BO_EQV,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi500[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_EQV,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi501[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_EQV,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi502[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi503[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi504[] = { {BO_IMP,0,1,0},{BO_EQV,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi505[] = { {BO_IMP,0,1,0},{BO_EQV,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi506[] = { {BO_IMP,2,3,2},{BO_EQV,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi507[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_EQV,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi508[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_EQV,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi509[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi510[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi511[] = { {BO_IMP,0,1,0},{BO_EQV,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi512[] = { {BO_IMP,0,1,0},{BO_EQV,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi513[] = { {BO_IMP,2,3,2},{BO_EQV,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi514[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_EQV,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi515[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_EQV,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi516[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi517[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi518[] = { {BO_IMP,0,1,0},{BO_EQV,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi519[] = { {BO_IMP,0,1,0},{BO_EQV,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi520[] = { {BO_IMP,2,3,2},{BO_EQV,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi521[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_IMP,0,1,0},{BO_EQV,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi522[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_IMP,0,1,0}, {BO_EQV,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi523[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi524[] = { {BO_IMP,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi525[] = { {BO_XOR,0,1,0},{BO_AND,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi526[] = { {BO_XOR,0,1,0},{BO_AND,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi527[] = { {BO_XOR,2,3,2},{BO_AND,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi528[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_AND,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi529[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_AND,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi530[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi531[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi532[] = { {BO_XOR,0,1,0},{BO_AND,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi533[] = { {BO_XOR,0,1,0},{BO_AND,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi534[] = { {BO_XOR,2,3,2},{BO_AND,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi535[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_AND,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi536[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_AND,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi537[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi538[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi539[] = { {BO_XOR,0,1,0},{BO_AND,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi540[] = { {BO_XOR,0,1,0},{BO_AND,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi541[] = { {BO_XOR,2,3,2},{BO_AND,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi542[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_AND,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi543[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_AND,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi544[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi545[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi546[] = { {BO_XOR,0,1,0},{BO_AND,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi547[] = { {BO_XOR,0,1,0},{BO_AND,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi548[] = { {BO_XOR,2,3,2},{BO_AND,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi549[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_AND,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi550[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_AND,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi551[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi552[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi553[] = { {BO_XOR,0,1,0},{BO_AND,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi554[] = { {BO_XOR,0,1,0},{BO_AND,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi555[] = { {BO_XOR,2,3,2},{BO_AND,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi556[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_AND,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi557[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_AND,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi558[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi559[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi560[] = { {BO_XOR,0,1,0},{BO_OR ,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi561[] = { {BO_XOR,0,1,0},{BO_OR ,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi562[] = { {BO_XOR,2,3,2},{BO_OR ,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi563[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_OR ,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi564[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_OR ,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi565[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi566[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi567[] = { {BO_XOR,0,1,0},{BO_OR ,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi568[] = { {BO_XOR,0,1,0},{BO_OR ,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi569[] = { {BO_XOR,2,3,2},{BO_OR ,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi570[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_OR ,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi571[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_OR ,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi572[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi573[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi574[] = { {BO_XOR,0,1,0},{BO_OR ,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi575[] = { {BO_XOR,0,1,0},{BO_OR ,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi576[] = { {BO_XOR,2,3,2},{BO_OR ,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi577[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_OR ,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi578[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_OR ,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi579[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi580[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi581[] = { {BO_XOR,0,1,0},{BO_OR ,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi582[] = { {BO_XOR,0,1,0},{BO_OR ,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi583[] = { {BO_XOR,2,3,2},{BO_OR ,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi584[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_OR ,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi585[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_OR ,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi586[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi587[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi588[] = { {BO_XOR,0,1,0},{BO_OR ,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi589[] = { {BO_XOR,0,1,0},{BO_OR ,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi590[] = { {BO_XOR,2,3,2},{BO_OR ,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi591[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_OR ,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi592[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_OR ,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi593[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi594[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi595[] = { {BO_XOR,0,1,0},{BO_IMP,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi596[] = { {BO_XOR,0,1,0},{BO_IMP,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi597[] = { {BO_XOR,2,3,2},{BO_IMP,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi598[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_IMP,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi599[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_IMP,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi600[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi601[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi602[] = { {BO_XOR,0,1,0},{BO_IMP,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi603[] = { {BO_XOR,0,1,0},{BO_IMP,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi604[] = { {BO_XOR,2,3,2},{BO_IMP,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi605[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_IMP,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi606[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_IMP,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi607[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi608[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi609[] = { {BO_XOR,0,1,0},{BO_IMP,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi610[] = { {BO_XOR,0,1,0},{BO_IMP,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi611[] = { {BO_XOR,2,3,2},{BO_IMP,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi612[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_IMP,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi613[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_IMP,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi614[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi615[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi616[] = { {BO_XOR,0,1,0},{BO_IMP,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi617[] = { {BO_XOR,0,1,0},{BO_IMP,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi618[] = { {BO_XOR,2,3,2},{BO_IMP,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi619[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_IMP,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi620[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_IMP,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi621[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi622[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi623[] = { {BO_XOR,0,1,0},{BO_IMP,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi624[] = { {BO_XOR,0,1,0},{BO_IMP,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi625[] = { {BO_XOR,2,3,2},{BO_IMP,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi626[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_IMP,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi627[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_IMP,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi628[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi629[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi630[] = { {BO_XOR,0,1,0},{BO_XOR,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi631[] = { {BO_XOR,0,1,0},{BO_XOR,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi632[] = { {BO_XOR,2,3,2},{BO_XOR,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi633[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_XOR,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi634[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_XOR,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi635[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi636[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi637[] = { {BO_XOR,0,1,0},{BO_XOR,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi638[] = { {BO_XOR,0,1,0},{BO_XOR,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi639[] = { {BO_XOR,2,3,2},{BO_XOR,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi640[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_XOR,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi641[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_XOR,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi642[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi643[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi644[] = { {BO_XOR,0,1,0},{BO_XOR,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi645[] = { {BO_XOR,0,1,0},{BO_XOR,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi646[] = { {BO_XOR,2,3,2},{BO_XOR,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi647[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_XOR,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi648[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_XOR,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi649[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi650[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi651[] = { {BO_XOR,0,1,0},{BO_XOR,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi652[] = { {BO_XOR,0,1,0},{BO_XOR,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi653[] = { {BO_XOR,2,3,2},{BO_XOR,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi654[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_XOR,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi655[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_XOR,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi656[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi657[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi658[] = { {BO_XOR,0,1,0},{BO_XOR,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi659[] = { {BO_XOR,0,1,0},{BO_XOR,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi660[] = { {BO_XOR,2,3,2},{BO_XOR,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi661[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_XOR,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi662[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_XOR,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi663[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi664[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi665[] = { {BO_XOR,0,1,0},{BO_EQV,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi666[] = { {BO_XOR,0,1,0},{BO_EQV,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi667[] = { {BO_XOR,2,3,2},{BO_EQV,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi668[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_EQV,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi669[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_EQV,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi670[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi671[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi672[] = { {BO_XOR,0,1,0},{BO_EQV,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi673[] = { {BO_XOR,0,1,0},{BO_EQV,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi674[] = { {BO_XOR,2,3,2},{BO_EQV,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi675[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_EQV,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi676[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_EQV,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi677[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi678[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi679[] = { {BO_XOR,0,1,0},{BO_EQV,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi680[] = { {BO_XOR,0,1,0},{BO_EQV,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi681[] = { {BO_XOR,2,3,2},{BO_EQV,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi682[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_EQV,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi683[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_EQV,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi684[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi685[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi686[] = { {BO_XOR,0,1,0},{BO_EQV,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi687[] = { {BO_XOR,0,1,0},{BO_EQV,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi688[] = { {BO_XOR,2,3,2},{BO_EQV,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi689[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_EQV,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi690[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_EQV,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi691[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi692[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi693[] = { {BO_XOR,0,1,0},{BO_EQV,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi694[] = { {BO_XOR,0,1,0},{BO_EQV,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi695[] = { {BO_XOR,2,3,2},{BO_EQV,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi696[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_XOR,0,1,0},{BO_EQV,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi697[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_XOR,0,1,0}, {BO_EQV,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi698[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi699[] = { {BO_XOR,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi700[] = { {BO_EQV,0,1,0},{BO_AND,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi701[] = { {BO_EQV,0,1,0},{BO_AND,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi702[] = { {BO_EQV,2,3,2},{BO_AND,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi703[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_AND,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi704[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_AND,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi705[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi706[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi707[] = { {BO_EQV,0,1,0},{BO_AND,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi708[] = { {BO_EQV,0,1,0},{BO_AND,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi709[] = { {BO_EQV,2,3,2},{BO_AND,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi710[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_AND,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi711[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_AND,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi712[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi713[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi714[] = { {BO_EQV,0,1,0},{BO_AND,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi715[] = { {BO_EQV,0,1,0},{BO_AND,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi716[] = { {BO_EQV,2,3,2},{BO_AND,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi717[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_AND,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi718[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_AND,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi719[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi720[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi721[] = { {BO_EQV,0,1,0},{BO_AND,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi722[] = { {BO_EQV,0,1,0},{BO_AND,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi723[] = { {BO_EQV,2,3,2},{BO_AND,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi724[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_AND,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi725[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_AND,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi726[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi727[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi728[] = { {BO_EQV,0,1,0},{BO_AND,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi729[] = { {BO_EQV,0,1,0},{BO_AND,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi730[] = { {BO_EQV,2,3,2},{BO_AND,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi731[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_AND,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi732[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_AND,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi733[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi734[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_AND,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi735[] = { {BO_EQV,0,1,0},{BO_OR ,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi736[] = { {BO_EQV,0,1,0},{BO_OR ,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi737[] = { {BO_EQV,2,3,2},{BO_OR ,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi738[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_OR ,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi739[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_OR ,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi740[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi741[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi742[] = { {BO_EQV,0,1,0},{BO_OR ,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi743[] = { {BO_EQV,0,1,0},{BO_OR ,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi744[] = { {BO_EQV,2,3,2},{BO_OR ,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi745[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_OR ,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi746[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_OR ,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi747[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi748[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi749[] = { {BO_EQV,0,1,0},{BO_OR ,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi750[] = { {BO_EQV,0,1,0},{BO_OR ,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi751[] = { {BO_EQV,2,3,2},{BO_OR ,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi752[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_OR ,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi753[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_OR ,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi754[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi755[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi756[] = { {BO_EQV,0,1,0},{BO_OR ,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi757[] = { {BO_EQV,0,1,0},{BO_OR ,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi758[] = { {BO_EQV,2,3,2},{BO_OR ,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi759[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_OR ,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi760[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_OR ,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi761[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi762[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi763[] = { {BO_EQV,0,1,0},{BO_OR ,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi764[] = { {BO_EQV,0,1,0},{BO_OR ,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi765[] = { {BO_EQV,2,3,2},{BO_OR ,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi766[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_OR ,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi767[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_OR ,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi768[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi769[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_OR ,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi770[] = { {BO_EQV,0,1,0},{BO_IMP,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi771[] = { {BO_EQV,0,1,0},{BO_IMP,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi772[] = { {BO_EQV,2,3,2},{BO_IMP,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi773[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_IMP,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi774[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_IMP,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi775[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi776[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi777[] = { {BO_EQV,0,1,0},{BO_IMP,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi778[] = { {BO_EQV,0,1,0},{BO_IMP,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi779[] = { {BO_EQV,2,3,2},{BO_IMP,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi780[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_IMP,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi781[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_IMP,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi782[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi783[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi784[] = { {BO_EQV,0,1,0},{BO_IMP,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi785[] = { {BO_EQV,0,1,0},{BO_IMP,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi786[] = { {BO_EQV,2,3,2},{BO_IMP,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi787[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_IMP,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi788[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_IMP,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi789[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi790[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi791[] = { {BO_EQV,0,1,0},{BO_IMP,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi792[] = { {BO_EQV,0,1,0},{BO_IMP,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi793[] = { {BO_EQV,2,3,2},{BO_IMP,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi794[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_IMP,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi795[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_IMP,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi796[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi797[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi798[] = { {BO_EQV,0,1,0},{BO_IMP,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi799[] = { {BO_EQV,0,1,0},{BO_IMP,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi800[] = { {BO_EQV,2,3,2},{BO_IMP,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi801[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_IMP,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi802[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_IMP,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi803[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi804[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_IMP,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi805[] = { {BO_EQV,0,1,0},{BO_XOR,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi806[] = { {BO_EQV,0,1,0},{BO_XOR,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi807[] = { {BO_EQV,2,3,2},{BO_XOR,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi808[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_XOR,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi809[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_XOR,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi810[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi811[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi812[] = { {BO_EQV,0,1,0},{BO_XOR,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi813[] = { {BO_EQV,0,1,0},{BO_XOR,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi814[] = { {BO_EQV,2,3,2},{BO_XOR,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi815[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_XOR,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi816[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_XOR,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi817[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi818[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi819[] = { {BO_EQV,0,1,0},{BO_XOR,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi820[] = { {BO_EQV,0,1,0},{BO_XOR,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi821[] = { {BO_EQV,2,3,2},{BO_XOR,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi822[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_XOR,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi823[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_XOR,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi824[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi825[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi826[] = { {BO_EQV,0,1,0},{BO_XOR,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi827[] = { {BO_EQV,0,1,0},{BO_XOR,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi828[] = { {BO_EQV,2,3,2},{BO_XOR,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi829[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_XOR,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi830[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_XOR,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi831[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi832[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi833[] = { {BO_EQV,0,1,0},{BO_XOR,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi834[] = { {BO_EQV,0,1,0},{BO_XOR,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi835[] = { {BO_EQV,2,3,2},{BO_XOR,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi836[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_XOR,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi837[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_XOR,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi838[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi839[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_XOR,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi840[] = { {BO_EQV,0,1,0},{BO_EQV,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi841[] = { {BO_EQV,0,1,0},{BO_EQV,0,2,0},{BO_AND,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi842[] = { {BO_EQV,2,3,2},{BO_EQV,1,2,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi843[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_EQV,2,3,1}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi844[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_EQV,2,3,1},{BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi845[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi846[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_AND,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi847[] = { {BO_EQV,0,1,0},{BO_EQV,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi848[] = { {BO_EQV,0,1,0},{BO_EQV,0,2,0},{BO_OR ,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi849[] = { {BO_EQV,2,3,2},{BO_EQV,1,2,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi850[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_EQV,2,3,1}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi851[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_EQV,2,3,1},{BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi852[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi853[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_OR ,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi854[] = { {BO_EQV,0,1,0},{BO_EQV,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi855[] = { {BO_EQV,0,1,0},{BO_EQV,0,2,0},{BO_IMP,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi856[] = { {BO_EQV,2,3,2},{BO_EQV,1,2,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi857[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_EQV,2,3,1}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi858[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_EQV,2,3,1},{BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi859[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi860[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_IMP,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi861[] = { {BO_EQV,0,1,0},{BO_EQV,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi862[] = { {BO_EQV,0,1,0},{BO_EQV,0,2,0},{BO_XOR,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi863[] = { {BO_EQV,2,3,2},{BO_EQV,1,2,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi864[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_EQV,2,3,1}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi865[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_EQV,2,3,1},{BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi866[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi867[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_XOR,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr bi868[] = { {BO_EQV,0,1,0},{BO_EQV,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi869[] = { {BO_EQV,0,1,0},{BO_EQV,0,2,0},{BO_EQV,0,3,0}, {BO_HLT,0,0,0} }; const BoolInstr bi870[] = { {BO_EQV,2,3,2},{BO_EQV,1,2,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi871[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_EQV,0,1,0},{BO_EQV,2,3,1}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi872[] = { {BO_NOT,0,0,0},{BO_NOT,2,2,0},{BO_NOT,0,0,0},{BO_EQV,0,1,0}, {BO_EQV,2,3,1},{BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi873[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0}, {BO_HLT,0,0,0} }; const BoolInstr bi874[] = { {BO_EQV,0,1,0},{BO_NOT,0,0,0},{BO_EQV,2,3,1},{BO_NOT,1,1,0}, {BO_EQV,0,1,0},{BO_NOT,0,0,0}, {BO_HLT,0,0,0} }; const BoolInstr* bi[] = { &bi000[0],&bi001[0],&bi002[0],&bi003[0],&bi004[0],&bi005[0], &bi006[0],&bi007[0],&bi008[0],&bi009[0],&bi010[0],&bi011[0], &bi012[0],&bi013[0],&bi014[0],&bi015[0],&bi016[0],&bi017[0], &bi018[0],&bi019[0],&bi020[0],&bi021[0],&bi022[0],&bi023[0], &bi024[0],&bi025[0],&bi026[0],&bi027[0],&bi028[0],&bi029[0], &bi030[0],&bi031[0],&bi032[0],&bi033[0],&bi034[0],&bi035[0], &bi036[0],&bi037[0],&bi038[0],&bi039[0],&bi040[0],&bi041[0], &bi042[0],&bi043[0],&bi044[0],&bi045[0],&bi046[0],&bi047[0], &bi048[0],&bi049[0],&bi050[0],&bi051[0],&bi052[0],&bi053[0], &bi054[0],&bi055[0],&bi056[0],&bi057[0],&bi058[0],&bi059[0], &bi060[0],&bi061[0],&bi062[0],&bi063[0],&bi064[0],&bi065[0], &bi066[0],&bi067[0],&bi068[0],&bi069[0],&bi070[0],&bi071[0], &bi072[0],&bi073[0],&bi074[0],&bi075[0],&bi076[0],&bi077[0], &bi078[0],&bi079[0],&bi080[0],&bi081[0],&bi082[0],&bi083[0], &bi084[0],&bi085[0],&bi086[0],&bi087[0],&bi088[0],&bi089[0], &bi090[0],&bi091[0],&bi092[0],&bi093[0],&bi094[0],&bi095[0], &bi096[0],&bi097[0],&bi098[0],&bi099[0],&bi100[0],&bi101[0], &bi102[0],&bi103[0],&bi104[0],&bi105[0],&bi106[0],&bi107[0], &bi108[0],&bi109[0],&bi110[0],&bi111[0],&bi112[0],&bi113[0], &bi114[0],&bi115[0],&bi116[0],&bi117[0],&bi118[0],&bi119[0], &bi120[0],&bi121[0],&bi122[0],&bi123[0],&bi124[0],&bi125[0], &bi126[0],&bi127[0],&bi128[0],&bi129[0],&bi130[0],&bi131[0], &bi132[0],&bi133[0],&bi134[0],&bi135[0],&bi136[0],&bi137[0], &bi138[0],&bi139[0],&bi140[0],&bi141[0],&bi142[0],&bi143[0], &bi144[0],&bi145[0],&bi146[0],&bi147[0],&bi148[0],&bi149[0], &bi150[0],&bi151[0],&bi152[0],&bi153[0],&bi154[0],&bi155[0], &bi156[0],&bi157[0],&bi158[0],&bi159[0],&bi160[0],&bi161[0], &bi162[0],&bi163[0],&bi164[0],&bi165[0],&bi166[0],&bi167[0], &bi168[0],&bi169[0],&bi170[0],&bi171[0],&bi172[0],&bi173[0], &bi174[0],&bi175[0],&bi176[0],&bi177[0],&bi178[0],&bi179[0], &bi180[0],&bi181[0],&bi182[0],&bi183[0],&bi184[0],&bi185[0], &bi186[0],&bi187[0],&bi188[0],&bi189[0],&bi190[0],&bi191[0], &bi192[0],&bi193[0],&bi194[0],&bi195[0],&bi196[0],&bi197[0], &bi198[0],&bi199[0],&bi200[0],&bi201[0],&bi202[0],&bi203[0], &bi204[0],&bi205[0],&bi206[0],&bi207[0],&bi208[0],&bi209[0], &bi210[0],&bi211[0],&bi212[0],&bi213[0],&bi214[0],&bi215[0], &bi216[0],&bi217[0],&bi218[0],&bi219[0],&bi220[0],&bi221[0], &bi222[0],&bi223[0],&bi224[0],&bi225[0],&bi226[0],&bi227[0], &bi228[0],&bi229[0],&bi230[0],&bi231[0],&bi232[0],&bi233[0], &bi234[0],&bi235[0],&bi236[0],&bi237[0],&bi238[0],&bi239[0], &bi240[0],&bi241[0],&bi242[0],&bi243[0],&bi244[0],&bi245[0], &bi246[0],&bi247[0],&bi248[0],&bi249[0],&bi250[0],&bi251[0], &bi252[0],&bi253[0],&bi254[0],&bi255[0],&bi256[0],&bi257[0], &bi258[0],&bi259[0],&bi260[0],&bi261[0],&bi262[0],&bi263[0], &bi264[0],&bi265[0],&bi266[0],&bi267[0],&bi268[0],&bi269[0], &bi270[0],&bi271[0],&bi272[0],&bi273[0],&bi274[0],&bi275[0], &bi276[0],&bi277[0],&bi278[0],&bi279[0],&bi280[0],&bi281[0], &bi282[0],&bi283[0],&bi284[0],&bi285[0],&bi286[0],&bi287[0], &bi288[0],&bi289[0],&bi290[0],&bi291[0],&bi292[0],&bi293[0], &bi294[0],&bi295[0],&bi296[0],&bi297[0],&bi298[0],&bi299[0], &bi300[0],&bi301[0],&bi302[0],&bi303[0],&bi304[0],&bi305[0], &bi306[0],&bi307[0],&bi308[0],&bi309[0],&bi310[0],&bi311[0], &bi312[0],&bi313[0],&bi314[0],&bi315[0],&bi316[0],&bi317[0], &bi318[0],&bi319[0],&bi320[0],&bi321[0],&bi322[0],&bi323[0], &bi324[0],&bi325[0],&bi326[0],&bi327[0],&bi328[0],&bi329[0], &bi330[0],&bi331[0],&bi332[0],&bi333[0],&bi334[0],&bi335[0], &bi336[0],&bi337[0],&bi338[0],&bi339[0],&bi340[0],&bi341[0], &bi342[0],&bi343[0],&bi344[0],&bi345[0],&bi346[0],&bi347[0], &bi348[0],&bi349[0],&bi350[0],&bi351[0],&bi352[0],&bi353[0], &bi354[0],&bi355[0],&bi356[0],&bi357[0],&bi358[0],&bi359[0], &bi360[0],&bi361[0],&bi362[0],&bi363[0],&bi364[0],&bi365[0], &bi366[0],&bi367[0],&bi368[0],&bi369[0],&bi370[0],&bi371[0], &bi372[0],&bi373[0],&bi374[0],&bi375[0],&bi376[0],&bi377[0], &bi378[0],&bi379[0],&bi380[0],&bi381[0],&bi382[0],&bi383[0], &bi384[0],&bi385[0],&bi386[0],&bi387[0],&bi388[0],&bi389[0], &bi390[0],&bi391[0],&bi392[0],&bi393[0],&bi394[0],&bi395[0], &bi396[0],&bi397[0],&bi398[0],&bi399[0],&bi400[0],&bi401[0], &bi402[0],&bi403[0],&bi404[0],&bi405[0],&bi406[0],&bi407[0], &bi408[0],&bi409[0],&bi410[0],&bi411[0],&bi412[0],&bi413[0], &bi414[0],&bi415[0],&bi416[0],&bi417[0],&bi418[0],&bi419[0], &bi420[0],&bi421[0],&bi422[0],&bi423[0],&bi424[0],&bi425[0], &bi426[0],&bi427[0],&bi428[0],&bi429[0],&bi430[0],&bi431[0], &bi432[0],&bi433[0],&bi434[0],&bi435[0],&bi436[0],&bi437[0], &bi438[0],&bi439[0],&bi440[0],&bi441[0],&bi442[0],&bi443[0], &bi444[0],&bi445[0],&bi446[0],&bi447[0],&bi448[0],&bi449[0], &bi450[0],&bi451[0],&bi452[0],&bi453[0],&bi454[0],&bi455[0], &bi456[0],&bi457[0],&bi458[0],&bi459[0],&bi460[0],&bi461[0], &bi462[0],&bi463[0],&bi464[0],&bi465[0],&bi466[0],&bi467[0], &bi468[0],&bi469[0],&bi470[0],&bi471[0],&bi472[0],&bi473[0], &bi474[0],&bi475[0],&bi476[0],&bi477[0],&bi478[0],&bi479[0], &bi480[0],&bi481[0],&bi482[0],&bi483[0],&bi484[0],&bi485[0], &bi486[0],&bi487[0],&bi488[0],&bi489[0],&bi490[0],&bi491[0], &bi492[0],&bi493[0],&bi494[0],&bi495[0],&bi496[0],&bi497[0], &bi498[0],&bi499[0],&bi500[0],&bi501[0],&bi502[0],&bi503[0], &bi504[0],&bi505[0],&bi506[0],&bi507[0],&bi508[0],&bi509[0], &bi510[0],&bi511[0],&bi512[0],&bi513[0],&bi514[0],&bi515[0], &bi516[0],&bi517[0],&bi518[0],&bi519[0],&bi520[0],&bi521[0], &bi522[0],&bi523[0],&bi524[0],&bi525[0],&bi526[0],&bi527[0], &bi528[0],&bi529[0],&bi530[0],&bi531[0],&bi532[0],&bi533[0], &bi534[0],&bi535[0],&bi536[0],&bi537[0],&bi538[0],&bi539[0], &bi540[0],&bi541[0],&bi542[0],&bi543[0],&bi544[0],&bi545[0], &bi546[0],&bi547[0],&bi548[0],&bi549[0],&bi550[0],&bi551[0], &bi552[0],&bi553[0],&bi554[0],&bi555[0],&bi556[0],&bi557[0], &bi558[0],&bi559[0],&bi560[0],&bi561[0],&bi562[0],&bi563[0], &bi564[0],&bi565[0],&bi566[0],&bi567[0],&bi568[0],&bi569[0], &bi570[0],&bi571[0],&bi572[0],&bi573[0],&bi574[0],&bi575[0], &bi576[0],&bi577[0],&bi578[0],&bi579[0],&bi580[0],&bi581[0], &bi582[0],&bi583[0],&bi584[0],&bi585[0],&bi586[0],&bi587[0], &bi588[0],&bi589[0],&bi590[0],&bi591[0],&bi592[0],&bi593[0], &bi594[0],&bi595[0],&bi596[0],&bi597[0],&bi598[0],&bi599[0], &bi600[0],&bi601[0],&bi602[0],&bi603[0],&bi604[0],&bi605[0], &bi606[0],&bi607[0],&bi608[0],&bi609[0],&bi610[0],&bi611[0], &bi612[0],&bi613[0],&bi614[0],&bi615[0],&bi616[0],&bi617[0], &bi618[0],&bi619[0],&bi620[0],&bi621[0],&bi622[0],&bi623[0], &bi624[0],&bi625[0],&bi626[0],&bi627[0],&bi628[0],&bi629[0], &bi630[0],&bi631[0],&bi632[0],&bi633[0],&bi634[0],&bi635[0], &bi636[0],&bi637[0],&bi638[0],&bi639[0],&bi640[0],&bi641[0], &bi642[0],&bi643[0],&bi644[0],&bi645[0],&bi646[0],&bi647[0], &bi648[0],&bi649[0],&bi650[0],&bi651[0],&bi652[0],&bi653[0], &bi654[0],&bi655[0],&bi656[0],&bi657[0],&bi658[0],&bi659[0], &bi660[0],&bi661[0],&bi662[0],&bi663[0],&bi664[0],&bi665[0], &bi666[0],&bi667[0],&bi668[0],&bi669[0],&bi670[0],&bi671[0], &bi672[0],&bi673[0],&bi674[0],&bi675[0],&bi676[0],&bi677[0], &bi678[0],&bi679[0],&bi680[0],&bi681[0],&bi682[0],&bi683[0], &bi684[0],&bi685[0],&bi686[0],&bi687[0],&bi688[0],&bi689[0], &bi690[0],&bi691[0],&bi692[0],&bi693[0],&bi694[0],&bi695[0], &bi696[0],&bi697[0],&bi698[0],&bi699[0],&bi700[0],&bi701[0], &bi702[0],&bi703[0],&bi704[0],&bi705[0],&bi706[0],&bi707[0], &bi708[0],&bi709[0],&bi710[0],&bi711[0],&bi712[0],&bi713[0], &bi714[0],&bi715[0],&bi716[0],&bi717[0],&bi718[0],&bi719[0], &bi720[0],&bi721[0],&bi722[0],&bi723[0],&bi724[0],&bi725[0], &bi726[0],&bi727[0],&bi728[0],&bi729[0],&bi730[0],&bi731[0], &bi732[0],&bi733[0],&bi734[0],&bi735[0],&bi736[0],&bi737[0], &bi738[0],&bi739[0],&bi740[0],&bi741[0],&bi742[0],&bi743[0], &bi744[0],&bi745[0],&bi746[0],&bi747[0],&bi748[0],&bi749[0], &bi750[0],&bi751[0],&bi752[0],&bi753[0],&bi754[0],&bi755[0], &bi756[0],&bi757[0],&bi758[0],&bi759[0],&bi760[0],&bi761[0], &bi762[0],&bi763[0],&bi764[0],&bi765[0],&bi766[0],&bi767[0], &bi768[0],&bi769[0],&bi770[0],&bi771[0],&bi772[0],&bi773[0], &bi774[0],&bi775[0],&bi776[0],&bi777[0],&bi778[0],&bi779[0], &bi780[0],&bi781[0],&bi782[0],&bi783[0],&bi784[0],&bi785[0], &bi786[0],&bi787[0],&bi788[0],&bi789[0],&bi790[0],&bi791[0], &bi792[0],&bi793[0],&bi794[0],&bi795[0],&bi796[0],&bi797[0], &bi798[0],&bi799[0],&bi800[0],&bi801[0],&bi802[0],&bi803[0], &bi804[0],&bi805[0],&bi806[0],&bi807[0],&bi808[0],&bi809[0], &bi810[0],&bi811[0],&bi812[0],&bi813[0],&bi814[0],&bi815[0], &bi816[0],&bi817[0],&bi818[0],&bi819[0],&bi820[0],&bi821[0], &bi822[0],&bi823[0],&bi824[0],&bi825[0],&bi826[0],&bi827[0], &bi828[0],&bi829[0],&bi830[0],&bi831[0],&bi832[0],&bi833[0], &bi834[0],&bi835[0],&bi836[0],&bi837[0],&bi838[0],&bi839[0], &bi840[0],&bi841[0],&bi842[0],&bi843[0],&bi844[0],&bi845[0], &bi846[0],&bi847[0],&bi848[0],&bi849[0],&bi850[0],&bi851[0], &bi852[0],&bi853[0],&bi854[0],&bi855[0],&bi856[0],&bi857[0], &bi858[0],&bi859[0],&bi860[0],&bi861[0],&bi862[0],&bi863[0], &bi864[0],&bi865[0],&bi866[0],&bi867[0],&bi868[0],&bi869[0], &bi870[0],&bi871[0],&bi872[0],&bi873[0],&bi874[0] }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { int n = sizeof(bi)/sizeof(BoolInstr*); for (int i=0; i * * Copyright: * Christian Schulte, 2008 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ by $Author: schulte $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include namespace Test { namespace Int { /// %Tests for minimal modelling constraints (counting) namespace MiniModelCount { /// Expand relation to abbreviation std::string expand(Gecode::IntRelType irt) { switch (irt) { case Gecode::IRT_EQ: return "Exactly"; case Gecode::IRT_LQ: return "AtMost"; case Gecode::IRT_GQ: return "AtLeast"; default: GECODE_NEVER; } GECODE_NEVER; return ""; } /** * \defgroup TaskTestIntMiniModelCount Minimal modelling constraints (counting) * \ingroup TaskTestInt */ //@{ /// %Test number of equal integers equal to integer class IntInt : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test IntInt(Gecode::IntRelType irt0) : Test("MiniModel::"+expand(irt0)+"::Int::Int",4,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=x.size(); i--; ) if (x[i] == 0) m++; return cmp(m,irt,2); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { switch (irt) { case Gecode::IRT_EQ: Gecode::exactly(home,x,0,2); break; case Gecode::IRT_LQ: Gecode::atmost(home,x,0,2); break; case Gecode::IRT_GQ: Gecode::atleast(home,x,0,2); break; default: GECODE_NEVER; } } }; /// %Test number of equal integers equal to integer variable class IntVar : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test IntVar(Gecode::IntRelType irt0) : Test("MiniModel::"+expand(irt0)+"::Int::Var",5,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=0; i<4; i++) if (x[i] == 0) m++; return cmp(m,irt,x[4]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs y(4); for (int i=0; i<4; i++) y[i]=x[i]; switch (irt) { case Gecode::IRT_EQ: Gecode::exactly(home,y,0,x[4]); break; case Gecode::IRT_LQ: Gecode::atmost(home,y,0,x[4]); break; case Gecode::IRT_GQ: Gecode::atleast(home,y,0,x[4]); break; default: GECODE_NEVER; } } }; /// %Test number of equal variables equal to integer variable class VarVar : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test VarVar(Gecode::IntRelType irt0) : Test("MiniModel::"+expand(irt0)+"::Var::Var",5,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=0; i<3; i++) if (x[i] == x[3]) m++; return cmp(m,irt,x[4]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs y(3); for (int i=0; i<3; i++) y[i]=x[i]; switch (irt) { case Gecode::IRT_EQ: Gecode::exactly(home,y,x[3],x[4]); break; case Gecode::IRT_LQ: Gecode::atmost(home,y,x[3],x[4]); break; case Gecode::IRT_GQ: Gecode::atleast(home,y,x[3],x[4]); break; default: GECODE_NEVER; } } }; /// %Test number of equal variables equal to integer class VarInt : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test VarInt(Gecode::IntRelType irt0) : Test("MiniModel::"+expand(irt0)+"::Var::Int",4,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=0; i<3; i++) if (x[i] == x[3]) m++; return cmp(m,irt,2); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs y(3); for (int i=0; i<3; i++) y[i]=x[i]; switch (irt) { case Gecode::IRT_EQ: Gecode::exactly(home,y,x[3],2); break; case Gecode::IRT_LQ: Gecode::atmost(home,y,x[3],2); break; case Gecode::IRT_GQ: Gecode::atleast(home,y,x[3],2); break; default: GECODE_NEVER; } } }; Gecode::IntArgs ints(4, 1,0,3,2); /// %Test number of several equal integers equal to integer class IntArrayInt : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test IntArrayInt(Gecode::IntRelType irt0) : Test("MiniModel::"+expand(irt0)+"::IntArray::Int",5,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=0; i<4; i++) if (x[i] == ints[i]) m++; return cmp(m,irt,2); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs y(4); for (int i=0; i<4; i++) y[i]=x[i]; switch (irt) { case Gecode::IRT_EQ: Gecode::exactly(home,y,ints,2); break; case Gecode::IRT_LQ: Gecode::atmost(home,y,ints,2); break; case Gecode::IRT_GQ: Gecode::atleast(home,y,ints,2); break; default: GECODE_NEVER; } } }; /// %Test number of several equal integers equal to integer variable class IntArrayVar : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test IntArrayVar(Gecode::IntRelType irt0) : Test("MiniModel::"+expand(irt0)+"::IntArray::Var",5,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int m = 0; for (int i=0; i<4; i++) if (x[i] == ints[i]) m++; return cmp(m,irt,x[4]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs y(4); for (int i=0; i<4; i++) y[i]=x[i]; switch (irt) { case Gecode::IRT_EQ: Gecode::exactly(home,y,ints,x[4]); break; case Gecode::IRT_LQ: Gecode::atmost(home,y,ints,x[4]); break; case Gecode::IRT_GQ: Gecode::atleast(home,y,ints,x[4]); break; default: GECODE_NEVER; } } }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { for (IntRelTypes irts; irts(); ++irts) if ((irts.irt() == Gecode::IRT_EQ) || (irts.irt() == Gecode::IRT_LQ) || (irts.irt() == Gecode::IRT_GQ)) { (void) new IntInt(irts.irt()); (void) new IntVar(irts.irt()); (void) new VarVar(irts.irt()); (void) new VarInt(irts.irt()); (void) new IntArrayInt(irts.irt()); (void) new IntArrayVar(irts.irt()); } } }; Create c; //@} } }} // STATISTICS: test-minimodel gecode-4.2.1/test/int/mm-lin.cpp0000755000175000010010000023651712077527524015563 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2008 * * Last modified: * $Date: 2013-01-22 16:25:08 +0100 (Tue, 22 Jan 2013) $ by $Author: schulte $ * $Revision: 13228 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include namespace Test { namespace Int { /// %Tests for minimal modelling constraints (linear) namespace MiniModelLin { /// Linear opcode enum LinOpcode { LO_ACE, ///< Add integer and expression LO_AEC, ///< Add expression and integer LO_AEE, ///< Add expressions LO_SCE, ///< Subtract integer and expression LO_SEC, ///< Subtract expression and integer LO_SEE, ///< Subtract expressions LO_SE, ///< Unary subtraction LO_MCE, ///< Multiply constant and expression LO_MEC, ///< Multiply constant and expression LO_HLT ///< Stop execution }; /// Type for representing a linear instruction class LinInstr { public: LinOpcode o; ///< Which instruction to execute unsigned char x, y, z; ///< Instruction arguments, \a y is destination (or \a z) int c; ///< Numerical constant }; /// Evaluate linear instructions template Expr eval(const LinInstr* pc, Expr reg[]) { while (true) { switch (pc->o) { case LO_ACE: reg[pc->y] = pc->c + reg[pc->x]; break; case LO_AEC: reg[pc->y] = reg[pc->x] + pc->c; break; case LO_AEE: reg[pc->z] = reg[pc->x] + reg[pc->y]; break; case LO_SCE: reg[pc->y] = pc->c - reg[pc->x]; break; case LO_SEC: reg[pc->y] = reg[pc->x] - pc->c; break; case LO_SEE: reg[pc->z] = reg[pc->x] - reg[pc->y]; break; case LO_SE: reg[pc->y] = -reg[pc->x]; break; case LO_MCE: reg[pc->y] = pc->c * reg[pc->x]; break; case LO_MEC: reg[pc->y] = reg[pc->x] * pc->c; break; case LO_HLT: return reg[pc->x]; default: GECODE_NEVER; } pc++; } GECODE_NEVER; } /** * \defgroup TaskTestIntMiniModelLin Minimal modeling constraints (linear constraints) * \ingroup TaskTestInt */ //@{ /// %Test linear expressions over integer variables class LinExprInt : public Test { protected: /// Linear instruction sequence const LinInstr* lis; public: /// Create and register test LinExprInt(const LinInstr* lis0, const std::string& s) : Test("MiniModel::LinExpr::Int::"+s,4,-3,3), lis(lis0) { testfix = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int reg[3] = {x[0],x[1],x[2]}; return eval(lis, reg) == x[3]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; Gecode::LinIntExpr reg[3] = {x[0],x[1],x[2]}; rel(home, x[3], IRT_EQ, Gecode::expr(home, eval(lis,reg))); } }; /// %Test linear expressions over Boolean variables class LinExprBool : public Test { protected: /// Linear instruction sequence const LinInstr* lis; public: /// Create and register test LinExprBool(const LinInstr* lis0, const std::string& s) : Test("MiniModel::LinExpr::Bool::"+s,4,-3,3), lis(lis0) { testfix = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { for (int i=3; i--; ) if ((x[i] < 0) || (x[i] > 1)) return false; int reg[3] = {x[0],x[1],x[2]}; return eval(lis, reg) == x[3]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; Gecode::LinIntExpr reg[3] = { channel(home,x[0]),channel(home,x[1]),channel(home,x[2]) }; rel(home, x[3], IRT_EQ, Gecode::expr(home, eval(lis,reg))); } }; /// %Test linear expressions over integer and Boolean variables class LinExprMixed : public Test { protected: /// Linear instruction sequence const LinInstr* lis; public: /// Create and register test LinExprMixed(const LinInstr* lis0, const std::string& s) : Test("MiniModel::LinExpr::Mixed::"+s,4,-3,3), lis(lis0) { testfix = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { if ((x[2] < 0) || (x[2] > 1)) return false; int reg[3] = {x[0],x[1],x[2]}; return eval(lis, reg) == x[3]; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; Gecode::LinIntExpr reg[3] = { x[0],x[1],channel(home,x[2]) }; rel(home, x[3], IRT_EQ, Gecode::expr(home, eval(lis,reg))); } }; /// %Test linear relations over integer variables class LinRelInt : public Test { protected: /// Linear instruction sequence for left hand side const LinInstr* l_lis; /// Linear instruction sequence for right hand side const LinInstr* r_lis; /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test LinRelInt(const LinInstr* l_lis0, const LinInstr* r_lis0, Gecode::IntRelType irt0, const std::string& s) : Test("MiniModel::LinRel::Int::"+s+"::"+str(irt0),3,-3,3,true), l_lis(l_lis0), r_lis(r_lis0), irt(irt0) { testfix = false; rms = (1 << Gecode::RM_EQV); } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int l_reg[3] = {x[0],x[1],x[2]}; int r_reg[3] = {x[0],x[1],x[2]}; return cmp(eval(l_lis,l_reg),irt,eval(r_lis,r_reg)); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; Gecode::LinIntExpr l_reg[3] = {x[0],x[1],x[2]}; Gecode::LinIntExpr r_reg[3] = {x[0],x[1],x[2]}; switch (irt) { case IRT_EQ: { IntVar x = Gecode::expr(home,eval(l_lis,l_reg)); IntVar y = Gecode::expr(home,eval(r_lis,r_reg)); IntArgs a(2, 1,-1); IntVarArgs xy(2); xy[0]=x; xy[1]=y; Gecode::rel(home, 0 == sum(a,xy)); } break; case IRT_NQ: Gecode::rel(home, eval(l_lis,l_reg) - eval(r_lis,r_reg) != 0); break; case IRT_LQ: Gecode::rel(home, !(eval(l_lis,l_reg) > eval(r_lis,r_reg))); break; case IRT_LE: Gecode::rel(home, eval(l_lis,l_reg) < eval(r_lis,r_reg)); break; case IRT_GQ: Gecode::rel(home, eval(l_lis,l_reg) >= eval(r_lis,r_reg)); break; case IRT_GR: Gecode::rel(home, !(eval(l_lis,l_reg) <= eval(r_lis,r_reg))); break; default: GECODE_NEVER; } } /// Post constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { using namespace Gecode; assert(r.mode() == RM_EQV); Gecode::LinIntExpr l_reg[3] = {x[0],x[1],x[2]}; Gecode::LinIntExpr r_reg[3] = {x[0],x[1],x[2]}; switch (irt) { case IRT_EQ: rel(home, Gecode::expr(home, (eval(l_lis,l_reg)==eval(r_lis,r_reg))), IRT_EQ, r.var()); break; case IRT_NQ: Gecode::rel(home, (eval(l_lis,l_reg)!=eval(r_lis,r_reg)) == r.var()); break; case IRT_LQ: Gecode::rel(home, !((eval(l_lis,l_reg)<=eval(r_lis,r_reg))^r.var())); break; case IRT_LE: rel(home, Gecode::expr(home, (eval(l_lis,l_reg)=eval(r_lis,r_reg)) == r.var()); break; case IRT_GR: Gecode::rel(home, !((eval(l_lis,l_reg)>eval(r_lis,r_reg))^r.var())); break; default: GECODE_NEVER; } } }; /// %Test linear relations over Boolean variables class LinRelBool : public Test { protected: /// Linear instruction sequence for left hand side const LinInstr* l_lis; /// Linear instruction sequence for right hand side const LinInstr* r_lis; /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test LinRelBool(const LinInstr* l_lis0, const LinInstr* r_lis0, Gecode::IntRelType irt0, const std::string& s) : Test("MiniModel::LinRel::Bool::"+s+"::"+str(irt0),3,0,1,true), l_lis(l_lis0), r_lis(r_lis0), irt(irt0) { testfix = false; rms = (1 << Gecode::RM_EQV); } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int l_reg[3] = {x[0],x[1],x[2]}; int r_reg[3] = {x[0],x[1],x[2]}; return cmp(eval(l_lis,l_reg),irt,eval(r_lis,r_reg)); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; BoolVarArgs y(3); y[0] = channel(home,x[0]); y[1] = channel(home,x[1]); y[2] = channel(home,x[2]); Gecode::LinIntExpr l_reg[3] = {y[0],y[1],y[2]}; Gecode::LinIntExpr r_reg[3] = {y[0],y[1],y[2]}; switch (irt) { case IRT_EQ: { IntVar x = Gecode::expr(home,eval(l_lis,l_reg)); IntVar y = Gecode::expr(home,eval(r_lis,r_reg)); IntArgs a(2, -2,2); IntVarArgs xy(2); xy[0]=x; xy[1]=y; Gecode::rel(home, 0 == sum(a,xy)); } break; case IRT_NQ: Gecode::rel(home, eval(l_lis,l_reg) - eval(r_lis,r_reg) != 0); break; case IRT_LQ: Gecode::rel(home, !(eval(l_lis,l_reg) > eval(r_lis,r_reg))); break; case IRT_LE: Gecode::rel(home, eval(l_lis,l_reg) < eval(r_lis,r_reg)); break; case IRT_GQ: Gecode::rel(home, eval(l_lis,l_reg) >= eval(r_lis,r_reg)); break; case IRT_GR: Gecode::rel(home, !(eval(l_lis,l_reg) <= eval(r_lis,r_reg))); break; default: GECODE_NEVER; } } /// Post constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { using namespace Gecode; assert(r.mode() == RM_EQV); BoolVarArgs y(3); y[0] = channel(home,x[0]); y[1] = channel(home,x[1]); y[2] = channel(home,x[2]); Gecode::LinIntExpr l_reg[3] = {y[0],y[1],y[2]}; Gecode::LinIntExpr r_reg[3] = {y[0],y[1],y[2]}; switch (irt) { case IRT_EQ: rel(home, Gecode::expr(home, (eval(l_lis,l_reg)==eval(r_lis,r_reg))), IRT_EQ, r.var()); break; case IRT_NQ: Gecode::rel(home, (eval(l_lis,l_reg)!=eval(r_lis,r_reg)) == r.var()); break; case IRT_LQ: Gecode::rel(home, !((eval(l_lis,l_reg)<=eval(r_lis,r_reg))^r.var())); break; case IRT_LE: rel(home, Gecode::expr(home, (eval(l_lis,l_reg)=eval(r_lis,r_reg)) == r.var()); break; case IRT_GR: Gecode::rel(home, !((eval(l_lis,l_reg)>eval(r_lis,r_reg))^r.var())); break; default: GECODE_NEVER; } } }; /// %Test linear relations over integer and Boolean variables class LinRelMixed : public Test { protected: /// Linear instruction sequence for left hand side const LinInstr* l_lis; /// Linear instruction sequence for right hand side const LinInstr* r_lis; /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test LinRelMixed(const LinInstr* l_lis0, const LinInstr* r_lis0, Gecode::IntRelType irt0, const std::string& s) : Test("MiniModel::LinRel::Mixed::"+s+"::"+str(irt0),6,0,1,true), l_lis(l_lis0), r_lis(r_lis0), irt(irt0) { testfix = false; rms = (1 << Gecode::RM_EQV); } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int l_reg[3] = {x[0],x[1],x[2]}; int r_reg[3] = {x[3],x[4],x[5]}; return cmp(eval(l_lis,l_reg),irt,eval(r_lis,r_reg)); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; Gecode::LinIntExpr l_reg[3] = {channel(home,x[0]),x[1],x[2]}; Gecode::LinIntExpr r_reg[3] = {channel(home,x[3]),x[4], channel(home,x[5])}; switch (irt) { case IRT_EQ: Gecode::rel(home, 0 == eval(l_lis,l_reg) - eval(r_lis,r_reg)); break; case IRT_NQ: Gecode::rel(home, eval(l_lis,l_reg) - eval(r_lis,r_reg) != 0); break; case IRT_LQ: Gecode::rel(home, !(eval(l_lis,l_reg) > eval(r_lis,r_reg))); break; case IRT_LE: Gecode::rel(home, eval(l_lis,l_reg) < eval(r_lis,r_reg)); break; case IRT_GQ: Gecode::rel(home, eval(l_lis,l_reg) >= eval(r_lis,r_reg)); break; case IRT_GR: Gecode::rel(home, !(eval(l_lis,l_reg) <= eval(r_lis,r_reg))); break; default: GECODE_NEVER; } } /// Post constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { using namespace Gecode; assert(r.mode() == RM_EQV); Gecode::LinIntExpr l_reg[3] = {channel(home,x[0]),x[1],x[2]}; Gecode::LinIntExpr r_reg[3] = {channel(home,x[3]),x[4], channel(home,x[5])}; switch (irt) { case IRT_EQ: rel(home, Gecode::expr(home, (eval(l_lis,l_reg)==eval(r_lis,r_reg))), IRT_EQ, r.var()); break; case IRT_NQ: rel(home, Gecode::expr(home, (eval(l_lis,l_reg)!=eval(r_lis,r_reg))), IRT_EQ, r.var()); break; case IRT_LQ: rel(home, Gecode::expr(home, (eval(l_lis,l_reg)<=eval(r_lis,r_reg))), IRT_EQ, r.var()); break; case IRT_LE: rel(home, Gecode::expr(home, (eval(l_lis,l_reg)=eval(r_lis,r_reg))), IRT_EQ, r.var()); break; case IRT_GR: rel(home, Gecode::expr(home, (eval(l_lis,l_reg)>eval(r_lis,r_reg))), IRT_EQ, r.var()); break; default: GECODE_NEVER; } } }; const LinInstr li000[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li001[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li002[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li003[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li004[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li005[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li006[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li007[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li008[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li009[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li010[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li011[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li012[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li013[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li014[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li015[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li016[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li017[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li018[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li019[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li020[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li021[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li022[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li023[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li024[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li025[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li026[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li027[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li028[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li029[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li030[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li031[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li032[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li033[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li034[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li035[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li036[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li037[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li038[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li039[] = { {LO_AEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li040[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li041[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li042[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li043[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li044[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li045[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li046[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li047[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li048[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li049[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li050[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li051[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li052[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li053[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li054[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li055[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li056[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li057[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li058[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li059[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li060[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li061[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li062[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li063[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li064[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li065[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li066[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li067[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li068[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li069[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li070[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li071[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li072[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li073[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li074[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li075[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li076[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li077[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li078[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li079[] = { {LO_AEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li080[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li081[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li082[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li083[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li084[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li085[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li086[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li087[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li088[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li089[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li090[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li091[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li092[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li093[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li094[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li095[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li096[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li097[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li098[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li099[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li100[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li101[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li102[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li103[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li104[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li105[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li106[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li107[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li108[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li109[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li110[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li111[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li112[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li113[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li114[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li115[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li116[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li117[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li118[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li119[] = { {LO_AEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li120[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li121[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li122[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li123[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li124[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li125[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li126[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li127[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li128[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li129[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li130[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li131[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li132[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li133[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li134[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li135[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li136[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li137[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li138[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li139[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li140[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li141[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li142[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li143[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li144[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li145[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li146[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li147[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li148[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li149[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li150[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li151[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li152[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li153[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li154[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li155[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li156[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li157[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li158[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li159[] = { {LO_AEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li160[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li161[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li162[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li163[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li164[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li165[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li166[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li167[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li168[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li169[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li170[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li171[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li172[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li173[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li174[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li175[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li176[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li177[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li178[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li179[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li180[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li181[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li182[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li183[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li184[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li185[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li186[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li187[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li188[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li189[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li190[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li191[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li192[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li193[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li194[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li195[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li196[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li197[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li198[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li199[] = { {LO_AEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li200[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li201[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li202[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li203[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li204[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li205[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li206[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li207[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li208[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li209[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li210[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li211[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li212[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li213[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li214[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li215[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li216[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li217[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li218[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li219[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li220[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li221[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li222[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li223[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li224[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li225[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li226[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li227[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li228[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li229[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li230[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li231[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li232[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li233[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li234[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li235[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li236[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li237[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li238[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li239[] = { {LO_SEE,0,1,0, 0},{LO_AEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li240[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li241[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li242[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li243[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li244[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li245[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li246[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li247[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li248[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li249[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li250[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li251[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li252[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li253[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li254[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li255[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li256[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li257[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li258[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li259[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li260[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li261[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li262[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li263[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li264[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li265[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li266[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li267[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li268[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li269[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li270[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li271[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li272[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li273[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li274[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li275[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li276[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li277[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li278[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li279[] = { {LO_SEE,0,1,0, 0},{LO_SCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li280[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li281[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li282[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li283[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li284[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li285[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li286[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li287[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li288[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li289[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li290[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li291[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li292[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li293[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li294[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li295[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li296[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li297[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li298[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li299[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li300[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li301[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li302[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li303[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li304[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li305[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li306[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li307[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li308[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li309[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li310[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li311[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li312[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li313[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li314[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li315[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li316[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li317[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li318[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li319[] = { {LO_SEE,0,1,0, 0},{LO_SEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li320[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li321[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li322[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li323[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li324[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li325[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li326[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li327[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li328[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li329[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li330[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li331[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li332[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li333[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li334[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li335[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li336[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li337[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li338[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li339[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li340[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li341[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li342[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li343[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li344[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li345[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li346[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li347[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li348[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li349[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li350[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li351[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li352[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li353[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li354[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li355[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li356[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li357[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li358[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li359[] = { {LO_SEE,0,1,0, 0},{LO_MCE,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li360[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li361[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li362[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li363[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li364[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li365[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li366[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li367[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li368[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li369[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li370[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li371[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li372[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li373[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li374[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li375[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0,-1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li376[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li377[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li378[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li379[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li380[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li381[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li382[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li383[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 0},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li384[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li385[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li386[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li387[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li388[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li389[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li390[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li391[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 1},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li392[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li393[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li394[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li395[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_AEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li396[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0,-1},{LO_HLT,0,0,0, 0} }; const LinInstr li397[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_ACE,0,0,0, 1},{LO_HLT,0,0,0, 0} }; const LinInstr li398[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr li399[] = { {LO_SEE,0,1,0, 0},{LO_MEC,0,0,0, 2},{LO_SEE,0,2,0, 0}, {LO_SE ,0,0,0, 0},{LO_HLT,0,0,0, 0} }; const LinInstr* li[] = { &li000[0],&li001[0],&li002[0],&li003[0],&li004[0],&li005[0], &li006[0],&li007[0],&li008[0],&li009[0],&li010[0],&li011[0], &li012[0],&li013[0],&li014[0],&li015[0],&li016[0],&li017[0], &li018[0],&li019[0],&li020[0],&li021[0],&li022[0],&li023[0], &li024[0],&li025[0],&li026[0],&li027[0],&li028[0],&li029[0], &li030[0],&li031[0],&li032[0],&li033[0],&li034[0],&li035[0], &li036[0],&li037[0],&li038[0],&li039[0],&li040[0],&li041[0], &li042[0],&li043[0],&li044[0],&li045[0],&li046[0],&li047[0], &li048[0],&li049[0],&li050[0],&li051[0],&li052[0],&li053[0], &li054[0],&li055[0],&li056[0],&li057[0],&li058[0],&li059[0], &li060[0],&li061[0],&li062[0],&li063[0],&li064[0],&li065[0], &li066[0],&li067[0],&li068[0],&li069[0],&li070[0],&li071[0], &li072[0],&li073[0],&li074[0],&li075[0],&li076[0],&li077[0], &li078[0],&li079[0],&li080[0],&li081[0],&li082[0],&li083[0], &li084[0],&li085[0],&li086[0],&li087[0],&li088[0],&li089[0], &li090[0],&li091[0],&li092[0],&li093[0],&li094[0],&li095[0], &li096[0],&li097[0],&li098[0],&li099[0],&li100[0],&li101[0], &li102[0],&li103[0],&li104[0],&li105[0],&li106[0],&li107[0], &li108[0],&li109[0],&li110[0],&li111[0],&li112[0],&li113[0], &li114[0],&li115[0],&li116[0],&li117[0],&li118[0],&li119[0], &li120[0],&li121[0],&li122[0],&li123[0],&li124[0],&li125[0], &li126[0],&li127[0],&li128[0],&li129[0],&li130[0],&li131[0], &li132[0],&li133[0],&li134[0],&li135[0],&li136[0],&li137[0], &li138[0],&li139[0],&li140[0],&li141[0],&li142[0],&li143[0], &li144[0],&li145[0],&li146[0],&li147[0],&li148[0],&li149[0], &li150[0],&li151[0],&li152[0],&li153[0],&li154[0],&li155[0], &li156[0],&li157[0],&li158[0],&li159[0],&li160[0],&li161[0], &li162[0],&li163[0],&li164[0],&li165[0],&li166[0],&li167[0], &li168[0],&li169[0],&li170[0],&li171[0],&li172[0],&li173[0], &li174[0],&li175[0],&li176[0],&li177[0],&li178[0],&li179[0], &li180[0],&li181[0],&li182[0],&li183[0],&li184[0],&li185[0], &li186[0],&li187[0],&li188[0],&li189[0],&li190[0],&li191[0], &li192[0],&li193[0],&li194[0],&li195[0],&li196[0],&li197[0], &li198[0],&li199[0],&li200[0],&li201[0],&li202[0],&li203[0], &li204[0],&li205[0],&li206[0],&li207[0],&li208[0],&li209[0], &li210[0],&li211[0],&li212[0],&li213[0],&li214[0],&li215[0], &li216[0],&li217[0],&li218[0],&li219[0],&li220[0],&li221[0], &li222[0],&li223[0],&li224[0],&li225[0],&li226[0],&li227[0], &li228[0],&li229[0],&li230[0],&li231[0],&li232[0],&li233[0], &li234[0],&li235[0],&li236[0],&li237[0],&li238[0],&li239[0], &li240[0],&li241[0],&li242[0],&li243[0],&li244[0],&li245[0], &li246[0],&li247[0],&li248[0],&li249[0],&li250[0],&li251[0], &li252[0],&li253[0],&li254[0],&li255[0],&li256[0],&li257[0], &li258[0],&li259[0],&li260[0],&li261[0],&li262[0],&li263[0], &li264[0],&li265[0],&li266[0],&li267[0],&li268[0],&li269[0], &li270[0],&li271[0],&li272[0],&li273[0],&li274[0],&li275[0], &li276[0],&li277[0],&li278[0],&li279[0],&li280[0],&li281[0], &li282[0],&li283[0],&li284[0],&li285[0],&li286[0],&li287[0], &li288[0],&li289[0],&li290[0],&li291[0],&li292[0],&li293[0], &li294[0],&li295[0],&li296[0],&li297[0],&li298[0],&li299[0], &li300[0],&li301[0],&li302[0],&li303[0],&li304[0],&li305[0], &li306[0],&li307[0],&li308[0],&li309[0],&li310[0],&li311[0], &li312[0],&li313[0],&li314[0],&li315[0],&li316[0],&li317[0], &li318[0],&li319[0],&li320[0],&li321[0],&li322[0],&li323[0], &li324[0],&li325[0],&li326[0],&li327[0],&li328[0],&li329[0], &li330[0],&li331[0],&li332[0],&li333[0],&li334[0],&li335[0], &li336[0],&li337[0],&li338[0],&li339[0],&li340[0],&li341[0], &li342[0],&li343[0],&li344[0],&li345[0],&li346[0],&li347[0], &li348[0],&li349[0],&li350[0],&li351[0],&li352[0],&li353[0], &li354[0],&li355[0],&li356[0],&li357[0],&li358[0],&li359[0], &li360[0],&li361[0],&li362[0],&li363[0],&li364[0],&li365[0], &li366[0],&li367[0],&li368[0],&li369[0],&li370[0],&li371[0], &li372[0],&li373[0],&li374[0],&li375[0],&li376[0],&li377[0], &li378[0],&li379[0],&li380[0],&li381[0],&li382[0],&li383[0], &li384[0],&li385[0],&li386[0],&li387[0],&li388[0],&li389[0], &li390[0],&li391[0],&li392[0],&li393[0],&li394[0],&li395[0], &li396[0],&li397[0],&li398[0],&li399[0], }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { int n = sizeof(li)/sizeof(LinInstr*); for (int i=0; i * * Copyright: * Christian Schulte, 2008 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ by $Author: schulte $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include namespace Test { namespace Int { /// %Tests for minimal modelling constraints (simple relations) namespace MiniModel { /** * \defgroup TaskTestIntMiniModelRel Minimal modelling constraints (relation) * \ingroup TaskTestInt */ //@{ /// %Test for relation between arrays of integer variables class IntLex : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test IntLex(Gecode::IntRelType irt0) : Test("MiniModel::Lex::Int::"+str(irt0),6,-2,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int n=x.size() >> 1; for (int i=0; i> 1; IntVarArgs y(n); IntVarArgs z(n); for (int i=0; i> 1; for (int i=0; i> 1; BoolVarArgs y(n); BoolVarArgs z(n); for (int i=0; i * * Copyright: * Christian Schulte, 2011 * * Last modified: * $Date: 2012-10-22 21:13:52 +0200 (Mon, 22 Oct 2012) $ by $Author: schulte $ * $Revision: 13163 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include #include namespace Test { namespace Int { /// %Tests for no-overlap constraint namespace NoOverlap { /** * \defgroup TaskTestIntNoOverlap No-overlap constraints * \ingroup TaskTestInt */ //@{ /// %Test for no-overlap with integer dimensions (rectangles) class Int2 : public Test { protected: /// Width Gecode::IntArgs w; /// Height Gecode::IntArgs h; public: /// Create and register test with maximal coordinate value \a m Int2(int m, const Gecode::IntArgs& w0, const Gecode::IntArgs& h0) : Test("NoOverlap::Int::2::"+str(m)+"::"+str(w0)+"::"+str(h0), 2*w0.size(), 0, m-1), w(w0), h(h0) { } /// %Test whether \a xy is solution virtual bool solution(const Assignment& xy) const { int n = xy.size() / 2; for (int i=0; i 0) && (oj > 0) && !((xi + w[i] <= xj) || (xj + w[j] <= xi) || (yi + h[i] <= yj) || (yj + h[j] <= yi))) return false; } } return true; } /// Post constraint on \a xwyho virtual void post(Gecode::Space& home, Gecode::IntVarArray& xyo) { using namespace Gecode; int n = xyo.size() / 3; IntVarArgs x(n), y(n); BoolVarArgs o(n); for (int i=0; i 0); } nooverlap(home, x, w, y, h, o); } }; /// %Test for no-overlap with variable dimensions (rectangles) class Var2 : public Test { public: /// Create and register test with maximal value \a m and \a n rectangles Var2(int m, int n) : Test("NoOverlap::Var::2::"+str(m)+"::"+str(n), 4*n, 0, m) {} /// %Test whether \a xwyh is solution virtual bool solution(const Assignment& xwyh) const { int n = xwyh.size() / 4; for (int i=0; i 0) && (oj > 0) && !((xi + wi <= xj) || (xj + wj <= xi) || (yi + hi <= yj) || (yj + hj <= yi))) return false; } } return true; } /// Post constraint on \a xwyho virtual void post(Gecode::Space& home, Gecode::IntVarArray& xwyho) { using namespace Gecode; int n = xwyho.size() / 5; IntVarArgs x0(n), w(n), x1(n), y0(n), h(n), y1(n); BoolVarArgs o(n); for (int i=0; i 0); } nooverlap(home, x0, w, x1, y0, h, y1, o); } }; /// %Test for no-overlap with optional rectangles and shared variables class VarOptShared2 : public Test { public: /// Create and register test with maximal value \a m and \a n rectangles VarOptShared2(int m, int n) : Test("NoOverlap::Var::Opt::Shared::2::"+ str(m)+"::"+str(n), 2*n+2, 0, m) { testfix = false; } /// %Test whether \a xwyho is solution virtual bool solution(const Assignment& xwyho) const { int n = (xwyho.size() - 2) / 2; for (int i=0; i 0) && (oj > 0) && !((xi + wi <= xj) || (xj + wj <= xi) || (yi + hi <= yj) || (yj + hj <= yi))) return false; } } return true; } /// Post constraint on \a xwyho virtual void post(Gecode::Space& home, Gecode::IntVarArray& xwyho) { using namespace Gecode; int n = (xwyho.size() - 2) / 2; IntVarArgs x0(n), w(n), x1(n), y0(n), h(n), y1(n); BoolVarArgs o(n); for (int i=0; i 0); } nooverlap(home, x0, w, x1, y0, h, y1, o); } }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { using namespace Gecode; IntArgs s1(3, 2,1,1); IntArgs s2(4, 1,2,3,4); IntArgs s3(4, 4,3,2,1); IntArgs s4(4, 1,1,1,1); for (int m=2; m<3; m++) { (void) new Int2(m, s1, s1); (void) new Int2(m, s2, s2); (void) new Int2(m, s3, s3); (void) new Int2(m, s2, s3); (void) new Int2(m, s4, s4); (void) new Int2(m, s4, s2); (void) new IntOpt2(m, s2, s3); (void) new IntOpt2(m, s4, s3); } (void) new Var2(2, 2); (void) new Var2(3, 2); (void) new Var2(1, 3); (void) new VarOpt2(2, 2); (void) new VarOpt2(3, 2); (void) new VarOptShared2(2, 2); (void) new VarOptShared2(3, 2); (void) new VarOptShared2(4, 2); } }; Create c; //@} } }} // STATISTICS: test-int gecode-4.2.1/test/int/nvalues.cpp0000755000175000010010000001662211623021715016023 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2011 * * Last modified: * $Date: 2011-08-17 22:25:49 +0200 (Wed, 17 Aug 2011) $ by $Author: schulte $ * $Revision: 12308 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include "test/int.hh" namespace Test { namespace Int { /// %Tests for number of values constraints namespace NValues { /** * \defgroup TaskTestIntNValues Number of values constraints * \ingroup TaskTestInt */ //@{ /// %Test number of values of integer variables equal to integer class IntInt : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; /// Number of values int m; public: /// Create and register test IntInt(int n, int m0, Gecode::IntRelType irt0) : Test("NValues::Int::Int::"+str(irt0)+"::"+str(n)+"::"+str(m0), n,0,n), irt(irt0), m(m0) { testfix = false; if (arity > 5) testsearch = false; } /// Create and register initial assignment virtual Assignment* assignment(void) const { if (arity > 5) return new RandomAssignment(arity,dom,500); else return new CpltAssignment(arity,dom); } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int n = x.size(); bool* v = new bool[n+1]; for (int i=n+1; i--; ) v[i] = false; int k = 0; for (int i=n; i--; ) if (!v[x[i]]) { k++; v[x[i]] = true; } delete [] v; return cmp(k,irt,m); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::nvalues(home, x, irt, m); } }; /// %Test number of values of integer variables equal to integer variable class IntVar : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test IntVar(int n, Gecode::IntRelType irt0) : Test("NValues::Int::Var::"+str(irt0)+"::"+str(n),n+1,0,n), irt(irt0) { testfix = false; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int n = x.size() - 1; bool* v = new bool[n+1]; for (int i=n+1; i--; ) v[i] = false; int k = 0; for (int i=n; i--; ) if (!v[x[i]]) { k++; v[x[i]] = true; } delete [] v; return cmp(k,irt,x[n]); } /// Post constraint on \a xy virtual void post(Gecode::Space& home, Gecode::IntVarArray& xy) { int n = xy.size() - 1; Gecode::IntVarArgs x(n); for (int i=n; i--; ) x[i] = xy[i]; Gecode::nvalues(home, x, irt, xy[n]); } }; /// %Test number of values of Boolean variables equal to integer class BoolInt : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; /// Number of values int m; public: /// Create and register test BoolInt(int n, int m0, Gecode::IntRelType irt0) : Test("NValues::Bool::Int::"+str(irt0)+"::"+str(n)+"::"+str(m0), n,0,2), irt(irt0), m(m0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int n = x.size(); for (int i=n; i--; ) if (x[i] > 1) return false; bool* v = new bool[n+1]; for (int i=n+1; i--; ) v[i] = false; int k = 0; for (int i=n; i--; ) if (!v[x[i]]) { k++; v[x[i]] = true; } delete [] v; return cmp(k,irt,m); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; BoolVarArgs y(x.size()); for (int i=x.size(); i--; ) y[i] = channel(home, x[i]); nvalues(home, y, irt, m); } }; /// %Test number of values of Boolean variables equal to integer variable class BoolVar : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test BoolVar(int n, Gecode::IntRelType irt0) : Test("NValues::Bool::Var::"+str(irt0)+"::"+str(n),n+1,0,2), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int n = x.size() - 1; for (int i=n; i--; ) if (x[i] > 1) return false; bool* v = new bool[n+1]; for (int i=n+1; i--; ) v[i] = false; int k = 0; for (int i=n; i--; ) if (!v[x[i]]) { k++; v[x[i]] = true; } delete [] v; return cmp(k,irt,x[n]); } /// Post constraint on \a xy virtual void post(Gecode::Space& home, Gecode::IntVarArray& xy) { using namespace Gecode; int n = xy.size() - 1; BoolVarArgs x(n); for (int i=n; i--; ) x[i] = channel(home, xy[i]); nvalues(home, x, irt, xy[n]); } }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { for (IntRelTypes irts; irts(); ++irts) { for (int i=1; i<=7; i += 3) { for (int m=0; m<=3; m++) (void) new BoolInt(i, m, irts.irt()); (void) new BoolVar(i, irts.irt()); } for (int i=1; i<=7; i += 2) { for (int m=0; m<=i+1; m++) (void) new IntInt(i, m, irts.irt()); if (i <= 5) (void) new IntVar(i, irts.irt()); } } } }; Create c; //@} } }} // STATISTICS: test-int gecode-4.2.1/test/int/precede.cpp0000644000175000010010000000712111607023242015743 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christopher Mears * * Contributing authors: * Christian Schulte * * Copyright: * Christopher Mears, 2011 * Christian Schulte, 2011 * * Last modified: * $Date: 2011-07-12 12:49:06 +0200 (Tue, 12 Jul 2011) $ by $Author: tack $ * $Revision: 12172 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" namespace Test { namespace Int { /// %Tests for value precedence constraints namespace Precede { /// %Test for single value precedence constraint class Single : public Test { private: /// The values for precedence int s, t; public: /// Create and register test Single(int s0, int t0) : Test("Precede::Single::"+str(s0)+"<"+str(t0),8,1,4), s(s0), t(t0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int n = x.size(); for (int i = 0 ; i < n ; i++) { if (x[i] == t) return false; if (x[i] == s) return true; } return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::precede(home, x, s, t); } }; /// %Test for multiple value precedence constraint class Multi : public Test { private: /// The values for precedence Gecode::IntArgs c; public: /// Create and register test Multi(const Gecode::IntArgs& c0) : Test("Precede::Multi::"+str(c0),6,1,5), c(c0) { contest = CTL_NONE; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { for (int j=0; j * * Copyright: * Christian Schulte, 2005 * * Last modified: * $Date: 2011-11-29 17:20:37 +0100 (Tue, 29 Nov 2011) $ by $Author: schulte $ * $Revision: 12486 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include namespace Test { namespace Int { /// %Tests for relation constraints namespace Rel { /** * \defgroup TaskTestIntRel Relation constraints * \ingroup TaskTestInt */ //@{ /// %Test for simple relation involving integer variables class IntVarXY : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test IntVarXY(Gecode::IntRelType irt0, int n, Gecode::IntConLevel icl) : Test("Rel::Int::Var::XY::"+str(irt0)+"::"+str(icl)+"::"+str(n), n+1,-3,3,n==1,icl), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { if (x.size() == 2) { return cmp(x[0],irt,x[1]); } else { return cmp(x[0],irt,x[2]) && cmp(x[1],irt,x[2]); } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; if (x.size() == 2) { rel(home, x[0], irt, x[1], icl); } else { IntVarArgs y(2); y[0]=x[0]; y[1]=x[1]; rel(home, y, irt, x[2], icl); } } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { assert(x.size() == 2); Gecode::rel(home, x[0], irt, x[1], r, icl); } }; /// %Test for simple relation involving shared integer variables class IntVarXX : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test IntVarXX(Gecode::IntRelType irt0, Gecode::IntConLevel icl) : Test("Rel::Int::Var::XX::"+str(irt0)+"::"+str(icl), 1,-3,3,true,icl), irt(irt0) { contest = ((irt != Gecode::IRT_LE) && (irt != Gecode::IRT_GR) && (irt != Gecode::IRT_NQ)) ? CTL_DOMAIN : CTL_NONE; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return cmp(x[0],irt,x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::rel(home, x[0], irt, x[0], icl); } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { Gecode::rel(home, x[0], irt, x[0], r, icl); } }; /// %Test for simple relation involving Boolean variables class BoolVarXY : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test BoolVarXY(Gecode::IntRelType irt0, int n) : Test("Rel::Bool::Var::XY::"+str(irt0)+"::"+str(n),n+1,0,1, n==1), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { if (x.size() == 2) { return cmp(x[0],irt,x[1]); } else { return cmp(x[0],irt,x[2]) && cmp(x[1],irt,x[2]); } } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; if (x.size() == 2) { rel(home, channel(home,x[0]), irt, channel(home,x[1])); } else { BoolVarArgs y(2); y[0]=channel(home,x[0]); y[1]=channel(home,x[1]); rel(home, y, irt, channel(home,x[2])); } } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { assert(x.size() == 2); using namespace Gecode; rel(home, channel(home,x[0]), irt, channel(home,x[1]), r); } }; /// %Test for simple relation involving shared Boolean variables class BoolVarXX : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test BoolVarXX(Gecode::IntRelType irt0) : Test("Rel::Bool::Var::XX::"+str(irt0),1,0,1), irt(irt0) { contest = ((irt != Gecode::IRT_LE) && (irt != Gecode::IRT_GR) && (irt != Gecode::IRT_NQ)) ? CTL_DOMAIN : CTL_NONE; } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return cmp(x[0],irt,x[0]); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::BoolVar b = Gecode::channel(home,x[0]); Gecode::rel(home, b, irt, b); } }; /// %Test for simple relation involving integer variable and integer constant class IntInt : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; /// Integer constant int c; public: /// Create and register test IntInt(Gecode::IntRelType irt0, int n, int c0) : Test("Rel::Int::Int::"+str(irt0)+"::"+str(n)+"::"+str(c0), n,-3,3,n==1), irt(irt0), c(c0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { if (x.size() == 1) return cmp(x[0],irt,c); else return cmp(x[0],irt,c) && cmp(x[1],irt,c); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; if (x.size() == 1) rel(home, x[0], irt, c); else rel(home, x, irt, c); } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { assert(x.size() == 1); Gecode::rel(home, x[0], irt, c, r); } }; /// %Test for simple relation involving Boolean variable and integer constant class BoolInt : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; /// Integer constant int c; public: /// Create and register test BoolInt(Gecode::IntRelType irt0, int n, int c0) : Test("Rel::Bool::Int::"+str(irt0)+"::"+str(n)+"::"+str(c0),n,0,1, n==1), irt(irt0), c(c0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { if (x.size() == 1) return cmp(x[0],irt,c); else return cmp(x[0],irt,c) && cmp(x[1],irt,c); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; if (x.size() == 1) { rel(home, channel(home,x[0]), irt, c); } else { BoolVarArgs y(2); y[0]=channel(home,x[0]); y[1]=channel(home,x[1]); rel(home, y, irt, c); } } /// Post reified constraint on \a x for \a r virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { assert(x.size() == 1); using namespace Gecode; rel(home, channel(home,x[0]), irt, c, r); } }; /// %Test for sequence of relations between integer variables class IntSeq : public Test { protected: /// Integer relation type to propagate Gecode::IntRelType irt; public: /// Create and register test IntSeq(int n, Gecode::IntRelType irt0, Gecode::IntConLevel icl) : Test("Rel::Int::Seq::"+str(n)+"::"+str(irt0)+"::"+str(icl), n,-3,3,false,icl), irt(irt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { if (irt == Gecode::IRT_NQ) { if (x.size() < 2) return false; for (int i=0; i> 1; for (int i=0; i> 1; IntVarArgs y(n); IntVarArgs z(n); for (int i=0; i> 1; for (int i=0; i> 1; BoolVarArgs y(n); BoolVarArgs z(n); for (int i=0; i * * Contributing authors: * Christian Schulte * * Copyright: * David Rijsman, 2009 * Christian Schulte, 2009 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include #include namespace Test { namespace Int { /// %Tests for sequence constraints namespace Sequence { /** * \defgroup TaskTestIntSequence Sequence constraints * \ingroup TaskTestInt */ //@{ /// %Base test for sequence class SequenceTest : public Test { protected: Gecode::IntSet s; int q,l,u; public: /// Create and register test SequenceTest(const std::string& s, const Gecode::IntSet& s0, int q0, int l0, int u0, int size, int min, int max) : Test("Sequence::"+s,size,min,max), s(s0), q(q0), l(l0), u(u0) { } /// %Test whether \a x is solutionin virtual bool solution(const Assignment& x) const { for (int i=0; i< (x.size() - q + 1); i++ ) { int total = 0; for (int j=i; j < i + q; j++ ) { if (s.in(x[j])) total++; if (total > u) return false; } if ( total < l ) return false; } return true; } }; /// %Test for sequence with boolean variables class SequenceBoolTest : public SequenceTest { public: /// Create and register test SequenceBoolTest(const std::string& s, const Gecode::IntSet& s0, int q0, int l0, int u0, int size) : SequenceTest("Bool::"+s,s0,q0,l0,u0,size,0,1) { } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::BoolVarArgs c(x.size()); for (int i=0; i * * Contributing authors: * Christian Schulte * * Copyright: * Patrick Pekczynski, 2005 * Christian Schulte, 2007 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ by $Author: schulte $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" namespace Test { namespace Int { /// %Tests for sorted constraints namespace Sorted { /** * \defgroup TaskTestIntSorted Sorted constraints * \ingroup TaskTestInt */ //@{ /// Relation for sorting integers in increasing order class SortIntMin { public: /// %Test whether \a x is less than \a y bool operator()(const int x, const int y) { return xy[i+1]) return false; SortIntMin sim; Gecode::Support::quicksort(x,n,sim); for (int i=0; iy[i+1]) return false; // check whether permutation is in range for (int i=0; i= n)) return false; // check whether permutation info is correct for (int i=0; i(x,n,sim); for (int i=0; i * * Copyright: * Christian Schulte, 2009 * * Last modified: * $Date: 2011-05-25 16:56:41 +0200 (Wed, 25 May 2011) $ by $Author: schulte $ * $Revision: 12022 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include namespace Test { namespace Int { /// %Tests for unary scheduling constraints namespace Unary { /** * \defgroup TaskTestIntUnary Unary scheduling constraints * \ingroup TaskTestInt */ //@{ /// %Test for unary constraint class ManFixPUnary : public Test { protected: /// The processing times Gecode::IntArgs p; /// Get a reasonable maximal start time static int st(const Gecode::IntArgs& p) { int t = 0; for (int i=p.size(); i--; ) t += p[i]; return t; } public: /// Create and register test ManFixPUnary(const Gecode::IntArgs& p0, int o) : Test("Unary::Man::Fix::"+str(o)+"::"+str(p0), p0.size(),o,o+st(p0)), p(p0) { testsearch = false; contest = CTL_NONE; } /// Create and register initial assignment virtual Assignment* assignment(void) const { return new RandomAssignment(arity,dom,500); } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { for (int i=0; i x[j]) && (x[j]+p[j] > x[i])) return false; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::unary(home, x, p); } }; /// %Test for unary constraint with optional tasks class OptFixPUnary : public Test { protected: /// The processing times Gecode::IntArgs p; /// Thereshold for taking a task as optional int l; /// Get a reasonable maximal start time static int st(const Gecode::IntArgs& p) { int t = 0; for (int i=p.size(); i--; ) t += p[i]; return t; } public: /// Create and register test OptFixPUnary(const Gecode::IntArgs& p0, int o) : Test("Unary::Opt::Fix::"+str(o)+"::"+str(p0), 2*p0.size(),o,o+st(p0)), p(p0), l(o+st(p)/2) { testsearch = false; contest = CTL_NONE; } /// Create and register initial assignment virtual Assignment* assignment(void) const { return new RandomAssignment(arity,dom,500); } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int n = x.size() / 2; for (int i=0; i l) for (int j=i+1; j l) if ((x[i]+p[i] > x[j]) && (x[j]+p[j] > x[i])) return false; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { int n=x.size() / 2; Gecode::IntVarArgs s(n); Gecode::BoolVarArgs m(n); for (int i=0; i l)); } Gecode::unary(home, s, p, m); } }; /// %Test for unary constraint class ManFlexUnary : public Test { protected: /// Minimum processing time int _minP; /// Maximum processing time int _maxP; /// Offset for start times int off; public: /// Create and register test ManFlexUnary(int n, int minP, int maxP, int o) : Test("Unary::Man::Flex::"+str(o)+"::"+str(n)+"::" +str(minP)+"::"+str(maxP), 2*n,0,n*maxP), _minP(minP), _maxP(maxP), off(o) { testsearch = false; testfix = false; contest = CTL_NONE; } /// Create and register initial assignment virtual Assignment* assignment(void) const { return new RandomMixAssignment(arity/2,dom,arity/2, Gecode::IntSet(_minP,_maxP),500); } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int n = x.size()/2; for (int i=0; i x[j]) && (x[j]+x[n+j] > x[i])) return false; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { Gecode::IntVarArgs s(x.size()/2); Gecode::IntVarArgs px(x.slice(x.size()/2)); Gecode::IntVarArgs e(home,x.size()/2, Gecode::Int::Limits::min, Gecode::Int::Limits::max); for (int i=s.size(); i--;) { s[i] = expr(home, off+x[i]); rel(home, s[i]+px[i] == e[i]); rel(home, _minP <= px[i]); rel(home, _maxP >= px[i]); } Gecode::unary(home, s, px, e); } }; /// %Test for unary constraint with optional tasks class OptFlexUnary : public Test { protected: /// Minimum processing time int _minP; /// Maximum processing time int _maxP; /// Offset for start times int off; /// Thereshold for taking a task as optional int l; /// Get a reasonable maximal start time static int st(const Gecode::IntArgs& p) { int t = 0; for (int i=p.size(); i--; ) t += p[i]; return t; } public: /// Create and register test OptFlexUnary(int n, int minP, int maxP, int o) : Test("Unary::Opt::Flex::"+str(o)+"::"+str(n)+"::" +str(minP)+"::"+str(maxP), 3*n,0,n*maxP), _minP(minP), _maxP(maxP), off(o), l(n*maxP/2) { testsearch = false; testfix = false; contest = CTL_NONE; } /// Create and register initial assignment virtual Assignment* assignment(void) const { return new RandomMixAssignment(2*(arity/3),dom,arity/3, Gecode::IntSet(_minP,_maxP),500); } /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int n = x.size() / 3; for (int i=0; i l) for (int j=i+1; j l) if ((x[i]+x[2*n+i] > x[j]) && (x[j]+x[2*n+j] > x[i])) return false; return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { int n=x.size() / 3; Gecode::IntVarArgs s(n); Gecode::IntVarArgs px(n); Gecode::IntVarArgs e(home,n, Gecode::Int::Limits::min, Gecode::Int::Limits::max); for (int i=n; i--;) { s[i] = expr(home, off+x[i]); px[i] = x[2*n+i]; rel(home, s[i]+px[i] == e[i]); rel(home, _minP <= px[i]); rel(home, _maxP >= px[i]); } Gecode::BoolVarArgs m(n); for (int i=0; i l)); Gecode::unary(home, s, px, e, m); } }; Gecode::IntArgs p1(4, 2,2,2,2); ManFixPUnary mfu10(p1,0); ManFixPUnary mfu1i(p1,Gecode::Int::Limits::min); OptFixPUnary ofu10(p1,0); OptFixPUnary ofu1i(p1,Gecode::Int::Limits::min); ManFlexUnary mflu10(4,0,2,0); ManFlexUnary mflu1i(4,0,2,Gecode::Int::Limits::min); ManFlexUnary mflu101(4,1,3,0); ManFlexUnary mflu1i1(4,1,3,Gecode::Int::Limits::min); OptFlexUnary oflu10(4,0,2,0); OptFlexUnary oflu1i(4,0,2,Gecode::Int::Limits::min); Gecode::IntArgs p10(5, 2,2,0,2,2); ManFixPUnary mfu010(p10,0); ManFixPUnary mfu01i(p10,Gecode::Int::Limits::min); OptFixPUnary ofu010(p10,0); OptFixPUnary ofu01i(p10,Gecode::Int::Limits::min); ManFlexUnary mflu010(5,0,2,0); ManFlexUnary mflu01i(5,0,2,Gecode::Int::Limits::min); OptFlexUnary oflu010(5,0,2,0); OptFlexUnary oflu01i(5,0,2,Gecode::Int::Limits::min); Gecode::IntArgs p2(4, 4,3,3,5); ManFixPUnary mfu20(p2,0); ManFixPUnary mfu2i(p2,Gecode::Int::Limits::min); OptFixPUnary ofu20(p2,0); OptFixPUnary ofu2i(p2,Gecode::Int::Limits::min); ManFlexUnary mflu20(4,3,5,0); ManFlexUnary mflu2i(4,3,5,Gecode::Int::Limits::min); OptFlexUnary oflu20(4,3,5,0); OptFlexUnary oflu2i(4,3,5,Gecode::Int::Limits::min); Gecode::IntArgs p20(6, 4,0,3,3,0,5); ManFixPUnary mfu020(p20,0); ManFixPUnary mfu02i(p20,Gecode::Int::Limits::min); OptFixPUnary ofu020(p20,0); OptFixPUnary ofu02i(p20,Gecode::Int::Limits::min); ManFlexUnary mflu020(6,0,5,0); ManFlexUnary mflu02i(6,0,5,Gecode::Int::Limits::min); OptFlexUnary oflu020(6,0,5,0); OptFlexUnary oflu02i(6,0,5,Gecode::Int::Limits::min); Gecode::IntArgs p3(6, 4,2,9,3,7,5); ManFixPUnary mfu30(p3,0); ManFixPUnary mfu3i(p3,Gecode::Int::Limits::min); OptFixPUnary ofu30(p3,0); OptFixPUnary ofu3i(p3,Gecode::Int::Limits::min); ManFlexUnary mflu30(6,2,7,0); ManFlexUnary mflu3i(6,2,7,Gecode::Int::Limits::min); OptFlexUnary oflu30(6,2,7,0); OptFlexUnary oflu3i(6,2,7,Gecode::Int::Limits::min); Gecode::IntArgs p30(8, 4,0,2,9,3,7,5,0); ManFixPUnary mfu030(p30,0); ManFixPUnary mfu03i(p30,Gecode::Int::Limits::min); OptFixPUnary ofu030(p30,0); OptFixPUnary ofu03i(p30,Gecode::Int::Limits::min); ManFlexUnary mflu030(8,0,9,0); ManFlexUnary mflu03i(8,0,9,Gecode::Int::Limits::min); OptFlexUnary oflu030(8,0,9,0); OptFlexUnary oflu03i(8,0,9,Gecode::Int::Limits::min); //@} } }} // STATISTICS: test-int gecode-4.2.1/test/int/unshare.cpp0000755000175000010010000000713311357330563016020 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2008 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ by $Author: schulte $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include namespace Test { namespace Int { /// %Tests for unsharing variables in arrays namespace Unshare { /** * \defgroup TaskTestIntUnshare Unsharing variables in arrays * \ingroup TaskTestInt */ //@{ /// %Test for unsharing integer variables class Int : public Test { public: /// Create and register test Int(Gecode::IntConLevel icl) : Test("Unshare::Int::"+str(icl),9,-1,1,false,icl) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return ((x[0] == x[3]) && (x[1] == x[4]) && (x[1] == x[6]) && (x[2] == x[5]) && (x[2] == x[7]) && (x[2] == x[8])); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; IntVarArgs y(6); y[0]=x[0]; y[1]=y[3]=x[1]; y[2]=y[4]=y[5]=x[2]; unshare(home, y, icl); for (int i=0; i<6; i++) rel(home, y[i], IRT_EQ, x[3+i], ICL_DOM); } }; /// %Test for unsharing Boolean variables class Bool : public Test { public: /// Create and register test Bool(void) : Test("Unshare::Bool",9,0,1,false) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { return ((x[0] == x[3]) && (x[1] == x[4]) && (x[1] == x[6]) && (x[2] == x[5]) && (x[2] == x[7]) && (x[2] == x[8])); } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; BoolVarArgs y(6); y[0]=channel(home,x[0]); y[1]=y[3]=channel(home,x[1]); y[2]=y[4]=y[5]=channel(home,x[2]); unshare(home, y); for (int i=0; i<6; i++) rel(home, y[i], IRT_EQ, channel(home,x[3+i])); } }; Int i_bnd(Gecode::ICL_BND); Int i_dom(Gecode::ICL_DOM); Bool b; //@} } }} // STATISTICS: test-int gecode-4.2.1/test/int.cpp0000755000175000010010000006652212115372736014363 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Mikael Lagerkvist * * Copyright: * Christian Schulte, 2005 * Mikael Lagerkvist, 2005 * * Last modified: * $Date: 2013-03-05 14:40:46 +0100 (Tue, 05 Mar 2013) $ by $Author: schulte $ * $Revision: 13435 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include namespace Test { namespace Int { /* * Complete assignments * */ void CpltAssignment::operator++(void) { int i = n-1; while (true) { ++dsv[i]; if (dsv[i]() || (i == 0)) return; dsv[i--].init(d); } } /* * Random assignments * */ void RandomAssignment::operator++(void) { for (int i = n; i--; ) vals[i]=randval(); a--; } void RandomMixAssignment::operator++(void) { for (int i=n-_n1; i--; ) vals[i] = randval(d); for (int i=_n1; i--; ) vals[n-_n1+i] = randval(_d1); a--; } }} std::ostream& operator<<(std::ostream& os, const Test::Int::Assignment& a) { int n = a.size(); os << "{"; for (int i=0; ipost(*this,x); if (opt.log) olog << ind(3) << "Posting propagator" << std::endl; } } bool TestSpace::failed(void) { if (opt.log) { olog << ind(3) << "Fixpoint: " << x; bool f=(status() == Gecode::SS_FAILED); olog << std::endl << ind(3) << " --> " << x << std::endl; return f; } else { return status() == Gecode::SS_FAILED; } } void TestSpace::rel(int i, Gecode::IntRelType irt, int n) { if (opt.log) { olog << ind(4) << "x[" << i << "] "; switch (irt) { case Gecode::IRT_EQ: olog << "="; break; case Gecode::IRT_NQ: olog << "!="; break; case Gecode::IRT_LQ: olog << "<="; break; case Gecode::IRT_LE: olog << "<"; break; case Gecode::IRT_GQ: olog << ">="; break; case Gecode::IRT_GR: olog << ">"; break; } olog << " " << n << std::endl; } Gecode::rel(*this, x[i], irt, n); } void TestSpace::rel(bool sol) { int n = sol ? 1 : 0; assert(reified); if (opt.log) olog << ind(4) << "b = " << n << std::endl; Gecode::rel(*this, r.var(), Gecode::IRT_EQ, n); } void TestSpace::assign(const Assignment& a, bool skip) { using namespace Gecode; int i = skip ? static_cast(Base::rand(a.size())) : -1; for (int j=a.size(); j--; ) if (i != j) { rel(j, IRT_EQ, a[j]); if (Base::fixpoint() && failed()) return; } } void TestSpace::bound(void) { using namespace Gecode; // Select variable to be assigned int i = Base::rand(x.size()); while (x[i].assigned()) { i = (i+1) % x.size(); } bool min = Base::rand(2); rel(i, IRT_EQ, min ? x[i].min() : x[i].max()); } void TestSpace::prune(int i, bool bounds_only) { using namespace Gecode; // Prune values if (bounds_only) { if (Base::rand(2) && !x[i].assigned()) { int v=x[i].min()+1+Base::rand(static_cast (x[i].max()-x[i].min())); assert((v > x[i].min()) && (v <= x[i].max())); rel(i, Gecode::IRT_LE, v); } if (Base::rand(2) && !x[i].assigned()) { int v=x[i].min()+Base::rand(static_cast (x[i].max()-x[i].min())); assert((v < x[i].max()) && (v >= x[i].min())); rel(i, Gecode::IRT_GR, v); } } else { for (int vals = Base::rand(x[i].size()-1)+1; vals--; ) { int v; Gecode::Int::ViewRanges it(x[i]); unsigned int skip = Base::rand(x[i].size()-1); while (true) { if (it.width() > skip) { v = it.min() + skip; break; } skip -= it.width(); ++it; } rel(i, IRT_NQ, v); } } } void TestSpace::prune(void) { using namespace Gecode; // Select variable to be pruned int i = Base::rand(x.size()); while (x[i].assigned()) { i = (i+1) % x.size(); } prune(i, false); } bool TestSpace::prune(const Assignment& a, bool testfix) { // Select variable to be pruned int i = Base::rand(x.size()); while (x[i].assigned()) i = (i+1) % x.size(); // Select mode for pruning switch (Base::rand(3)) { case 0: if (a[i] < x[i].max()) { int v=a[i]+1+Base::rand(static_cast (x[i].max()-a[i])); assert((v > a[i]) && (v <= x[i].max())); rel(i, Gecode::IRT_LE, v); } break; case 1: if (a[i] > x[i].min()) { int v=x[i].min()+Base::rand(static_cast (a[i]-x[i].min())); assert((v < a[i]) && (v >= x[i].min())); rel(i, Gecode::IRT_GR, v); } break; default: { int v; Gecode::Int::ViewRanges it(x[i]); unsigned int skip = Base::rand(x[i].size()-1); while (true) { if (it.width() > skip) { v = it.min() + skip; if (v == a[i]) { if (it.width() == 1) { ++it; v = it.min(); } else if (v < it.max()) { ++v; } else { --v; } } break; } skip -= it.width(); ++it; } rel(i, Gecode::IRT_NQ, v); break; } } if (Base::fixpoint()) { if (failed() || !testfix) return true; TestSpace* c = static_cast(clone()); if (opt.log) olog << ind(3) << "Testing fixpoint on copy" << std::endl; c->post(); if (c->failed()) { if (opt.log) olog << ind(4) << "Copy failed after posting" << std::endl; delete c; return false; } for (int i=x.size(); i--; ) if (x[i].size() != c->x[i].size()) { if (opt.log) olog << ind(4) << "Different domain size" << std::endl; delete c; return false; } if (reified && (r.var().size() != c->r.var().size())) { if (opt.log) olog << ind(4) << "Different control variable" << std::endl; delete c; return false; } if (opt.log) olog << ind(3) << "Finished testing fixpoint on copy" << std::endl; delete c; } return true; } const Gecode::IntConLevel IntConLevels::icls[] = {Gecode::ICL_DOM,Gecode::ICL_BND,Gecode::ICL_VAL}; const Gecode::IntRelType IntRelTypes::irts[] = {Gecode::IRT_EQ,Gecode::IRT_NQ,Gecode::IRT_LQ, Gecode::IRT_LE,Gecode::IRT_GQ,Gecode::IRT_GR}; const Gecode::BoolOpType BoolOpTypes::bots[] = {Gecode::BOT_AND,Gecode::BOT_OR,Gecode::BOT_IMP, Gecode::BOT_EQV,Gecode::BOT_XOR}; Assignment* Test::assignment(void) const { return new CpltAssignment(arity,dom); } /// Check the test result and handle failed test #define CHECK_TEST(T,M) \ if (opt.log) \ olog << ind(3) << "Check: " << (M) << std::endl; \ if (!(T)) { \ problem = (M); delete s; goto failed; \ } /// Start new test #define START_TEST(T) \ if (opt.log) { \ olog.str(""); \ olog << ind(2) << "Testing: " << (T) << std::endl; \ } \ test = (T); bool Test::ignore(const Assignment&) const { return false; } void Test::post(Gecode::Space&, Gecode::IntVarArray&, Gecode::Reify) {} bool Test::run(void) { using namespace Gecode; const char* test = "NONE"; const char* problem = "NONE"; // Set up assignments Assignment* ap = assignment(); Assignment& a = *ap; // Set up space for all solution search TestSpace* search_s = new TestSpace(arity,dom,this); post(*search_s,search_s->x); branch(*search_s,search_s->x,INT_VAR_NONE(),INT_VAL_MIN()); Search::Options search_o; search_o.threads = 1; DFS e_s(search_s,search_o); delete search_s; while (a()) { bool sol = solution(a); if (opt.log) { olog << ind(1) << "Assignment: " << a << (sol ? " (solution)" : " (no solution)") << std::endl; } START_TEST("Assignment (after posting)"); { TestSpace* s = new TestSpace(arity,dom,this); TestSpace* sc = NULL; s->post(); switch (Base::rand(3)) { case 0: if (opt.log) olog << ind(3) << "No copy" << std::endl; sc = s; s = NULL; break; case 1: if (opt.log) olog << ind(3) << "Unshared copy" << std::endl; if (s->status() != SS_FAILED) { sc = static_cast(s->clone(false)); } else { sc = s; s = NULL; } break; case 2: if (opt.log) olog << ind(3) << "Shared copy" << std::endl; if (s->status() != SS_FAILED) { sc = static_cast(s->clone(true)); } else { sc = s; s = NULL; } break; default: assert(false); } sc->assign(a); if (sol) { CHECK_TEST(!sc->failed(), "Failed on solution"); CHECK_TEST(sc->propagators()==0, "No subsumption"); } else { CHECK_TEST(sc->failed(), "Solved on non-solution"); } delete s; delete sc; } START_TEST("Partial assignment (after posting)"); { TestSpace* s = new TestSpace(arity,dom,this); s->post(); s->assign(a,true); (void) s->failed(); s->assign(a); if (sol) { CHECK_TEST(!s->failed(), "Failed on solution"); CHECK_TEST(s->propagators()==0, "No subsumption"); } else { CHECK_TEST(s->failed(), "Solved on non-solution"); } delete s; } START_TEST("Assignment (before posting)"); { TestSpace* s = new TestSpace(arity,dom,this); s->assign(a); s->post(); if (sol) { CHECK_TEST(!s->failed(), "Failed on solution"); CHECK_TEST(s->propagators()==0, "No subsumption"); } else { CHECK_TEST(s->failed(), "Solved on non-solution"); } delete s; } START_TEST("Partial assignment (before posting)"); { TestSpace* s = new TestSpace(arity,dom,this); s->assign(a,true); s->post(); (void) s->failed(); s->assign(a); if (sol) { CHECK_TEST(!s->failed(), "Failed on solution"); CHECK_TEST(s->propagators()==0, "No subsumption"); } else { CHECK_TEST(s->failed(), "Solved on non-solution"); } delete s; } START_TEST("Prune"); { TestSpace* s = new TestSpace(arity,dom,this); s->post(); while (!s->failed() && !s->assigned()) if (!s->prune(a,testfix)) { problem = "No fixpoint"; delete s; goto failed; } s->assign(a); if (sol) { CHECK_TEST(!s->failed(), "Failed on solution"); CHECK_TEST(s->propagators()==0, "No subsumption"); } else { CHECK_TEST(s->failed(), "Solved on non-solution"); } delete s; } if (!ignore(a)) { if (eqv()) { START_TEST("Assignment reified (rewrite after post, <=>)"); TestSpace* s = new TestSpace(arity,dom,this,RM_EQV); s->post(); s->rel(sol); s->assign(a); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); delete s; } if (imp()) { START_TEST("Assignment reified (rewrite after post, =>)"); TestSpace* s = new TestSpace(arity,dom,this,RM_IMP); s->post(); s->rel(sol); s->assign(a); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); delete s; } if (pmi()) { START_TEST("Assignment reified (rewrite after post, <=)"); TestSpace* s = new TestSpace(arity,dom,this,RM_PMI); s->post(); s->rel(sol); s->assign(a); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); delete s; } if (eqv()) { START_TEST("Assignment reified (rewrite failure, <=>)"); TestSpace* s = new TestSpace(arity,dom,this,RM_EQV); s->post(); s->rel(!sol); s->assign(a); CHECK_TEST(s->failed(), "Not failed"); delete s; } if (imp()) { START_TEST("Assignment reified (rewrite failure, =>)"); TestSpace* s = new TestSpace(arity,dom,this,RM_IMP); s->post(); s->rel(!sol); s->assign(a); if (sol) { CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); } else { CHECK_TEST(s->failed(), "Not failed"); } delete s; } if (pmi()) { START_TEST("Assignment reified (rewrite failure, <=)"); TestSpace* s = new TestSpace(arity,dom,this,RM_PMI); s->post(); s->rel(!sol); s->assign(a); if (sol) { CHECK_TEST(s->failed(), "Not failed"); } else { CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); } delete s; } if (eqv()) { START_TEST("Assignment reified (immediate rewrite, <=>)"); TestSpace* s = new TestSpace(arity,dom,this,RM_EQV); s->rel(sol); s->post(); s->assign(a); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); delete s; } if (imp()) { START_TEST("Assignment reified (immediate rewrite, =>)"); TestSpace* s = new TestSpace(arity,dom,this,RM_IMP); s->rel(sol); s->post(); s->assign(a); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); delete s; } if (pmi()) { START_TEST("Assignment reified (immediate rewrite, <=)"); TestSpace* s = new TestSpace(arity,dom,this,RM_PMI); s->rel(sol); s->post(); s->assign(a); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); delete s; } if (eqv()) { START_TEST("Assignment reified (immediate failure, <=>)"); TestSpace* s = new TestSpace(arity,dom,this,RM_EQV); s->rel(!sol); s->post(); s->assign(a); CHECK_TEST(s->failed(), "Not failed"); delete s; } if (imp()) { START_TEST("Assignment reified (immediate failure, =>)"); TestSpace* s = new TestSpace(arity,dom,this,RM_IMP); s->rel(!sol); s->post(); s->assign(a); if (sol) { CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); } else { CHECK_TEST(s->failed(), "Not failed"); } delete s; } if (pmi()) { START_TEST("Assignment reified (immediate failure, <=)"); TestSpace* s = new TestSpace(arity,dom,this,RM_PMI); s->rel(!sol); s->post(); s->assign(a); if (sol) { CHECK_TEST(s->failed(), "Not failed"); } else { CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); } delete s; } if (eqv()) { START_TEST("Assignment reified (before posting, <=>)"); TestSpace* s = new TestSpace(arity,dom,this,RM_EQV); s->assign(a); s->post(); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); CHECK_TEST(s->r.var().assigned(), "Control variable unassigned"); if (sol) { CHECK_TEST(s->r.var().val()==1, "Zero on solution"); } else { CHECK_TEST(s->r.var().val()==0, "One on non-solution"); } delete s; } if (imp()) { START_TEST("Assignment reified (before posting, =>)"); TestSpace* s = new TestSpace(arity,dom,this,RM_IMP); s->assign(a); s->post(); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); if (sol) { CHECK_TEST(!s->r.var().assigned(), "Control variable assigned"); } else { CHECK_TEST(s->r.var().assigned(), "Control variable unassigned"); CHECK_TEST(s->r.var().val()==0, "One on non-solution"); } delete s; } if (pmi()) { START_TEST("Assignment reified (before posting, <=)"); TestSpace* s = new TestSpace(arity,dom,this,RM_PMI); s->assign(a); s->post(); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); if (sol) { CHECK_TEST(s->r.var().assigned(), "Control variable unassigned"); CHECK_TEST(s->r.var().val()==1, "Zero on solution"); } else { CHECK_TEST(!s->r.var().assigned(), "Control variable assigned"); } delete s; } if (eqv()) { START_TEST("Assignment reified (after posting, <=>)"); TestSpace* s = new TestSpace(arity,dom,this,RM_EQV); s->post(); s->assign(a); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); CHECK_TEST(s->r.var().assigned(), "Control variable unassigned"); if (sol) { CHECK_TEST(s->r.var().val()==1, "Zero on solution"); } else { CHECK_TEST(s->r.var().val()==0, "One on non-solution"); } delete s; } if (imp()) { START_TEST("Assignment reified (after posting, =>)"); TestSpace* s = new TestSpace(arity,dom,this,RM_IMP); s->post(); s->assign(a); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); if (sol) { CHECK_TEST(!s->r.var().assigned(), "Control variable assigned"); } else { CHECK_TEST(s->r.var().assigned(), "Control variable unassigned"); CHECK_TEST(s->r.var().val()==0, "One on non-solution"); } delete s; } if (pmi()) { START_TEST("Assignment reified (after posting, <=)"); TestSpace* s = new TestSpace(arity,dom,this,RM_PMI); s->post(); s->assign(a); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); if (sol) { CHECK_TEST(s->r.var().assigned(), "Control variable unassigned"); CHECK_TEST(s->r.var().val()==1, "Zero on solution"); } else { CHECK_TEST(!s->r.var().assigned(), "Control variable assigned"); } delete s; } if (eqv()) { START_TEST("Prune reified, <=>"); TestSpace* s = new TestSpace(arity,dom,this,RM_EQV); s->post(); while (!s->failed() && (!s->assigned() || !s->r.var().assigned())) if (!s->prune(a,testfix)) { problem = "No fixpoint"; delete s; goto failed; } CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); CHECK_TEST(s->r.var().assigned(), "Control variable unassigned"); if (sol) { CHECK_TEST(s->r.var().val()==1, "Zero on solution"); } else { CHECK_TEST(s->r.var().val()==0, "One on non-solution"); } delete s; } if (imp()) { START_TEST("Prune reified, =>"); TestSpace* s = new TestSpace(arity,dom,this,RM_IMP); s->post(); while (!s->failed() && (!s->assigned() || (!sol && !s->r.var().assigned()))) if (!s->prune(a,testfix)) { problem = "No fixpoint"; delete s; goto failed; } CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); if (sol) { CHECK_TEST(!s->r.var().assigned(), "Control variable assigned"); } else { CHECK_TEST(s->r.var().assigned(), "Control variable unassigned"); CHECK_TEST(s->r.var().val()==0, "One on non-solution"); } delete s; } if (pmi()) { START_TEST("Prune reified, <="); TestSpace* s = new TestSpace(arity,dom,this,RM_PMI); s->post(); while (!s->failed() && (!s->assigned() || (sol && !s->r.var().assigned()))) if (!s->prune(a,testfix)) { problem = "No fixpoint"; delete s; goto failed; } CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); if (sol) { CHECK_TEST(s->r.var().assigned(), "Control variable unassigned"); CHECK_TEST(s->r.var().val()==1, "Zero on solution"); } else { CHECK_TEST(!s->r.var().assigned(), "Control variable assigned"); } delete s; } } if (testsearch) { if (sol) { START_TEST("Search"); TestSpace* s = e_s.next(); CHECK_TEST(s != NULL, "Solutions exhausted"); CHECK_TEST(s->propagators()==0, "No subsumption"); for (int i=a.size(); i--; ) { CHECK_TEST(s->x[i].assigned(), "Unassigned variable"); CHECK_TEST(a[i] == s->x[i].val(), "Wrong value in solution"); } delete s; } } ++a; } if (testsearch) { test = "Search"; if (e_s.next() != NULL) { problem = "Excess solutions"; goto failed; } } switch (contest) { case CTL_NONE: break; case CTL_DOMAIN: { START_TEST("Full domain consistency"); TestSpace* s = new TestSpace(arity,dom,this); s->post(); if (!s->failed()) { while (!s->failed() && !s->assigned()) s->prune(); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); } delete s; // Fall-through -- domain implies bounds(d) and bounds(z) } case CTL_BOUNDS_D: { START_TEST("Bounds(D)-consistency"); TestSpace* s = new TestSpace(arity,dom,this); s->post(); for (int i = s->x.size(); i--; ) s->prune(i, false); if (!s->failed()) { while (!s->failed() && !s->assigned()) s->bound(); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); } delete s; // Fall-through -- bounds(d) implies bounds(z) } case CTL_BOUNDS_Z: { START_TEST("Bounds(Z)-consistency"); TestSpace* s = new TestSpace(arity,dom,this); s->post(); for (int i = s->x.size(); i--; ) s->prune(i, true); if (!s->failed()) { while (!s->failed() && !s->assigned()) s->bound(); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); } delete s; break; } } delete ap; return true; failed: if (opt.log) olog << "FAILURE" << std::endl << ind(1) << "Test: " << test << std::endl << ind(1) << "Problem: " << problem << std::endl; if (a() && opt.log) olog << ind(1) << "Assignment: " << a << std::endl; delete ap; return false; } }} #undef START_TEST #undef CHECK_TEST // STATISTICS: test-int gecode-4.2.1/test/int.hh0000755000175000010010000003224712104462072014164 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Mikael Lagerkvist * * Copyright: * Christian Schulte, 2005 * Mikael Lagerkvist, 2006 * * Last modified: * $Date: 2013-02-06 15:10:02 +0100 (Wed, 06 Feb 2013) $ by $Author: schulte $ * $Revision: 13270 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef __GECODE_TEST_INT_HH__ #define __GECODE_TEST_INT_HH__ #include "test/test.hh" #include namespace Test { /// Testing finite domain integers namespace Int { /** * \defgroup TaskTestInt Testing finite domain integers * \ingroup TaskTest */ /** * \defgroup TaskTestIntInt General test support * \ingroup TaskTestInt */ //@{ /// %Base class for assignments class Assignment { protected: int n; ///< Number of variables Gecode::IntSet d; ///< Domain for each variable public: /// Initialize assignments for \a n0 variables and values \a d0 Assignment(int n0, const Gecode::IntSet& d0); /// Test whether all assignments have been iterated virtual bool operator()(void) const = 0; /// Move to next assignment virtual void operator++(void) = 0; /// Return value for variable \a i virtual int operator[](int i) const = 0; /// Return number of variables int size(void) const; /// Destructor virtual ~Assignment(void); }; /// Generate all assignments class CpltAssignment : public Assignment { protected: Gecode::IntSetValues* dsv; ///< Iterator for each variable public: /// Initialize assignments for \a n0 variables and values \a d0 CpltAssignment(int n, const Gecode::IntSet& d); /// Test whether all assignments have been iterated virtual bool operator()(void) const; /// Move to next assignment virtual void operator++(void); /// Return value for variable \a i virtual int operator[](int i) const; /// Destructor virtual ~CpltAssignment(void); }; /// Generate random selection of assignments class RandomAssignment : public Assignment { protected: int* vals; ///< The current values for the variables int a; ///< How many assigments still to be generated /// Generate new value according to domain int randval(void); public: /// Initialize for \a a assignments for \a n0 variables and values \a d0 RandomAssignment(int n, const Gecode::IntSet& d, int a); /// Test whether all assignments have been iterated virtual bool operator()(void) const; /// Move to next assignment virtual void operator++(void); /// Return value for variable \a i virtual int operator[](int i) const; /// Destructor virtual ~RandomAssignment(void); }; /// Generate random selection of assignments class RandomMixAssignment : public Assignment { protected: int* vals; ///< The current values for the variables int a; ///< How many assigments still to be generated int _n1; ///< How many variables in the second set Gecode::IntSet _d1; ///< Domain for second set of variables /// Generate new value according to domain \a d int randval(const Gecode::IntSet& d); public: /// Initialize for \a a assignments for \a n0 variables and values \a d0 RandomMixAssignment(int n0, const Gecode::IntSet& d0, int n1, const Gecode::IntSet& d1, int a0); /// Test whether all assignments have been iterated virtual bool operator()(void) const; /// Move to next assignment virtual void operator++(void); /// Return value for variable \a i virtual int operator[](int i) const; /// Destructor virtual ~RandomMixAssignment(void); }; /// Level of consistency to test for enum ConTestLevel { CTL_NONE, ///< No consistency-test CTL_DOMAIN, ///< Test for domain-consistency CTL_BOUNDS_D, ///< Test for bounds(d)-consistency CTL_BOUNDS_Z, ///< Test for bounds(z)-consistency }; class Test; /// Space for executing tests class TestSpace : public Gecode::Space { public: /// Initial domain Gecode::IntSet d; /// Variables to be tested Gecode::IntVarArray x; /// Reification information Gecode::Reify r; /// The test currently run Test* test; /// Whether the test is for a reified propagator bool reified; /** * \brief Create test space without reification * * Creates \a n variables with domain \a d for test \a t. * */ TestSpace(int n, Gecode::IntSet& d, Test* t); /** * \brief Create test space with reification * * Creates \a n variables with domain \a d for test \a t and stores * the reification mode \a rm. * */ TestSpace(int n, Gecode::IntSet& d, Test* t, Gecode::ReifyMode rm); /// Constructor for cloning \a s TestSpace(bool share, TestSpace& s); /// Copy space during cloning virtual Gecode::Space* copy(bool share); /// Test whether all variables are assigned bool assigned(void) const; /// Post propagator void post(void); /// Compute a fixpoint and check for failure bool failed(void); /// Perform integer tell operation on \a x[i] void rel(int i, Gecode::IntRelType irt, int n); /// Perform Boolean tell on \a b void rel(bool sol); /// Assign all (or all but one, if \a skip is true) variables to values in \a a void assign(const Assignment& a, bool skip=false); /// Assing a random variable to a random bound void bound(void); /** \brief Prune some random values from variable \a i * * If \a bounds_only is true, then the pruning is only done on the * bounds of the variable. */ void prune(int i, bool bounds_only); /// Prune some random values for some random variable void prune(void); /// Prune values but not those in assignment \a a bool prune(const Assignment& a, bool testfix); }; /** * \brief %Base class for tests with integer constraints * */ class Test : public Base { protected: /// Number of variables int arity; /// Domain of variables Gecode::IntSet dom; /// Does the constraint also exist as reified constraint bool reified; /// Which reification modes are supported int rms; /// Consistency level Gecode::IntConLevel icl; /// Whether to test for certain consistency ConTestLevel contest; /// Whether to perform search test bool testsearch; /// Whether to perform fixpoint test bool testfix; /// \name Test for reification modes //@{ /// Test whether equivalence as reification mode is supported bool eqv(void) const; /// Test whether implication as reification mode is supported bool imp(void) const; /// Test whether reverse implication as reification mode is supported bool pmi(void) const; //@} public: /** * \brief Constructor * * Constructs a test with prefix \a p, name \a s, arity \a a, * and variable domain \a d. Also tests for a reified * constraint, if \a r is true. The consistency level is * maintained for convenience. */ Test(const std::string& p, const std::string& s, int a, const Gecode::IntSet& d, bool r=false, Gecode::IntConLevel i=Gecode::ICL_DEF); /** * \brief Constructor * * Constructs a test with name \a s, arity \a a, and variable * domain \a d. Also tests for a reified constraint, * if \a r is true. The consistency level is * maintained for convenience. */ Test(const std::string& s, int a, const Gecode::IntSet& d, bool r=false, Gecode::IntConLevel i=Gecode::ICL_DEF); /** * \brief Constructor * * Constructs a test with prefix \a p, name \a s, arity \a a, * and variable domain \a min ... \a max. Also tests for * a reified constraint, if \a r is true. The consistency * level is maintained for convenience. */ Test(const std::string& p, const std::string& s, int a, int min, int max, bool r=false, Gecode::IntConLevel i=Gecode::ICL_DEF); /** * \brief Constructor * * Constructs a test with name \a s, arity \a a, variable * domain \a min ... \a max. Also tests for a reified constraint, * if \a r is true. The consistency level is * maintained for convenience. */ Test(const std::string& s, int a, int min, int max, bool r=false, Gecode::IntConLevel i=Gecode::ICL_DEF); /// Create assignment virtual Assignment* assignment(void) const; /// Check for solution virtual bool solution(const Assignment&) const = 0; /// Whether to ignore assignment for reification virtual bool ignore(const Assignment&) const; /// Post constraint virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) = 0; /// Post reified constraint virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r); /// Perform test virtual bool run(void); /// \name Mapping scalar values to strings //@{ /// Map extensional propagation kind to string static std::string str(Gecode::ExtensionalPropKind epk); /// Map integer consistency level to string static std::string str(Gecode::IntConLevel icl); /// Map integer relation to string static std::string str(Gecode::IntRelType irl); /// Map Boolean operation to string static std::string str(Gecode::BoolOpType bot); /// Map integer to string static std::string str(int i); /// Map integer array to string static std::string str(const Gecode::IntArgs& i); //@} /// \name General support //@{ /// Compare \a x and \a y with respect to \a r template static bool cmp(T x, Gecode::IntRelType r, T y); //@} }; //@} /// Iterator for integer consistency levels class IntConLevels { private: /// Array of consistency levels static const Gecode::IntConLevel icls[3]; /// Current position in level array int i; public: /// Initialize iterator IntConLevels(void); /// Test whether iterator is done bool operator()(void) const; /// Increment to next level void operator++(void); /// Return current level Gecode::IntConLevel icl(void) const; }; /// Iterator for integer relation types class IntRelTypes { private: /// Array of relation types static const Gecode::IntRelType irts[6]; /// Current position in relation type array int i; public: /// Initialize iterator IntRelTypes(void); /// Reset iterator void reset(void); /// Test whether iterator is done bool operator()(void) const; /// Increment to next relation type void operator++(void); /// Return current relation type Gecode::IntRelType irt(void) const; }; /// Iterator for Boolean operation types class BoolOpTypes { private: /// Array of operation types static const Gecode::BoolOpType bots[5]; /// Current position in operation type array int i; public: /// Initialize iterator BoolOpTypes(void); /// Test whether iterator is done bool operator()(void) const; /// Increment to next operation type void operator++(void); /// Return current operation type Gecode::BoolOpType bot(void) const; }; } } /** * \brief Print assignment \a * \relates Assignment */ std::ostream& operator<<(std::ostream& os, const Test::Int::Assignment& a); #include "test/int.hpp" #endif // STATISTICS: test-int gecode-4.2.1/test/int.hpp0000755000175000010010000002174112117675460014364 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Mikael Lagerkvist * * Copyright: * Christian Schulte, 2005 * Mikael Lagerkvist, 2006 * * Last modified: * $Date: 2013-03-12 20:00:00 +0100 (Tue, 12 Mar 2013) $ by $Author: schulte $ * $Revision: 13507 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ namespace Test { namespace Int { /* * Assignments * */ inline Assignment::Assignment(int n0, const Gecode::IntSet& d0) : n(n0), d(d0) {} inline int Assignment::size(void) const { return n; } inline Assignment::~Assignment(void) {} inline CpltAssignment::CpltAssignment(int n, const Gecode::IntSet& d) : Assignment(n,d), dsv(new Gecode::IntSetValues[static_cast(n)]) { for (int i=n; i--; ) dsv[i].init(d); } inline bool CpltAssignment::operator()(void) const { return dsv[0](); } inline int CpltAssignment::operator[](int i) const { assert((i>=0) && (i skip) return it.min() + static_cast(skip); skip -= it.width(); } GECODE_NEVER; return 0; } inline RandomAssignment::RandomAssignment(int n, const Gecode::IntSet& d, int a0) : Assignment(n,d), vals(new int[n]), a(a0) { for (int i=n; i--; ) vals[i] = randval(); } inline bool RandomAssignment::operator()(void) const { return a>0; } inline int RandomAssignment::operator[](int i) const { assert((i>=0) && (i skip) return it.min() + static_cast(skip); skip -= it.width(); } GECODE_NEVER; return 0; } inline RandomMixAssignment::RandomMixAssignment(int n0, const Gecode::IntSet& d0, int n1, const Gecode::IntSet& d1, int a0) : Assignment(n0+n1,d0),vals(new int[n0+n1]),a(a0),_n1(n1),_d1(d1) { for (int i=n0; i--; ) vals[i] = randval(d); for (int i=n1; i--; ) vals[n0+i] = randval(_d1); } inline bool RandomMixAssignment::operator()(void) const { return a>0; } inline int RandomMixAssignment::operator[](int i) const { assert((i>=0) && (i inline bool Test::cmp(T x, Gecode::IntRelType r, T y) { using namespace Gecode; switch (r) { case IRT_EQ: return x == y; case IRT_NQ: return x != y; case IRT_LQ: return x <= y; case IRT_LE: return x < y; case IRT_GR: return x > y; case IRT_GQ: return x >= y; default: ; } return false; } inline IntConLevels::IntConLevels(void) : i(sizeof(icls)/sizeof(Gecode::IntConLevel)-1) {} inline bool IntConLevels::operator()(void) const { return i>=0; } inline void IntConLevels::operator++(void) { i--; } inline Gecode::IntConLevel IntConLevels::icl(void) const { return icls[i]; } inline IntRelTypes::IntRelTypes(void) : i(sizeof(irts)/sizeof(Gecode::IntRelType)-1) {} inline void IntRelTypes::reset(void) { i = sizeof(irts)/sizeof(Gecode::IntRelType)-1; } inline bool IntRelTypes::operator()(void) const { return i>=0; } inline void IntRelTypes::operator++(void) { i--; } inline Gecode::IntRelType IntRelTypes::irt(void) const { return irts[i]; } inline BoolOpTypes::BoolOpTypes(void) : i(sizeof(bots)/sizeof(Gecode::BoolOpType)-1) {} inline bool BoolOpTypes::operator()(void) const { return i>=0; } inline void BoolOpTypes::operator++(void) { i--; } inline Gecode::BoolOpType BoolOpTypes::bot(void) const { return bots[i]; } }} // STATISTICS: test-int gecode-4.2.1/test/ldsb.cpp0000644000175000010010000016031312165546672014512 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christopher Mears * * Copyright: * Christopher Mears, 2012 * * Last modified: * $Date: 2013-07-05 15:44:26 +0200 (Fri, 05 Jul 2013) $ by $Author: schulte $ * $Revision: 13814 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #ifdef GECODE_HAS_SET_VARS #include #include #endif #include #include "test/test.hh" #include /** * \namespace Test::LDSB * \brief Testing for LDSB */ namespace Test { namespace LDSB { using namespace Gecode; /// Returns true iff a and b are equal (they have the same size and /// the same elements in the same positions). bool equal(const IntArgs& a, const IntArgs& b) { if (a.size() != b.size()) return false; for (int i = 0 ; i < a.size() ; ++i) if (a[i] != b[i]) return false; return true; } #ifdef GECODE_HAS_SET_VARS /// Returns true iff a and b are equal (they have the same size and /// the same elements in the same positions). bool equal(const IntSetArgs& a, const IntSetArgs& b) { if (a.size() != b.size()) return false; for (int i = 0 ; i < a.size() ; ++i) { // Compare the two sets a[i] and b[i]. // Perhaps TODO: use Iter::Ranges::equal instead. if (a[i].size() != b[i].size()) return false; IntSetValues x(a[i]); IntSetValues y(b[i]); while (x() && y()) { if (x.val() != y.val()) return false; ++x; ++y; } } return true; } #endif /** * \brief Checks found solutions against expected solutions * * Iterates through the solutions returned by the search engine and * checks each one against the array of expected solutions. The * order of solutions must be the same. Returns true if the * expected solutions match the found solutions exactly, otherwise * prints an explanation to standard error and returns false. */ template bool check(DFS& e, std::vector expected) { int nexpected = expected.size(); for (int i = 0 ; i < nexpected ; ++i) { T* s = e.next(); if (s == NULL) { if (opt.log) { olog << "Expected a solution but there are no more solutions." << std::endl; olog << "(Expected " << nexpected << " but only found " << i << ")" << std::endl; olog << "Expected: " << expected[i] << std::endl; } return false; } if (!equal(s->solution(), expected[i])) { if (opt.log) { olog << "Solution does not match expected." << std::endl; olog << "Solution: " << s->solution() << std::endl; olog << "Expected: " << expected[i] << std::endl; } return false; } delete s; } T* s = e.next(); if (s != NULL) { if (opt.log) { olog << "More solutions than expected:" << std::endl; olog << "(Expected only " << nexpected << ")" << std::endl; olog << s->solution() << std::endl; } return false; } // Nothing went wrong. return true; } /// %Test space class OneArray : public Space { public: /// Variables IntVarArray xs; /// Constructor for creation OneArray(int n, int l, int u) : xs(*this,n,l,u) { } /// Constructor for cloning \a s OneArray(bool share, OneArray& s) : Space(share,s) { xs.update(*this,share,s.xs); } /// Copy during cloning virtual Space* copy(bool share) { return new OneArray(share,*this); } /// Return the solution as IntArgs IntArgs solution(void) { IntArgs a(xs.size()); for (int i = 0 ; i < a.size() ; ++i) a[i] = xs[i].val(); return a; } /// Expected solutions virtual IntArgs* expectedSolutions(void) { return NULL; } }; #ifdef GECODE_HAS_SET_VARS /// %Test space (set version) class OneArraySet : public Space { public: /// Variables SetVarArray xs; /// Constructor for creation OneArraySet(int n, int l, int u) : xs(*this,n, IntSet::empty, l,u) { } /// Constructor for cloning \a s OneArraySet(bool share, OneArraySet& s) : Space(share,s) { xs.update(*this,share,s.xs); } /// Copy during cloning virtual Space* copy(bool share) { return new OneArraySet(share,*this); } /// Return the solution as IntSetArgs IntSetArgs solution(void) { IntSetArgs a(xs.size()); for (int i = 0 ; i < a.size() ; ++i) { SetVarGlbRanges glbranges(xs[i]); a[i] = IntSet(glbranges); } return a; } /// Expected solutions virtual IntSetArgs* expectedSolutions(void) { return NULL; } }; #endif /// %Test for %LDSB infrastructure template class LDSB : public Base { public: /// Recomputation distance unsigned int c_d; /// Adaptation distance unsigned int a_d; /// Initialize test LDSB(std::string label, unsigned int c=0, unsigned int a=0) : Test::Base("LDSB::" + label), c_d(c), a_d(a) {} /// Perform actual tests bool run(void) { OneArray *s = new OneArray(T::n, T::l, T::u); T::setup(*s, s->xs); Search::Options o = Search::Options::def; if (c_d != 0) o.c_d = c_d; if (a_d != 0) o.a_d = a_d; DFS e(s,o); bool r = check(e, T::expectedSolutions()); delete s; return r; } }; #ifdef GECODE_HAS_SET_VARS /// %Test for %LDSB infrastructure template class LDSBSet : public Base { public: /// Recomputation distance unsigned int c_d; /// Adaptation distance unsigned int a_d; /// Initialize test LDSBSet(std::string label, unsigned int c=0, unsigned int a=0) : Test::Base("LDSB::" + label), c_d(c), a_d(a) {} /// Perform actual tests bool run(void) { OneArraySet *s = new OneArraySet(T::n, T::l, T::u); T::setup(*s, s->xs); Search::Options o = Search::Options::def; if (c_d != 0) o.c_d = c_d; if (a_d != 0) o.a_d = a_d; DFS e(s,o); bool r = check(e, T::expectedSolutions()); delete s; return r; } }; #endif // Test cases /// %Test for variable symmetry class VarSym1 { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 3; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { Symmetries syms; IntArgs indices(4, 0,1,2,3); syms << VariableSymmetry(xs, indices); distinct(h, xs); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), syms); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(4, 0,1,2,3)); return expected; } }; /// %Test for variable symmetry class VarSym1b { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 3; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { distinct(h, xs); Symmetries syms; syms << VariableSymmetry(xs); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), syms); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(4, 0,1,2,3)); return expected; } }; /// %Test for variable symmetry class VarSym2 { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 3; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { Symmetries syms; IntArgs indices(4, 0,1,2,3); syms << VariableSymmetry(xs); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), syms); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(4, 0,0,0,0)); expected.push_back(IntArgs(4, 0,0,0,1)); expected.push_back(IntArgs(4, 0,0,0,2)); expected.push_back(IntArgs(4, 0,0,0,3)); expected.push_back(IntArgs(4, 0,0,1,1)); expected.push_back(IntArgs(4, 0,0,1,2)); expected.push_back(IntArgs(4, 0,0,1,3)); expected.push_back(IntArgs(4, 0,0,2,2)); expected.push_back(IntArgs(4, 0,0,2,3)); expected.push_back(IntArgs(4, 0,0,3,3)); expected.push_back(IntArgs(4, 0,1,1,1)); expected.push_back(IntArgs(4, 0,1,1,2)); expected.push_back(IntArgs(4, 0,1,1,3)); expected.push_back(IntArgs(4, 0,1,2,2)); expected.push_back(IntArgs(4, 0,1,2,3)); expected.push_back(IntArgs(4, 0,1,3,3)); expected.push_back(IntArgs(4, 0,2,2,2)); expected.push_back(IntArgs(4, 0,2,2,3)); expected.push_back(IntArgs(4, 0,2,3,3)); expected.push_back(IntArgs(4, 0,3,3,3)); expected.push_back(IntArgs(4, 1,1,1,1)); expected.push_back(IntArgs(4, 1,1,1,2)); expected.push_back(IntArgs(4, 1,1,1,3)); expected.push_back(IntArgs(4, 1,1,2,2)); expected.push_back(IntArgs(4, 1,1,2,3)); expected.push_back(IntArgs(4, 1,1,3,3)); expected.push_back(IntArgs(4, 1,2,2,2)); expected.push_back(IntArgs(4, 1,2,2,3)); expected.push_back(IntArgs(4, 1,2,3,3)); expected.push_back(IntArgs(4, 1,3,3,3)); expected.push_back(IntArgs(4, 2,2,2,2)); expected.push_back(IntArgs(4, 2,2,2,3)); expected.push_back(IntArgs(4, 2,2,3,3)); expected.push_back(IntArgs(4, 2,3,3,3)); expected.push_back(IntArgs(4, 3,3,3,3)); return expected; } }; /// %Test for variable symmetry class VarSym3 { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 3; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { Symmetries syms; distinct(h, xs); syms << VariableSymmetry(IntVarArgs() << xs[0] << xs[1]); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), syms); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(4, 0,1,2,3)); expected.push_back(IntArgs(4, 0,1,3,2)); expected.push_back(IntArgs(4, 0,2,1,3)); expected.push_back(IntArgs(4, 0,2,3,1)); expected.push_back(IntArgs(4, 0,3,1,2)); expected.push_back(IntArgs(4, 0,3,2,1)); expected.push_back(IntArgs(4, 1,2,0,3)); expected.push_back(IntArgs(4, 1,2,3,0)); expected.push_back(IntArgs(4, 1,3,0,2)); expected.push_back(IntArgs(4, 1,3,2,0)); expected.push_back(IntArgs(4, 2,3,0,1)); expected.push_back(IntArgs(4, 2,3,1,0)); return expected; } }; /// %Test for variable symmetry class VarSym4 { public: /// Number of variables static const int n = 3; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 2; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { distinct(h, xs); Symmetries s; IntVarArgs symvars; symvars << xs[0]; s << VariableSymmetry(symvars); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(3, 0,1,2)); expected.push_back(IntArgs(3, 0,2,1)); expected.push_back(IntArgs(3, 1,0,2)); expected.push_back(IntArgs(3, 1,2,0)); expected.push_back(IntArgs(3, 2,0,1)); expected.push_back(IntArgs(3, 2,1,0)); return expected; } }; /// %Test for variable symmetry class VarSym5 { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 3; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { distinct(h, xs); Matrix m(xs, 4, 1); Symmetries s; s << VariableSymmetry(m.slice(0,2, 0,1)); s << VariableSymmetry(m.slice(2,4, 0,1)); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(4, 0,1,2,3)); expected.push_back(IntArgs(4, 0,2,1,3)); expected.push_back(IntArgs(4, 0,3,1,2)); expected.push_back(IntArgs(4, 1,2,0,3)); expected.push_back(IntArgs(4, 1,3,0,2)); expected.push_back(IntArgs(4, 2,3,0,1)); return expected; } }; /// %Test for matrix symmetry class MatSym1 { public: /// Number of variables static const int n = 6; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 1; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { Matrix m(xs, 2, 3); Symmetries s; s << rows_interchange(m); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(6, 0,0, 0,0, 0,0)); expected.push_back(IntArgs(6, 0,0, 0,0, 0,1)); expected.push_back(IntArgs(6, 0,0, 0,0, 1,0)); expected.push_back(IntArgs(6, 0,0, 0,0, 1,1)); expected.push_back(IntArgs(6, 0,0, 0,1, 0,0)); expected.push_back(IntArgs(6, 0,0, 0,1, 0,1)); expected.push_back(IntArgs(6, 0,0, 0,1, 1,0)); expected.push_back(IntArgs(6, 0,0, 0,1, 1,1)); expected.push_back(IntArgs(6, 0,0, 1,0, 1,0)); expected.push_back(IntArgs(6, 0,0, 1,0, 1,1)); expected.push_back(IntArgs(6, 0,0, 1,1, 1,1)); expected.push_back(IntArgs(6, 0,1, 0,0, 0,0)); expected.push_back(IntArgs(6, 0,1, 0,0, 0,1)); expected.push_back(IntArgs(6, 0,1, 0,0, 1,0)); expected.push_back(IntArgs(6, 0,1, 0,0, 1,1)); expected.push_back(IntArgs(6, 0,1, 0,1, 0,0)); expected.push_back(IntArgs(6, 0,1, 0,1, 0,1)); expected.push_back(IntArgs(6, 0,1, 0,1, 1,0)); expected.push_back(IntArgs(6, 0,1, 0,1, 1,1)); expected.push_back(IntArgs(6, 0,1, 1,0, 1,0)); expected.push_back(IntArgs(6, 0,1, 1,0, 1,1)); expected.push_back(IntArgs(6, 0,1, 1,1, 1,1)); expected.push_back(IntArgs(6, 1,0, 1,0, 1,0)); expected.push_back(IntArgs(6, 1,0, 1,0, 1,1)); expected.push_back(IntArgs(6, 1,0, 1,1, 1,1)); expected.push_back(IntArgs(6, 1,1, 1,1, 1,1)); return expected; } }; /// %Test for matrix symmetry class MatSym2 { public: /// Number of variables static const int n = 6; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 1; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { Matrix m(xs, 2, 3); Symmetries s; s << columns_interchange(m); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(6, 0,0, 0,0, 0,0)); expected.push_back(IntArgs(6, 0,0, 0,0, 0,1)); expected.push_back(IntArgs(6, 0,0, 0,0, 1,1)); expected.push_back(IntArgs(6, 0,0, 0,1, 0,0)); expected.push_back(IntArgs(6, 0,0, 0,1, 0,1)); expected.push_back(IntArgs(6, 0,0, 0,1, 1,0)); expected.push_back(IntArgs(6, 0,0, 0,1, 1,1)); expected.push_back(IntArgs(6, 0,0, 1,1, 0,0)); expected.push_back(IntArgs(6, 0,0, 1,1, 0,1)); expected.push_back(IntArgs(6, 0,0, 1,1, 1,1)); expected.push_back(IntArgs(6, 0,1, 0,0, 0,0)); expected.push_back(IntArgs(6, 0,1, 0,0, 0,1)); expected.push_back(IntArgs(6, 0,1, 0,0, 1,0)); expected.push_back(IntArgs(6, 0,1, 0,0, 1,1)); expected.push_back(IntArgs(6, 0,1, 0,1, 0,0)); expected.push_back(IntArgs(6, 0,1, 0,1, 0,1)); expected.push_back(IntArgs(6, 0,1, 0,1, 1,0)); expected.push_back(IntArgs(6, 0,1, 0,1, 1,1)); expected.push_back(IntArgs(6, 0,1, 1,0, 0,0)); expected.push_back(IntArgs(6, 0,1, 1,0, 0,1)); expected.push_back(IntArgs(6, 0,1, 1,0, 1,0)); expected.push_back(IntArgs(6, 0,1, 1,0, 1,1)); expected.push_back(IntArgs(6, 0,1, 1,1, 0,0)); expected.push_back(IntArgs(6, 0,1, 1,1, 0,1)); expected.push_back(IntArgs(6, 0,1, 1,1, 1,0)); expected.push_back(IntArgs(6, 0,1, 1,1, 1,1)); expected.push_back(IntArgs(6, 1,1, 0,0, 0,0)); expected.push_back(IntArgs(6, 1,1, 0,0, 0,1)); expected.push_back(IntArgs(6, 1,1, 0,0, 1,1)); expected.push_back(IntArgs(6, 1,1, 0,1, 0,0)); expected.push_back(IntArgs(6, 1,1, 0,1, 0,1)); expected.push_back(IntArgs(6, 1,1, 0,1, 1,0)); expected.push_back(IntArgs(6, 1,1, 0,1, 1,1)); expected.push_back(IntArgs(6, 1,1, 1,1, 0,0)); expected.push_back(IntArgs(6, 1,1, 1,1, 0,1)); expected.push_back(IntArgs(6, 1,1, 1,1, 1,1)); return expected; } }; /// %Test for matrix symmetry class MatSym3 { public: /// Number of variables static const int n = 6; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 1; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { Matrix m(xs, 2, 3); Symmetries s; s << rows_interchange(m); s << columns_interchange(m); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(6, 0,0, 0,0, 0,0)); expected.push_back(IntArgs(6, 0,0, 0,0, 0,1)); expected.push_back(IntArgs(6, 0,0, 0,0, 1,1)); expected.push_back(IntArgs(6, 0,0, 0,1, 0,0)); expected.push_back(IntArgs(6, 0,0, 0,1, 0,1)); expected.push_back(IntArgs(6, 0,0, 0,1, 1,0)); expected.push_back(IntArgs(6, 0,0, 0,1, 1,1)); expected.push_back(IntArgs(6, 0,0, 1,1, 1,1)); expected.push_back(IntArgs(6, 0,1, 0,0, 0,0)); expected.push_back(IntArgs(6, 0,1, 0,0, 0,1)); expected.push_back(IntArgs(6, 0,1, 0,0, 1,0)); expected.push_back(IntArgs(6, 0,1, 0,0, 1,1)); expected.push_back(IntArgs(6, 0,1, 0,1, 0,0)); expected.push_back(IntArgs(6, 0,1, 0,1, 0,1)); expected.push_back(IntArgs(6, 0,1, 0,1, 1,0)); expected.push_back(IntArgs(6, 0,1, 0,1, 1,1)); expected.push_back(IntArgs(6, 0,1, 1,0, 1,0)); expected.push_back(IntArgs(6, 0,1, 1,0, 1,1)); expected.push_back(IntArgs(6, 0,1, 1,1, 1,1)); expected.push_back(IntArgs(6, 1,1, 1,1, 1,1)); return expected; } }; /// %Test for matrix symmetry class MatSym4 { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 1; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { Matrix m(xs, 1, 4); Symmetries s; s << rows_reflect(m); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(4, 0, 0, 0, 0)); expected.push_back(IntArgs(4, 0, 0, 0, 1)); expected.push_back(IntArgs(4, 0, 0, 1, 0)); expected.push_back(IntArgs(4, 0, 0, 1, 1)); expected.push_back(IntArgs(4, 0, 1, 0, 0)); expected.push_back(IntArgs(4, 0, 1, 0, 1)); expected.push_back(IntArgs(4, 0, 1, 1, 0)); expected.push_back(IntArgs(4, 0, 1, 1, 1)); expected.push_back(IntArgs(4, 1, 0, 0, 1)); expected.push_back(IntArgs(4, 1, 0, 1, 1)); expected.push_back(IntArgs(4, 1, 1, 1, 1)); return expected; } }; /// %Test for variable sequence symmetry class SimIntVarSym1 { public: /// Number of variables static const int n = 12; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 3; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { Matrix m(xs, 3, 4); // The values in the first column are distinct. distinct(h, m.col(0)); // Each row sums to 3. for (int i = 0 ; i < 4 ; ++i) linear(h, m.row(i), IRT_EQ, 3); // Rows are interchangeable. Symmetries s; s << VariableSequenceSymmetry(xs, 3); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(12, 0,0,3, 1,0,2, 2,0,1, 3,0,0)); expected.push_back(IntArgs(12, 0,0,3, 1,0,2, 2,1,0, 3,0,0)); expected.push_back(IntArgs(12, 0,0,3, 1,1,1, 2,0,1, 3,0,0)); expected.push_back(IntArgs(12, 0,0,3, 1,1,1, 2,1,0, 3,0,0)); expected.push_back(IntArgs(12, 0,0,3, 1,2,0, 2,0,1, 3,0,0)); expected.push_back(IntArgs(12, 0,0,3, 1,2,0, 2,1,0, 3,0,0)); expected.push_back(IntArgs(12, 0,1,2, 1,0,2, 2,0,1, 3,0,0)); expected.push_back(IntArgs(12, 0,1,2, 1,0,2, 2,1,0, 3,0,0)); expected.push_back(IntArgs(12, 0,1,2, 1,1,1, 2,0,1, 3,0,0)); expected.push_back(IntArgs(12, 0,1,2, 1,1,1, 2,1,0, 3,0,0)); expected.push_back(IntArgs(12, 0,1,2, 1,2,0, 2,0,1, 3,0,0)); expected.push_back(IntArgs(12, 0,1,2, 1,2,0, 2,1,0, 3,0,0)); expected.push_back(IntArgs(12, 0,2,1, 1,0,2, 2,0,1, 3,0,0)); expected.push_back(IntArgs(12, 0,2,1, 1,0,2, 2,1,0, 3,0,0)); expected.push_back(IntArgs(12, 0,2,1, 1,1,1, 2,0,1, 3,0,0)); expected.push_back(IntArgs(12, 0,2,1, 1,1,1, 2,1,0, 3,0,0)); expected.push_back(IntArgs(12, 0,2,1, 1,2,0, 2,0,1, 3,0,0)); expected.push_back(IntArgs(12, 0,2,1, 1,2,0, 2,1,0, 3,0,0)); expected.push_back(IntArgs(12, 0,3,0, 1,0,2, 2,0,1, 3,0,0)); expected.push_back(IntArgs(12, 0,3,0, 1,0,2, 2,1,0, 3,0,0)); expected.push_back(IntArgs(12, 0,3,0, 1,1,1, 2,0,1, 3,0,0)); expected.push_back(IntArgs(12, 0,3,0, 1,1,1, 2,1,0, 3,0,0)); expected.push_back(IntArgs(12, 0,3,0, 1,2,0, 2,0,1, 3,0,0)); expected.push_back(IntArgs(12, 0,3,0, 1,2,0, 2,1,0, 3,0,0)); return expected; } }; /// %Test for variable sequence symmetry class SimIntVarSym2 { /// Number of rows static const int nrows = 4; /// Number of columns static const int ncols = 3; public: /// Number of variables static const int n = nrows*ncols; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 3; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { Matrix m(xs, 3, 4); // The values in the first column are distinct. distinct(h, m.col(0)); // Each row sums to 3. for (int i = 0 ; i < nrows ; ++i) linear(h, m.row(i), IRT_EQ, 3); Symmetries s; IntArgs a = IntArgs::create(n, 0); // Rows are interchangeable. s << VariableSequenceSymmetry(xs, 3); // Elements (i,1) and (i,2) in row i are interchangeable, // separately for each row. for (int i = 0 ; i < nrows ; i++) { IntVarArgs symvars; symvars << m(1,i) << m(2,i); s << VariableSymmetry(symvars); } branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(12, 0,0,3, 1,0,2, 2,0,1, 3,0,0)); expected.push_back(IntArgs(12, 0,0,3, 1,1,1, 2,0,1, 3,0,0)); expected.push_back(IntArgs(12, 0,1,2, 1,0,2, 2,0,1, 3,0,0)); expected.push_back(IntArgs(12, 0,1,2, 1,1,1, 2,0,1, 3,0,0)); return expected; } }; /// %Test for value sequence symmetry class SimIntValSym1 { public: /// Number of variables static const int n = 2; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 6; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { rel(h, xs[0] + xs[1] == 6); // Values 0,1,2 are symmetric with 6,5,4. IntArgs values(6, 0,1,2, 6,5,4); Symmetries s; s << ValueSequenceSymmetry(values, 3); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(2, 0,6)); expected.push_back(IntArgs(2, 1,5)); expected.push_back(IntArgs(2, 2,4)); expected.push_back(IntArgs(2, 3,3)); return expected; } }; /// %Test for value sequence symmetry class SimIntValSym2 { public: /// Number of variables static const int n = 3; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 8; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { TupleSet tuples; tuples.add(IntArgs(3, 1,1,1)); tuples.add(IntArgs(3, 4,4,4)); tuples.add(IntArgs(3, 7,7,7)); tuples.add(IntArgs(3, 0,1,5)); tuples.add(IntArgs(3, 0,1,8)); tuples.add(IntArgs(3, 3,4,2)); tuples.add(IntArgs(3, 3,4,8)); tuples.add(IntArgs(3, 6,7,2)); tuples.add(IntArgs(3, 6,7,5)); tuples.finalize(); extensional(h, xs, tuples); // Values 0,1,2 are symmetric with 3,4,5, and with 6,7,8. IntArgs values(9, 0,1,2, 3,4,5, 6,7,8); Symmetries s; s << ValueSequenceSymmetry(values, 3); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(3, 0,1,5)); expected.push_back(IntArgs(3, 1,1,1)); return expected; } }; /// %Test for value sequence symmetry class SimIntValSym3 { public: /// Number of variables static const int n = 2; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 6; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { rel(h, xs[0] + xs[1] == 6); Symmetries s; // Values 0,1,2 are symmetric with 6,5,4. s << values_reflect(0,6); branch(h, xs, INT_VAR_NONE(), INT_VAL_MED(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(2, 3,3)); expected.push_back(IntArgs(2, 2,4)); expected.push_back(IntArgs(2, 1,5)); expected.push_back(IntArgs(2, 0,6)); return expected; } }; /// %Test for value symmetry class ValSym1 { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 3; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { distinct(h, xs); Symmetries s; IntArgs indices(4, 0,1,2,3); s << ValueSymmetry(indices); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(4, 0,1,2,3)); return expected; } }; /// %Test for value symmetry class ValSym1b { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 3; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { distinct(h, xs); Symmetries s; s << ValueSymmetry(xs[0]); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(4, 0,1,2,3)); return expected; } }; /// %Test for value symmetry class ValSym1c { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 3; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { distinct(h, xs); Symmetries s; s << ValueSymmetry(xs[0]); branch(h, xs, INT_VAR_NONE(), INT_VAL_MAX(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(4, 3,2,1,0)); return expected; } }; /// %Test for value symmetry class ValSym2 { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 3; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { Symmetries s; IntArgs indices(4, 0,1,2,3); s << ValueSymmetry(indices); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(4, 0,0,0,0)); expected.push_back(IntArgs(4, 0,0,0,1)); expected.push_back(IntArgs(4, 0,0,1,0)); expected.push_back(IntArgs(4, 0,0,1,1)); expected.push_back(IntArgs(4, 0,0,1,2)); expected.push_back(IntArgs(4, 0,1,0,0)); expected.push_back(IntArgs(4, 0,1,0,1)); expected.push_back(IntArgs(4, 0,1,0,2)); expected.push_back(IntArgs(4, 0,1,1,0)); expected.push_back(IntArgs(4, 0,1,1,1)); expected.push_back(IntArgs(4, 0,1,1,2)); expected.push_back(IntArgs(4, 0,1,2,0)); expected.push_back(IntArgs(4, 0,1,2,1)); expected.push_back(IntArgs(4, 0,1,2,2)); expected.push_back(IntArgs(4, 0,1,2,3)); return expected; } }; /// %Test for value symmetry class ValSym2b { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 3; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { Symmetries s; s << ValueSymmetry(xs[0]); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(4, 0,0,0,0)); expected.push_back(IntArgs(4, 0,0,0,1)); expected.push_back(IntArgs(4, 0,0,1,0)); expected.push_back(IntArgs(4, 0,0,1,1)); expected.push_back(IntArgs(4, 0,0,1,2)); expected.push_back(IntArgs(4, 0,1,0,0)); expected.push_back(IntArgs(4, 0,1,0,1)); expected.push_back(IntArgs(4, 0,1,0,2)); expected.push_back(IntArgs(4, 0,1,1,0)); expected.push_back(IntArgs(4, 0,1,1,1)); expected.push_back(IntArgs(4, 0,1,1,2)); expected.push_back(IntArgs(4, 0,1,2,0)); expected.push_back(IntArgs(4, 0,1,2,1)); expected.push_back(IntArgs(4, 0,1,2,2)); expected.push_back(IntArgs(4, 0,1,2,3)); return expected; } }; /// %Test for value symmetry class ValSym3 { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 3; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { distinct(h, xs); Symmetries s; IntArgs indices(2, 0,1); s << ValueSymmetry(indices); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(4, 0,1,2,3)); expected.push_back(IntArgs(4, 0,1,3,2)); expected.push_back(IntArgs(4, 0,2,1,3)); expected.push_back(IntArgs(4, 0,2,3,1)); expected.push_back(IntArgs(4, 0,3,1,2)); expected.push_back(IntArgs(4, 0,3,2,1)); expected.push_back(IntArgs(4, 2,0,1,3)); expected.push_back(IntArgs(4, 2,0,3,1)); expected.push_back(IntArgs(4, 2,3,0,1)); expected.push_back(IntArgs(4, 3,0,1,2)); expected.push_back(IntArgs(4, 3,0,2,1)); expected.push_back(IntArgs(4, 3,2,0,1)); return expected; } }; /// %Test for value symmetry class ValSym4 { public: /// Number of variables static const int n = 3; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 2; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { distinct(h, xs); Symmetries s; IntArgs indices(1, 0); s << ValueSymmetry(indices); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(3, 0,1,2)); expected.push_back(IntArgs(3, 0,2,1)); expected.push_back(IntArgs(3, 1,0,2)); expected.push_back(IntArgs(3, 1,2,0)); expected.push_back(IntArgs(3, 2,0,1)); expected.push_back(IntArgs(3, 2,1,0)); return expected; } }; /// %Test for value symmetry class ValSym5 { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 3; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { distinct(h, xs); Symmetries s; IntArgs indices0(2, 0,1); IntArgs indices1(2, 2,3); s << ValueSymmetry(indices0); s << ValueSymmetry(indices1); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(4, 0,1,2,3)); expected.push_back(IntArgs(4, 0,2,1,3)); expected.push_back(IntArgs(4, 0,2,3,1)); expected.push_back(IntArgs(4, 2,0,1,3)); expected.push_back(IntArgs(4, 2,0,3,1)); expected.push_back(IntArgs(4, 2,3,0,1)); return expected; } }; /// %Test for variable and value symmetry class VarValSym1 { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 3; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { Symmetries s; s << VariableSymmetry(xs); s << ValueSymmetry(IntArgs::create(4,0)); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(4, 0,0,0,0)); expected.push_back(IntArgs(4, 0,0,0,1)); expected.push_back(IntArgs(4, 0,0,1,1)); expected.push_back(IntArgs(4, 0,0,1,2)); expected.push_back(IntArgs(4, 0,1,1,1)); expected.push_back(IntArgs(4, 0,1,1,2)); expected.push_back(IntArgs(4, 0,1,2,2)); // This solution is symmetric to the previous one. expected.push_back(IntArgs(4, 0,1,2,3)); return expected; } }; /// %Test for %LDSB infrastructure with %Latin square problem class LDSBLatin : public Base { public: /// %Latin square space class Latin : public Space { public: IntVarArray xs; Latin(int n = 4) : xs(*this, n*n, 1, n) { Matrix m(xs, n, n); for (int i = 0 ; i < n ; i++) { distinct(*this, m.col(i)); distinct(*this, m.row(i)); } Symmetries s; s << rows_interchange(m); s << columns_interchange(m); s << ValueSymmetry(IntSet(1,n)); branch(*this, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } // Search support. Latin(bool share, Latin& s) : Space(share, s) { xs.update(*this, share, s.xs); } virtual Space* copy(bool share) { return new Latin(share,*this); } IntArgs solution(void) { IntArgs a(xs.size()); for (int i = 0 ; i < a.size() ; ++i) a[i] = xs[i].val(); return a; } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(16, 1,2,3,4, 2,1,4,3, 3,4,1,2, 4,3,2,1)); expected.push_back(IntArgs(16, 1,2,3,4, 2,1,4,3, 3,4,2,1, 4,3,1,2)); expected.push_back(IntArgs(16, 1,2,3,4, 2,3,4,1, 3,4,1,2, 4,1,2,3)); expected.push_back(IntArgs(16, 1,2,3,4, 2,4,1,3, 3,1,4,2, 4,3,2,1)); return expected; } }; /// Initialize test LDSBLatin(std::string label) : Test::Base("LDSB::" + label) {} /// Perform actual tests bool run(void) { Latin *s = new Latin(); DFS e(s); bool r = check(e, Latin::expectedSolutions()); delete s; return r; } }; /* This test should fail if the recomputation-handling does not work * properly. * * Why recomputation can be a problem * ================================== * * Every branch point in LDSB is binary, with a left and a right * branch. Whenever backtracking happens -- when a right branch is * explored -- LDSB computes a set of symmetric literals to * exclude. * * !!! This calculation may depend on the current domains of the * !!! variables. * * During recomputation, parts of the search tree are replayed. To * be specific, the branching constraints are posted, but no * propagation happens. This means that at a given branch point, * the domains during recomputation may be different (weaker) than * they were the first time during search. * * !!! This *cannot* cause solutions to be missed --- LDSB will not * !!! be incorrect --- but it *does* change what will be pruned. * * If recomputation is not handled properly, the difference in * domains will cause extra solutions to be found. This is a result * of symmetries failing to be broken. * */ /// %Test for handling of recomputation class Recomputation { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 1; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { TupleSet t; t.add(IntArgs(2, 0,0)); t.add(IntArgs(2, 1,1)); t.finalize(); IntVarArgs va; va << xs[0] << xs[2]; extensional(h, va, t); Symmetries syms; syms << VariableSequenceSymmetry(xs, 2); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), syms); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(4, 0,0,0,0)); expected.push_back(IntArgs(4, 0,0,0,1)); // This is the solution that will be found if recomputation is // not handled. After branching on x[0]=0, we try x[1]=0. When // x[1]=0 backtracks, the symmetry [x[0],x[1]] <-> [x[2],x[3]] // is active --- but only after propagation! (Without // propagation, we do not have x[2]=0.) If propagation happens, // we know that symmetry is active and we can post x[3]!=0. If // it doesn't, we don't use the symmetry and we find a solution // where x[3]=0. // expected.push_back(IntArgs(4, 0,1,0,0)); expected.push_back(IntArgs(4, 0,1,0,1)); expected.push_back(IntArgs(4, 1,0,1,0)); expected.push_back(IntArgs(4, 1,0,1,1)); expected.push_back(IntArgs(4, 1,1,1,1)); return expected; } }; double position(const Space& home, IntVar x, int i) { (void) home; (void) x; return i; } /// %Test tiebreaking variable heuristic. class TieBreak { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 3; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { Symmetries syms; IntArgs indices(4, 0,1,2,3); syms << VariableSymmetry(xs, indices); distinct(h, xs); // This redundant constraint is to trick the variable // heuristic. rel(h, xs[1] != xs[2]); // xs[1] and xs[2] have higher degree than the others, so they // are considered first. xs[2] is higher than x[1] by the merit // function, so it is assigned first. Now all remaining // variables have the same degree, so they are searched in // reverse order (according to the merit function). So, the // solution found is {3, 2, 0, 1}. branch(h, xs, tiebreak(INT_VAR_DEGREE_MAX(), INT_VAR_MERIT_MAX(position)), INT_VAL_MIN(), syms); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(4, 3,2,0,1)); return expected; } }; #ifdef GECODE_HAS_SET_VARS /// Convenient way to make IntSetArgs IntSetArgs ISA(int n, ...) { IntSetArgs sets; va_list args; va_start(args, n); int i = 0; IntArgs a; while (i < n) { int x = va_arg(args,int); if (x == -1) { i++; sets << IntSet(a); a = IntArgs(); } else { a << x; } } va_end(args); return sets; } /// %Test for set variable symmetry class SetVarSym1 { public: /// Number of variables static const int n = 2; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 1; /// Setup problem constraints and symmetries static void setup(Home h, SetVarArray& xs) { Symmetries syms; syms << VariableSymmetry(xs); branch(h, xs, SET_VAR_NONE(), SET_VAL_MIN_INC(), syms); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(ISA(2, 0,1,-1, 0,1,-1)); expected.push_back(ISA(2, 0,1,-1, 0, -1)); expected.push_back(ISA(2, 0,1,-1, 1,-1)); expected.push_back(ISA(2, 0,1,-1, -1)); expected.push_back(ISA(2, 0, -1, 0,1,-1)); expected.push_back(ISA(2, 0, -1, 0, -1)); expected.push_back(ISA(2, 0, -1, 1,-1)); expected.push_back(ISA(2, 0, -1, -1)); // expected.push_back(ISA(2, 1,-1, 0,1,-1)); // expected.push_back(ISA(2, 1,-1, 0, -1)); expected.push_back(ISA(2, 1,-1, 1,-1)); expected.push_back(ISA(2, 1,-1, -1)); // expected.push_back(ISA(2, -1, 0,1,-1)); // expected.push_back(ISA(2, -1, 0, -1)); // expected.push_back(ISA(2, -1, 1,-1)); expected.push_back(ISA(2, -1, -1)); return expected; } }; /* * This tests the special handling of value symmetries on set * values. Look at the third solution (commented out) below. The * first variable has been assigned to {0,1}. If the value symmetry * is not handled specially, then we will consider the value * symmetry broken because the search has touched each value. * However, because both values have been assigned to the same * variable, 0 and 1 are still symmetric. Therefore, the third * solution is symmetric to the second one and should be excluded. */ /// %Test for set value symmetry class SetValSym1 { public: /// Number of variables static const int n = 2; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 1; /// Setup problem constraints and symmetries static void setup(Home h, SetVarArray& xs) { Symmetries syms; syms << ValueSymmetry(IntArgs(2, 0,1)); branch(h, xs, SET_VAR_NONE(), SET_VAL_MIN_INC(), syms); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(ISA(2, 0,1,-1, 0,1,-1)); expected.push_back(ISA(2, 0,1,-1, 0, -1)); // expected.push_back(ISA(2, 0,1,-1, 1,-1)); // XXXXX bad solution expected.push_back(ISA(2, 0,1,-1, -1)); expected.push_back(ISA(2, 0, -1, 0,1,-1)); expected.push_back(ISA(2, 0, -1, 0, -1)); expected.push_back(ISA(2, 0, -1, 1,-1)); expected.push_back(ISA(2, 0, -1, -1)); // expected.push_back(ISA(2, 1,-1, 0,1,-1)); // expected.push_back(ISA(2, 1,-1, 0, -1)); // expected.push_back(ISA(2, 1,-1, 1,-1)); // expected.push_back(ISA(2, 1,-1, -1)); expected.push_back(ISA(2, -1, 0,1,-1)); expected.push_back(ISA(2, -1, 0, -1)); // expected.push_back(ISA(2, -1, 1,-1)); expected.push_back(ISA(2, -1, -1)); return expected; } }; /// %Test for set value symmetry class SetValSym2 { public: /// Number of variables static const int n = 3; /// Lower bound of values static const int l = 1; /// Upper bound of values static const int u = 4; /// Setup problem constraints and symmetries static void setup(Home h, SetVarArray& xs) { Symmetries syms; syms << ValueSymmetry(IntArgs(4, 1,2,3,4)); for (int i = 0 ; i < 3 ; i++) cardinality(h, xs[i], 1, 1); branch(h, xs, SET_VAR_NONE(), SET_VAL_MIN_INC(), syms); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(ISA(3, 1,-1, 1,-1, 1,-1)); expected.push_back(ISA(3, 1,-1, 1,-1, 2,-1)); expected.push_back(ISA(3, 1,-1, 2,-1, 1,-1)); expected.push_back(ISA(3, 1,-1, 2,-1, 2,-1)); expected.push_back(ISA(3, 1,-1, 2,-1, 3,-1)); return expected; } }; /// %Test for set variable sequence symmetry class SetVarSeqSym1 { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 1; /// Setup problem constraints and symmetries static void setup(Home h, SetVarArray& xs) { Symmetries syms; syms << VariableSequenceSymmetry(xs,2); rel(h, xs[0], SOT_INTER, xs[1], SRT_EQ, IntSet::empty); rel(h, xs[2], SOT_INTER, xs[3], SRT_EQ, IntSet::empty); for (int i = 0 ; i < 4 ; i++) cardinality(h, xs[i], 1, 1); branch(h, xs, SET_VAR_NONE(), SET_VAL_MIN_INC(), syms); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(ISA(4, 0,-1, 1,-1, 0,-1, 1,-1)); expected.push_back(ISA(4, 0,-1, 1,-1, 1,-1, 0,-1)); // expected.push_back(ISA(4, 1,-1, 0,-1, 0,-1, 1,-1)); expected.push_back(ISA(4, 1,-1, 0,-1, 1,-1, 0,-1)); return expected; } }; /// %Test for set variable sequence symmetry class SetVarSeqSym2 { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 0; /// Setup problem constraints and symmetries static void setup(Home h, SetVarArray& xs) { Symmetries syms; syms << VariableSequenceSymmetry(xs,2); rel(h, xs[0], SRT_EQ, xs[2]); branch(h, xs, SET_VAR_NONE(), SET_VAL_MIN_INC(), syms); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); // Symmetric solutions are commented out. expected.push_back(ISA(4, 0, -1,0,-1,0,-1,0,-1)); expected.push_back(ISA(4, 0, -1,0,-1,0,-1, -1)); // expected.push_back(ISA(4, 0, -1,0,-1, -1,0,-1)); // expected.push_back(ISA(4, 0, -1,0,-1, -1, -1)); // expected.push_back(ISA(4, 0, -1, -1,0,-1,0,-1)); expected.push_back(ISA(4, 0, -1, -1,0,-1, -1)); // expected.push_back(ISA(4, 0, -1, -1, -1,0,-1)); // expected.push_back(ISA(4, 0, -1, -1, -1, -1)); // expected.push_back(ISA(4, -1,0,-1,0,-1,0,-1)); // expected.push_back(ISA(4, -1,0,-1,0,-1, -1)); expected.push_back(ISA(4, -1,0,-1, -1,0,-1)); expected.push_back(ISA(4, -1,0,-1, -1, -1)); // expected.push_back(ISA(4, -1, -1,0,-1,0,-1)); // expected.push_back(ISA(4, -1, -1,0,-1, -1)); // expected.push_back(ISA(4, -1, -1, -1,0,-1)); expected.push_back(ISA(4, -1, -1, -1, -1)); return expected; } }; /// %Test for reflection symmetry class ReflectSym1 { public: /// Number of variables static const int n = 6; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 6; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { Matrix m(xs, 3, 2); distinct(h, xs); rel(h, abs(m(0,0)-m(1,0))==1); rel(h, abs(m(0,1)-m(1,1))==1); rel(h, abs(m(1,0)-m(2,0))==1); rel(h, abs(m(1,1)-m(2,1))==1); Symmetries s; s << values_reflect(l, u); s << rows_interchange(m); s << columns_reflect(m); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(6, 0,1,2,3,4,5)); expected.push_back(IntArgs(6, 0,1,2,4,5,6)); expected.push_back(IntArgs(6, 0,1,2,5,4,3)); expected.push_back(IntArgs(6, 0,1,2,6,5,4)); return expected; } }; /// %Test for reflection symmetry class ReflectSym2 { public: /// Number of variables static const int n = 2; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 3; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { Symmetries s; s << values_reflect(l, u); branch(h, xs, INT_VAR_NONE(), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(2, 0,0)); expected.push_back(IntArgs(2, 0,1)); expected.push_back(IntArgs(2, 0,2)); expected.push_back(IntArgs(2, 0,3)); expected.push_back(IntArgs(2, 1,0)); expected.push_back(IntArgs(2, 1,1)); expected.push_back(IntArgs(2, 1,2)); expected.push_back(IntArgs(2, 1,3)); return expected; } }; /// %Test with activity class Activity1 { public: /// Number of variables static const int n = 4; /// Lower bound of values static const int l = 0; /// Upper bound of values static const int u = 3; /// Setup problem constraints and symmetries static void setup(Home h, IntVarArray& xs) { distinct(h, xs); Symmetries s; s << VariableSymmetry(xs); s << ValueSymmetry(IntArgs::create(4,0)); branch(h, xs, INT_VAR_ACTIVITY_MIN(0.8), INT_VAL_MIN(), s); } /// Compute list of expected solutions static std::vector expectedSolutions(void) { static std::vector expected; expected.clear(); expected.push_back(IntArgs(4, 0,1,2,3)); return expected; } }; #endif LDSB varsym1("VarSym1"); LDSB varsym1b("VarSym1b"); LDSB varsym2("VarSym2"); LDSB varsym3("VarSym3"); LDSB varsym4("VarSym4"); LDSB varsym5("VarSym5"); LDSB matsym1("MatSym1"); LDSB matsym2("MatSym2"); LDSB matsym3("MatSym3"); LDSB matsym4("MatSym4"); LDSB simintvarsym1("SimIntVarSym1"); LDSB simintvarsym2("SimIntVarSym2"); LDSB simintvalsym1("SimIntValSym1"); LDSB simintvalsym2("SimIntValSym2"); LDSB simintvalsym3("SimIntValSym3"); LDSB valsym1("ValSym1"); LDSB valsym1b("ValSym1b"); LDSB valsym1c("ValSym1c"); LDSB valsym2("ValSym2"); LDSB valsym2b("ValSym2b"); LDSB valsym3("ValSym3"); LDSB valsym4("ValSym4"); LDSB valsym5("ValSym5"); LDSB varvalsym1("VarValSym1"); LDSBLatin latin("Latin"); LDSB recomp("Recomputation", 999,999); LDSB tiebreak("TieBreak"); #ifdef GECODE_HAS_SET_VARS LDSB reflectsym1("ReflectSym1"); LDSB reflectsym2("ReflectSym2"); LDSB activity1("Activity1"); LDSBSet setvarsym1("SetVarSym1"); LDSBSet setvalsym1("SetValSym1"); LDSBSet setvalsym2("SetValSym2", 0, 1); LDSBSet setvarseqsym1("SetVarSeqSym1"); LDSBSet setvarseqsym2("SetVarSeqSym2"); #endif }} // STATISTICS: test-core gecode-4.2.1/test/nogoods.cpp0000755000175000010010000002325012166761637015240 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Contributing authors: * Guido Tack * * Copyright: * Christian Schulte, 2013 * Guido Tack, 2004 * * Last modified: * $Date: 2013-07-09 12:19:11 +0200 (Tue, 09 Jul 2013) $ by $Author: schulte $ * $Revision: 13831 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include "test/test.hh" namespace Test { /// Tests for search using no-goods namespace NoGoods { using namespace Gecode; /// A dummy function for branching void dummy(Space& home) { } /// Example for testing integer no-goods class Queens : public Space { public: /// Number of queens (must be even) const static int n = 18; /// Position of queens on boards IntVarArray q; /// The actual problem Queens(IntValBranch ivb, bool assign, bool null) : q(*this,n,0,n-1) { distinct(*this, IntArgs::create(n,0,1), q, ICL_VAL); distinct(*this, IntArgs::create(n,0,-1), q, ICL_VAL); distinct(*this, q, ICL_VAL); if (assign) { IntVar x(*this,0,1); Gecode::assign(*this, x, INT_ASSIGN_MIN()); } { IntVarArgs q1(n/2), q2(n/2); for (int i=0; i= distance); if (assign) { IntVar x(*this,0,1); Gecode::assign(*this, x, INT_ASSIGN_MIN()); } { SetVarArgs x1(size/2), x2(size/2); for (int i=0; i class NoGoods : public Base { protected: /// How to branch ValBranch vb; /// Number of threads to use unsigned int t; /// Whether to also assign some variables bool a; /// Whether to also create branchers without no-good literals bool n; public: /// Map unsigned integer to string static std::string str(unsigned int i) { std::stringstream s; s << i; return s.str(); } /// Initialize test NoGoods(ValBranch vb0, unsigned int t0, bool a0, bool n0) : Base("NoGoods::"+Model::name()+"::"+Model::val(vb0)+"::"+str(t0)+ "::"+(a0 ? "+" : "-")+"::"+(n0 ? "+" : "-")), vb(vb0), t(t0), a(a0), n(n0) {} /// Run test virtual bool run(void) { Model* m = new Model(vb,a,n); // Solution without no-goods Model* s_plain = dfs(m); // Stop and re-start for a while to collect no-goods { Search::NodeStop ns(Model::nodeinc()); Search::Options o; o.stop = &ns; o.threads = t; o.nogoods_limit = 256U; DFS e(m,o); while (true) { Model* s = e.next(); delete s; if (!e.stopped()) break; // Add no-goods e.nogoods().post(*m); ns.limit(ns.limit()+Model::nodeinc()); } } // Compare whether the a or the same solution is found with no-goods Model* s_nogoods = dfs(m); bool ok = ((s_nogoods != NULL) && ((t != 1) || s_plain->same(*s_nogoods))); delete m; delete s_nogoods; delete s_plain; return ok; } }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { bool a = false; do { bool n = false; do { for (unsigned int t = 1; t<=4; t++) { (void) new NoGoods(INT_VAL_MIN(),t,a,n); (void) new NoGoods(INT_VAL_MAX(),t,a,n); (void) new NoGoods(INT_VAL_SPLIT_MIN(),t,a,n); (void) new NoGoods(INT_VAL_SPLIT_MAX(),t,a,n); (void) new NoGoods(INT_VALUES_MIN(),t,a,n); (void) new NoGoods(INT_VALUES_MAX(),t,a,n); #ifdef GECODE_HAS_SET_VARS (void) new NoGoods(SET_VAL_MIN_INC(),t,a,n); (void) new NoGoods(SET_VAL_MIN_EXC(),t,a,n); (void) new NoGoods(SET_VAL_MAX_INC(),t,a,n); (void) new NoGoods(SET_VAL_MAX_EXC(),t,a,n); #endif } n = !n; } while (n); a = !a; } while (a); } }; Create c; } } // STATISTICS: test-search gecode-4.2.1/test/search.cpp0000755000175000010010000004477612170744252015042 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2008 * * Last modified: * $Date: 2013-07-15 12:02:18 +0200 (Mon, 15 Jul 2013) $ by $Author: schulte $ * $Revision: 13880 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include "test/test.hh" namespace Test { /// Tests for search engines namespace Search { using namespace Gecode; using namespace Gecode::Int; /// Values for selecting branchers enum HowToBranch { HTB_NONE, ///< Do not branch HTB_UNARY, ///< Branch with single alternative HTB_BINARY, ///< Branch with two alternatives HTB_NARY ///< Branch with many alternatives }; /// Values for selecting how to constrain enum HowToConstrain { HTC_NONE, ///< Do not constrain HTC_LEX_LE, ///< Constrain for lexically smallest HTC_LEX_GR, ///< Constrain for lexically biggest HTC_BAL_LE, ///< Constrain for smallest balance HTC_BAL_GR ///< Constrain for largest balance }; /// Values for selecting models enum WhichModel { WM_FAIL_IMMEDIATE, ///< Model that fails immediately WM_FAIL_SEARCH, ///< Model without solutions WM_SOLUTIONS ///< Model with solutions }; /// Space with information class TestSpace : public Space { public: /// Constructor for space creation TestSpace(void) {} /// Constructor for cloning \a s TestSpace(bool share, TestSpace& s) : Space(share,s) {} /// Return number of solutions virtual int solutions(void) const = 0; /// Verify that this is best solution virtual bool best(void) const = 0; }; /// Space that immediately fails class FailImmediate : public TestSpace { public: /// Variables used IntVarArray x; /// Constructor for space creation FailImmediate(HowToBranch, HowToBranch, HowToBranch, HowToConstrain=HTC_NONE) : x(*this,1,0,0) { rel(*this, x[0], IRT_EQ, 1); } /// Constructor for cloning \a s FailImmediate(bool share, FailImmediate& s) : TestSpace(share,s) { x.update(*this, share, s.x); } /// Copy during cloning virtual Space* copy(bool share) { return new FailImmediate(share,*this); } /// Add constraint for next better solution virtual void constrain(const Space&) { } /// Return number of solutions virtual int solutions(void) const { return 0; } /// Verify that this is best solution virtual bool best(void) const { return false; } /// Return name static std::string name(void) { return "Fail"; } }; /// Space that is immediately solved class SolveImmediate : public TestSpace { public: /// Variables used IntVarArray x; /// Constructor for space creation SolveImmediate(HowToBranch, HowToBranch, HowToBranch, HowToConstrain=HTC_NONE) : x(*this,1,0,0) {} /// Constructor for cloning \a s SolveImmediate(bool share, SolveImmediate& s) : TestSpace(share,s) { x.update(*this, share, s.x); } /// Copy during cloning virtual Space* copy(bool share) { return new SolveImmediate(share,*this); } /// Add constraint for next better solution virtual void constrain(const Space&) { fail(); } /// Return number of solutions virtual int solutions(void) const { return 1; } /// Verify that this is best solution virtual bool best(void) const { return true; } /// Return name static std::string name(void) { return "Solve"; } }; /// Space that requires propagation and has solutions class HasSolutions : public TestSpace { public: /// Variables used IntVarArray x; /// How to branch HowToBranch htb1, htb2, htb3; /// How to constrain HowToConstrain htc; /// Branch on \a x according to \a htb void branch(const IntVarArgs& x, HowToBranch htb) { switch (htb) { case HTB_NONE: break; case HTB_UNARY: assign(*this, x, INT_ASSIGN_MIN()); break; case HTB_BINARY: Gecode::branch(*this, x, INT_VAR_NONE(), INT_VAL_MIN()); break; case HTB_NARY: Gecode::branch(*this, x, INT_VAR_NONE(), INT_VALUES_MIN()); break; } } /// Constructor for space creation HasSolutions(HowToBranch _htb1, HowToBranch _htb2, HowToBranch _htb3, HowToConstrain _htc=HTC_NONE) : x(*this,6,0,5), htb1(_htb1), htb2(_htb2), htb3(_htb3), htc(_htc) { distinct(*this, x); rel(*this, x[2], IRT_LQ, 3); rel(*this, x[3], IRT_LQ, 3); rel(*this, x[4], IRT_LQ, 1); rel(*this, x[5], IRT_LQ, 1); IntVarArgs x1(2); x1[0]=x[0]; x1[1]=x[1]; branch(x1, htb1); IntVarArgs x2(2); x2[0]=x[2]; x2[1]=x[3]; branch(x2, htb2); IntVarArgs x3(2); x3[0]=x[4]; x3[1]=x[5]; branch(x3, htb3); } /// Constructor for cloning \a s HasSolutions(bool share, HasSolutions& s) : TestSpace(share,s), htb1(s.htb1), htb2(s.htb2), htb3(s.htb3), htc(s.htc) { x.update(*this, share, s.x); } /// Copy during cloning virtual Space* copy(bool share) { return new HasSolutions(share,*this); } /// Add constraint for next better solution virtual void constrain(const Space& _s) { const HasSolutions& s = static_cast(_s); switch (htc) { case HTC_NONE: break; case HTC_LEX_LE: case HTC_LEX_GR: { IntVarArgs y(6); for (int i=0; i<6; i++) y[i] = IntVar(*this, s.x[i].val(), s.x[i].val()); lex(*this, x, (htc == HTC_LEX_LE) ? IRT_LE : IRT_GR, y); break; } case HTC_BAL_LE: case HTC_BAL_GR: { IntVarArgs y(6); for (int i=0; i<6; i++) y[i] = IntVar(*this, s.x[i].val(), s.x[i].val()); IntVar xs(*this, -18, 18); IntVar ys(*this, -18, 18); rel(*this, x[0]+x[1]+x[2]-x[3]-x[4]-x[5] == xs); rel(*this, y[0]+y[1]+y[2]-y[3]-y[4]-y[5] == ys); rel(*this, expr(*this,abs(xs)), (htc == HTC_BAL_LE) ? IRT_LE : IRT_GR, expr(*this,abs(ys))); break; } } } /// Return number of solutions virtual int solutions(void) const { if (htb1 == HTB_NONE) { assert((htb2 == HTB_NONE) && (htb3 == HTB_NONE)); return 1; } if ((htb1 == HTB_UNARY) || (htb2 == HTB_UNARY)) return 0; if (htb3 == HTB_UNARY) return 4; return 8; } /// Verify that this is best solution virtual bool best(void) const { if ((htb1 == HTB_NONE) || (htb2 == HTB_NONE) || (htb3 == HTB_NONE) || (htb1 == HTB_UNARY) || (htb2 == HTB_UNARY) || (htb3 == HTB_UNARY)) return true; switch (htc) { case HTC_NONE: return true; case HTC_LEX_LE: return ((x[0].val()==4) && (x[1].val()==5) && (x[2].val()==2) && (x[3].val()==3) && (x[4].val()==0) && (x[5].val()==1)); case HTC_LEX_GR: return ((x[0].val()==5) && (x[1].val()==4) && (x[2].val()==3) && (x[3].val()==2) && (x[4].val()==1) && (x[5].val()==0)); case HTC_BAL_LE: return ((x[0].val()==4) && (x[1].val()==5) && (x[2].val()==2) && (x[3].val()==3) && (x[4].val()==0) && (x[5].val()==1)); case HTC_BAL_GR: return ((x[0].val()==4) && (x[1].val()==5) && (x[2].val()==3) && (x[3].val()==2) && (x[4].val()==0) && (x[5].val()==1)); default: GECODE_NEVER; } return false; } /// Return name static std::string name(void) { return "Sol"; } /// Rule out that solution is found more than once during restarts virtual void master(unsigned long int i, const Space* _s, NoGoods&) { const HasSolutions* s = static_cast(_s); if (s != NULL) { BoolVarArgs b; for (int i=0; ix[i]); rel(*this, BOT_AND, b, 0); } } }; /// %Base class for search tests class Test : public Base { public: /// How to branch HowToBranch htb1, htb2, htb3; /// How to constrain HowToConstrain htc; /// Map unsigned integer to string static std::string str(unsigned int i) { std::stringstream s; s << i; return s.str(); } /// Map branching to string static std::string str(HowToBranch htb) { switch (htb) { case HTB_NONE: return "None"; case HTB_UNARY: return "Unary"; case HTB_BINARY: return "Binary"; case HTB_NARY: return "Nary"; default: GECODE_NEVER; } GECODE_NEVER; return ""; } /// Map constrain to string static std::string str(HowToConstrain htc) { switch (htc) { case HTC_NONE: return "None"; case HTC_LEX_LE: return "LexLe"; case HTC_LEX_GR: return "LexGr"; case HTC_BAL_LE: return "BalLe"; case HTC_BAL_GR: return "BalGr"; default: GECODE_NEVER; } GECODE_NEVER; return ""; } /// Initialize test Test(const std::string& s, HowToBranch _htb1, HowToBranch _htb2, HowToBranch _htb3, HowToConstrain _htc=HTC_NONE) : Base("Search::"+s), htb1(_htb1), htb2(_htb2), htb3(_htb3), htc(_htc) {} }; /// %Test for depth-first search template class DFS : public Test { private: /// Minimal recomputation distance unsigned int c_d; /// Adaptive recomputation distance unsigned int a_d; /// Number of threads unsigned int t; public: /// Initialize test DFS(HowToBranch htb1, HowToBranch htb2, HowToBranch htb3, unsigned int c_d0, unsigned int a_d0, unsigned int t0) : Test("DFS::"+Model::name()+"::"+ str(htb1)+"::"+str(htb2)+"::"+str(htb3)+"::"+ str(c_d0)+"::"+str(a_d0)+"::"+str(t0), htb1,htb2,htb3), c_d(c_d0), a_d(a_d0), t(t0) {} /// Run test virtual bool run(void) { Model* m = new Model(htb1,htb2,htb3); Gecode::Search::FailStop f(2); Gecode::Search::Options o; o.c_d = c_d; o.a_d = a_d; o.threads = t; o.stop = &f; Gecode::DFS dfs(m,o); int n = m->solutions(); delete m; while (true) { Model* s = dfs.next(); if (s != NULL) { n--; delete s; } if ((s == NULL) && !dfs.stopped()) break; f.limit(f.limit()+2); } return n == 0; } }; /// %Test for best solution search template class BAB : public Test { private: /// Minimal recomputation distance unsigned int c_d; /// Adaptive recomputation distance unsigned int a_d; /// Number of threads unsigned int t; public: /// Initialize test BAB(HowToConstrain htc, HowToBranch htb1, HowToBranch htb2, HowToBranch htb3, unsigned int c_d0, unsigned int a_d0, unsigned int t0) : Test("BAB::"+Model::name()+"::"+str(htc)+"::"+ str(htb1)+"::"+str(htb2)+"::"+str(htb3)+"::"+ str(c_d0)+"::"+str(a_d0)+"::"+str(t0), htb1,htb2,htb3,htc), c_d(c_d0), a_d(a_d0), t(t0) {} /// Run test virtual bool run(void) { Model* m = new Model(htb1,htb2,htb3,htc); Gecode::Search::FailStop f(2); Gecode::Search::Options o; o.c_d = c_d; o.a_d = a_d; o.threads = t; o.stop = &f; Gecode::BAB bab(m,o); delete m; Model* b = NULL; while (true) { Model* s = bab.next(); if (s != NULL) { delete b; b=s; } if ((s == NULL) && !bab.stopped()) break; f.limit(f.limit()+2); } bool ok = (b == NULL) || b->best(); delete b; return ok; } }; /// %Test for restart-based search template class Engine> class RBS : public Test { private: /// Number of threads unsigned int t; public: /// Initialize test RBS(const std::string& e, unsigned int t0) : Test("RBS::"+e+"::"+Model::name()+"::"+str(t0), HTB_BINARY,HTB_BINARY,HTB_BINARY), t(t0) {} /// Run test virtual bool run(void) { Model* m = new Model(htb1,htb2,htb3); Gecode::Search::FailStop f(2); Gecode::Search::Options o; o.threads = t; o.stop = &f; o.cutoff = Gecode::Search::Cutoff::geometric(1,2); Gecode::RBS rbs(m,o); int n = m->solutions(); delete m; while (true) { Model* s = rbs.next(); if (s != NULL) { n--; delete s; } if ((s == NULL) && !rbs.stopped()) break; f.limit(f.limit()+2); } return n == 0; } }; /// Iterator for branching types class BranchTypes { private: /// Array of branching types static const HowToBranch htbs[3]; /// Current position in branching type array int i; public: /// Initialize iterator BranchTypes(void) : i(0) {} /// Test whether iterator is done bool operator()(void) const { return i<3; } /// Increment to next branching type void operator++(void) { i++; } /// Return current branching type HowToBranch htb(void) const { return htbs[i]; } }; const HowToBranch BranchTypes::htbs[3] = {HTB_UNARY, HTB_BINARY, HTB_NARY}; /// Iterator for constrain types class ConstrainTypes { private: /// Array of constrain types static const HowToConstrain htcs[4]; /// Current position in constrain type array int i; public: /// Initialize iterator ConstrainTypes(void) : i(0) {} /// Test whether iterator is done bool operator()(void) const { return i<4; } /// Increment to next constrain type void operator++(void) { i++; } /// Return current constrain type HowToConstrain htc(void) const { return htcs[i]; } }; const HowToConstrain ConstrainTypes::htcs[4] = {HTC_LEX_LE, HTC_LEX_GR, HTC_BAL_LE, HTC_BAL_GR}; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { // Depth-first search for (unsigned int t = 1; t<=4; t++) for (unsigned int c_d = 1; c_d<10; c_d++) for (unsigned int a_d = 1; a_d<=c_d; a_d++) { for (BranchTypes htb1; htb1(); ++htb1) for (BranchTypes htb2; htb2(); ++htb2) for (BranchTypes htb3; htb3(); ++htb3) (void) new DFS (htb1.htb(),htb2.htb(),htb3.htb(),c_d, a_d, t); new DFS(HTB_NONE, HTB_NONE, HTB_NONE, c_d, a_d, t); new DFS(HTB_NONE, HTB_NONE, HTB_NONE, c_d, a_d, t); new DFS(HTB_NONE, HTB_NONE, HTB_NONE, c_d, a_d, t); } // Best solution search for (unsigned int t = 1; t<=4; t++) for (unsigned int c_d = 1; c_d<10; c_d++) for (unsigned int a_d = 1; a_d<=c_d; a_d++) { for (ConstrainTypes htc; htc(); ++htc) for (BranchTypes htb1; htb1(); ++htb1) for (BranchTypes htb2; htb2(); ++htb2) for (BranchTypes htb3; htb3(); ++htb3) { (void) new BAB (htc.htc(),htb1.htb(),htb2.htb(),htb3.htb(), c_d,a_d,t); } (void) new BAB (HTC_NONE,HTB_NONE,HTB_NONE,HTB_NONE,c_d,a_d,t); (void) new BAB (HTC_NONE,HTB_NONE,HTB_NONE,HTB_NONE,c_d,a_d,t); (void) new BAB (HTC_NONE,HTB_NONE,HTB_NONE,HTB_NONE,c_d,a_d,t); } // Restart-based search for (unsigned int t = 1; t<=4; t++) { (void) new RBS("DFS",t); (void) new RBS("BAB",t); (void) new RBS("DFS",t); (void) new RBS("BAB",t); (void) new RBS("DFS",t); (void) new RBS("BAB",t); } } }; Create c; } } // STATISTICS: test-search gecode-4.2.1/test/set/0000755000175000010010000000000012236131646013637 5ustar schulteNonegecode-4.2.1/test/set/channel.cpp0000644000175000010010000001651111654471127015763 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * * Copyright: * Guido Tack, 2005 * * Last modified: * $Date: 2011-11-03 11:52:07 +0100 (Thu, 03 Nov 2011) $ by $Author: tack $ * $Revision: 12452 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/set.hh" #include "test/int.hh" #include using namespace Gecode; namespace Test { namespace Set { /// %Tests for set channeling constraints namespace Channel { /** * \defgroup TaskTestSetChannel %Set channeling constraints * \ingroup TaskTestSet */ //@{ static IntSet d1(0,2); static IntSet d_12(-1,2); static IntSet d2(-1,3); static IntSet d3(0,3); static IntSet d4(0,4); static IntSet ds_33(-3,3); /// %Test for sorted channeling constraint class ChannelSorted : public SetTest { public: /// Create and register test ChannelSorted(const char* t) : SetTest(t,1,ds_33,false,3) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { if (x.ints()[0]>=x.ints()[1] || x.ints()[1]>=x.ints()[2]) return false; CountableSetValues xr(x.lub, x[0]); if (!xr()) return false; if (xr.val() != x.ints()[0]) return false; ++xr; if (!xr()) return false; if (xr.val() != x.ints()[1]) return false; ++xr; if (!xr()) return false; if (xr.val() != x.ints()[2]) return false; ++xr; if (xr()) return false; return true; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray& y) { Gecode::channelSorted(home, y, x[0]); } }; ChannelSorted _channelSorted("Channel::Sorted"); /// %Test for integer channel constraint class ChannelInt : public SetTest { private: int ssize, isize; public: /// Create and register test ChannelInt(const char* t, const IntSet& d, int _ssize, int _isize) : SetTest(t,_ssize,d,false,_isize), ssize(_ssize), isize(_isize) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { for (int i=0; i= ssize) return false; Iter::Ranges::Singleton single(i,i); CountableSetRanges csr(x.lub, x[x.ints()[i]]); if (!Iter::Ranges::subset(single, csr)) return false; } for (int i=0; i= isize) return false; if (x.ints()[csv.val()] != i) return false; size++; } } return true; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray& y) { Gecode::channel(home, y, x); } }; ChannelInt _channelint1("Channel::Int::1", d2, 2, 3); ChannelInt _channelint2("Channel::Int::2", d3, 3, 3); /// %Test for Boolean channel constraint class ChannelBool : public SetTest { private: int isize; public: /// Create and register test ChannelBool(const char* t, const IntSet& d, int _isize) : SetTest(t,1,d,false,_isize), isize(_isize) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { for (int i=0; i 1) return false; } int cur = 0; for (CountableSetValues csv(x.lub, x[0]); csv(); ++csv) { if (csv.val() < 0 || csv.val() >= isize) return false; if (x.ints()[csv.val()] != 1) return false; for (; cur= _x1size) return false; for (int j=0; j<_x1size; j++) { CountableSetRanges x1ir(x.lub, x[_x0size+j]); IntSet x1is(x1ir); if (x1is.min() < 0 || x1is.max() >= _x0size) return false; bool jInI = x0is.in(j); bool iInJ = x1is.in(i); if (jInI != iInJ) return false; } } return true; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray&) { SetVarArgs x0(x.slice(0,1,_x0size)); SetVarArgs x1(x.slice(_x0size)); Gecode::channel(home, x0,x1); } }; ChannelSet _channelSet12("Channel::Set::1::2", d1, 2,2); ChannelSet _channelSet13("Channel::Set::1::3", d1, 2,3); ChannelSet _channelSet22("Channel::Set::2::2", d3, 2,2); ChannelSet _channelSet23("Channel::Set::2::3", d3, 2,3); ChannelSet _channelSet32("Channel::Set::3::2", d_12, 2,2); ChannelSet _channelSet33("Channel::Set::3::3", d_12, 2,3); }}} // STATISTICS: test-set gecode-4.2.1/test/set/construct.cpp0000644000175000010010000001537411357330563016403 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * * Copyright: * Guido Tack, 2008 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ by $Author: schulte $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/set.hh" using namespace Gecode; namespace Test { namespace Set { /// %Tests for set variable conors namespace Var { /// %Test for cardinality constraint class Construct : public SetTest { public: /// Create and register test Construct(void) : SetTest("Var::Construct",1,IntSet(0,0),false,0) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment&) const { return true; } void con(Space& home, int glbMin, int glbMax, int lubMin, int lubMax, unsigned int minCard = 0, unsigned int maxCard = Gecode::Set::Limits::card, bool fail=true) { bool ok = false; try { SetVar x(home, glbMin, glbMax, lubMin, lubMax, minCard, maxCard); ok = true; } catch (Gecode::Set::VariableEmptyDomain&) { if (!fail) { home.fail(); return; } ok = true; } if (ok) { try { SetVarArray xs(home, 1, glbMin, glbMax, lubMin, lubMax, minCard, maxCard); } catch (Gecode::Set::VariableEmptyDomain&) { if (!fail) { home.fail(); return; } else { return; } } if (fail) { home.fail(); } } } void con(Space& home, const IntSet& glb, int lubMin, int lubMax, unsigned int minCard = 0, unsigned int maxCard = Gecode::Set::Limits::card, bool fail=true) { bool ok = false; try { SetVar x(home, glb, lubMin, lubMax, minCard, maxCard); ok = true; } catch (Gecode::Set::VariableEmptyDomain&) { if (!fail) { home.fail(); return; } ok = true; } if (ok) { try { SetVarArray xs(home, 1, glb, lubMin, lubMax, minCard, maxCard); } catch (Gecode::Set::VariableEmptyDomain&) { if (!fail) { home.fail(); return; } else { return; } } if (fail) { home.fail(); } } } void con(Space& home, int glbMin, int glbMax, const IntSet& lub, unsigned int minCard = 0, unsigned int maxCard = Gecode::Set::Limits::card, bool fail=true) { bool ok = false; try { SetVar x(home, glbMin, glbMax, lub, minCard, maxCard); ok = true; } catch (Gecode::Set::VariableEmptyDomain&) { if (!fail) { home.fail(); return; } ok = true; } if (ok) { try { SetVarArray xs(home, 1, glbMin, glbMax, lub, minCard, maxCard); } catch (Gecode::Set::VariableEmptyDomain&) { if (!fail) { home.fail(); return; } else { return; } } if (fail) { home.fail(); } } } void con(Space& home, const IntSet& glb, const IntSet& lub, unsigned int minCard = 0, unsigned int maxCard = Gecode::Set::Limits::card, bool fail=true) { bool ok = false; try { SetVar x(home, glb, lub, minCard, maxCard); ok = true; } catch (Gecode::Set::VariableEmptyDomain&) { if (!fail) { home.fail(); return; } ok = true; } if (ok) { try { SetVarArray xs(home, 1, glb, lub, minCard, maxCard); } catch (Gecode::Set::VariableEmptyDomain&) { if (!fail) { home.fail(); return; } else { return; } } if (fail) { home.fail(); } } } /// Post constraint on \a x virtual void post(Space& home, SetVarArray&, IntVarArray&) { // Check non-empty lower, empty upper bound con(home, 1,1, 1,0); con(home, IntSet(1,1), 1,0); con(home, 1,1, IntSet(1,0)); con(home, IntSet(1,1), IntSet(1,0)); // Check min cardinality con(home, 1,0, 1,1, 2,3); con(home, IntSet(1,0), 1,1, 2,3); con(home, 1,0, IntSet(1,1), 2,3); con(home, IntSet(1,0), IntSet(1,1), 2,3); // Check max cardinality con(home, 1,3, 1,4, 0,2); con(home, IntSet(1,3), 1,4, 0,2); con(home, 1,3, IntSet(1,4), 0,2); con(home, IntSet(1,3), IntSet(1,4), 0,2); // Check non-subset bounds con(home, 1,3, 2,4); con(home, IntSet(1,3), 2,4); con(home, 1,3, IntSet(2,4)); con(home, IntSet(1,3), IntSet(2,4)); con(home, 1,4, 1,3); con(home, IntSet(1,4), 1,3); con(home, 1,4, IntSet(1,3)); con(home, IntSet(1,4), IntSet(1,3)); con(home, IntSet::empty, 2, 4, 0, 10, false); } }; Construct _con; }}} // STATISTICS: test-set gecode-4.2.1/test/set/convex.cpp0000644000175000010010000001022711357330563015651 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * * Copyright: * Guido Tack, 2005 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ by $Author: schulte $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/set.hh" using namespace Gecode; namespace Test { namespace Set { /// %Tests for convexity constraints namespace Convex { /** * \defgroup TaskTestSetConvex Convexity constraints * \ingroup TaskTestSet */ //@{ static IntSet ds_33(-4,4); /// %Test for convexity propagator class Convex : public SetTest { public: /// Create and register test Convex(const char* t) : SetTest(t,1,ds_33,false) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { CountableSetRanges xr0(x.lub, x[0]); if (!xr0()) return true; ++xr0; if (!xr0()) return true; return false; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray&) { Gecode::convex(home, x[0]); } }; Convex _convex("Convex::Convex"); /// %Test for convex hull propagator class ConvexHull : public SetTest { public: /// Create and register test ConvexHull(const char* t) : SetTest(t,2,ds_33,false) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { CountableSetRanges xr0(x.lub, x[0]); CountableSetRanges xr1(x.lub, x[1]); if (!xr0()) return !xr1(); int x0min = xr0.min(); int x0max = xr0.max(); ++xr0; if (!xr0()) { if (!xr1()) return false; if (x0min != xr1.min()) return false; int x1max = Gecode::Set::Limits::min; while (xr1()) { x1max = xr1.max(); ++xr1;} if (x0max != x1max) return false; return true; } return false; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray&) { Gecode::convex(home, x[1], x[0]); } }; ConvexHull _convexhull("Convex::ConvexHull"); /// Sharing test for convex hull propagator class ConvexHullS : public SetTest { public: /// Create and register test ConvexHullS(const char* t) : SetTest(t,1,ds_33,false) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { CountableSetRanges xr0(x.lub, x[0]); if (!xr0()) return true; ++xr0; if (!xr0()) return true; return false; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray&) { Gecode::convex(home, x[0], x[0]); } }; ConvexHullS _convexhulls("Convex::Sharing::ConvexHullS"); //@} }}} // STATISTICS: test-set gecode-4.2.1/test/set/distinct.cpp0000644000175000010010000000746711357330563016204 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * * Copyright: * Guido Tack, 2005 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ by $Author: schulte $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/set.hh" using namespace Gecode; namespace Test { namespace Set { /// %Tests for distinctness constraints namespace Distinct { /** * \defgroup TaskTestSetDistinct Distinctness constraints * \ingroup TaskTestSet */ //@{ static IntSet ds_33(-2,2); static IntSet ds_44(-4,4); /// %Test for the atmostone propagator class AtmostOne : public SetTest { public: /// Create and register test AtmostOne(const char* t) : SetTest(t,3,ds_33,false) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { { CountableSetRanges xr0(x.lub, x[0]); CountableSetRanges xr1(x.lub, x[1]); Iter::Ranges::Inter i(xr0,xr1); if (Iter::Ranges::size(i)>1) return false; } { CountableSetRanges xr0(x.lub, x[0]); CountableSetRanges xr2(x.lub, x[2]); Iter::Ranges::Inter i(xr0,xr2); if (Iter::Ranges::size(i)>1) return false; } { CountableSetRanges xr1(x.lub, x[1]); CountableSetRanges xr2(x.lub, x[2]); Iter::Ranges::Inter i(xr1,xr2); if (Iter::Ranges::size(i)>1) return false; } { CountableSetRanges xr0(x.lub, x[0]); CountableSetRanges xr1(x.lub, x[1]); CountableSetRanges xr2(x.lub, x[2]); if (Iter::Ranges::size(xr0)!=3 || Iter::Ranges::size(xr1)!=3 || Iter::Ranges::size(xr2)!=3) return false; } return true; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray&) { SetVar s1(home, IntSet::empty, -2, 2, 0,1); Gecode::rel(home, x[0], SOT_INTER, x[1], SRT_EQ, s1); SetVar s2(home, IntSet::empty, -2, 2, 0,1); Gecode::rel(home, x[0], SOT_INTER, x[2], SRT_EQ, s2); SetVar s3(home, IntSet::empty, -2, 2, 0,1); Gecode::rel(home, x[1], SOT_INTER, x[2], SRT_EQ, s3); Gecode::atmostOne(home, x, 3); } }; AtmostOne _atmostone("Distinct::AtmostOne"); //@} }}} // STATISTICS: test-set gecode-4.2.1/test/set/dom.cpp0000644000175000010010000004154112113425036015120 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * * Copyright: * Guido Tack, 2005 * * Last modified: * $Date: 2013-02-27 16:45:34 +0100 (Wed, 27 Feb 2013) $ by $Author: schulte $ * $Revision: 13424 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/set.hh" using namespace Gecode; namespace Test { namespace Set { /// %Tests for domain constraints namespace Dom { /** * \defgroup TaskTestSetDom Domain constraints * \ingroup TaskTestSet */ //@{ static const int d1r[4][2] = { {-4,-3},{-1,-1},{1,1},{3,5} }; static IntSet d1(d1r,4); static const int d1cr[5][2] = { {Gecode::Set::Limits::min,-5}, {-2,-2},{0,0},{2,2}, {6,Gecode::Set::Limits::max} }; static IntSet d1c(d1cr,5); static IntSet ds_33(-3,3); static const int d2r[2][2] = { {Gecode::Set::Limits::min,-4}, {4,Gecode::Set::Limits::max} }; static IntSet ds_33c(d2r,2); namespace { static int minSymDiff(const SetAssignment& x, int i, const IntSet& is) { typedef Iter::Ranges::Diff DiffA; CountableSetRanges xr00(x.lub, x[i]); IntSetRanges xr10(is); DiffA a(xr00,xr10); typedef Iter::Ranges::Diff DiffB; CountableSetRanges xr01(x.lub, x[i]); IntSetRanges xr11(is); DiffB b(xr11,xr01); Iter::Ranges::Union u(a,b); return u() ? u.min() : Gecode::Set::Limits::max+1; } template static bool in(int i, I& c, bool eq=false) { if (eq && i==Gecode::Set::Limits::max+1) return true; Iter::Ranges::Singleton s(i,i); return Iter::Ranges::subset(s,c); } } /// %Test for equality with a range class DomRange : public SetTest { private: Gecode::SetRelType srt; IntSet is; public: /// Create and register test DomRange(SetRelType srt0, int n) : SetTest("Dom::Range::"+str(srt0)+"::"+str(n),n,ds_33,(n == 1)), srt(srt0), is(srt == Gecode::SRT_CMPL ? ds_33c: ds_33) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { for (int i=x.size(); i--; ) { CountableSetRanges xr(x.lub, x[i]); IntSetRanges dr(is); switch (srt) { case SRT_EQ: if (!Iter::Ranges::equal(xr, dr)) return false; break; case SRT_LQ: if (!((!xr()) || in(minSymDiff(x,i,is),dr,true))) return false; break; case SRT_LE: if (!(xr() ? in(minSymDiff(x,i,is),dr) : dr())) return false; break; case SRT_GQ: if (!((!dr()) || in(minSymDiff(x,i,is),xr,true))) return false; break; case SRT_GR: if (!(dr() ? in(minSymDiff(x,i,is),xr) : xr())) return false; break; case SRT_NQ: if (Iter::Ranges::equal(xr, dr)) return false; break; case SRT_SUB: if (!Iter::Ranges::subset(xr, dr)) return false; break; case SRT_SUP: if (!Iter::Ranges::subset(dr, xr)) return false; break; case SRT_DISJ: { Gecode::Iter::Ranges::Inter inter(xr, dr); if (inter()) return false; } break; case SRT_CMPL: { Gecode::Set::RangesCompl drc(dr); if (!Iter::Ranges::equal(xr,drc)) return false; } break; } } return true; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray&) { if (x.size() == 1) Gecode::dom(home, x[0], srt, is); else Gecode::dom(home, x, srt, is); } /// Post reified constraint on \a x for \a b virtual void post(Space& home, SetVarArray& x, IntVarArray&, Reify r) { assert(x.size() == 1); Gecode::dom(home, x[0], srt, is, r); } }; /// %Test for equality with an integer range class DomIntRange : public SetTest { private: Gecode::SetRelType srt; public: /// Create and register test DomIntRange(Gecode::SetRelType srt0, int n) : SetTest("Dom::IntRange::"+str(srt0)+"::"+str(n),1,ds_33,n==1), srt(srt0) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { for (int i=x.size(); i--; ) { CountableSetRanges xr(x.lub, x[i]); IntSet is(-3,-1); IntSetRanges dr(is); switch (srt) { case SRT_EQ: if (!Iter::Ranges::equal(xr, dr)) return false; break; case SRT_LQ: if (!((!xr()) || in(minSymDiff(x,i,is),dr,true))) return false; break; case SRT_LE: if (!(xr() ? in(minSymDiff(x,i,is),dr) : dr())) return false; break; case SRT_GQ: if (!((!dr()) || in(minSymDiff(x,i,is),xr,true))) return false; break; case SRT_GR: if (!(dr() ? in(minSymDiff(x,i,is),xr) : xr())) return false; break; case SRT_NQ: if (!(!Iter::Ranges::equal(xr, dr))) return false; break; case SRT_SUB: if (!(Iter::Ranges::subset(xr, dr))) return false; break; case SRT_SUP: if (!(Iter::Ranges::subset(dr, xr))) return false; break; case SRT_DISJ: { Gecode::Iter::Ranges::Inter inter(xr, dr); if (inter()) return false; } break; case SRT_CMPL: { Gecode::Set::RangesCompl drc(dr); if (!Iter::Ranges::equal(xr,drc)) return false; } break; } } return true; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray&) { if (x.size() == 1) Gecode::dom(home, x[0], srt, -3, -1); else Gecode::dom(home, x, srt, -3, -1); } /// Post reified constraint on \a x for \a b virtual void post(Space& home, SetVarArray& x, IntVarArray&, Reify r) { assert(x.size() == 1); Gecode::dom(home, x[0], srt, -3, -1, r); } }; /// %Test for equality with an integer class DomInt : public SetTest { private: Gecode::SetRelType srt; public: /// Create and register test DomInt(Gecode::SetRelType srt0, int n) : SetTest("Dom::Int::"+str(srt0)+"::"+str(n),n,ds_33,n==1), srt(srt0) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { IntSet is(-3,-3); for (int i=x.size(); i--; ) { CountableSetRanges xr(x.lub, x[i]); IntSetRanges dr(is); switch (srt) { case SRT_EQ: if (!Iter::Ranges::equal(xr, dr)) return false; break; case SRT_LQ: if (!((!xr()) || in(minSymDiff(x,i,is),dr,true))) return false; break; case SRT_LE: if (!(xr() ? in(minSymDiff(x,i,is),dr) : dr())) return false; break; case SRT_GQ: if (!((!dr()) || in(minSymDiff(x,i,is),xr,true))) return false; break; case SRT_GR: if (!(dr() ? in(minSymDiff(x,i,is),xr) : xr())) return false; break; case SRT_NQ: if (Iter::Ranges::equal(xr, dr)) return false; break; case SRT_SUB: if (!(Iter::Ranges::subset(xr, dr))) return false; break; case SRT_SUP: if (!(Iter::Ranges::subset(dr, xr))) return false; break; case SRT_DISJ: { Gecode::Iter::Ranges::Inter inter(xr, dr); if (inter()) return false; break; } case SRT_CMPL: { Gecode::Set::RangesCompl drc(dr); if (!Iter::Ranges::equal(xr,drc)) return false; break; } } } return true; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray&) { if (x.size() == 1) Gecode::dom(home, x[0], srt, -3); else Gecode::dom(home, x, srt, -3); } /// Post reified constraint on \a x for \a b virtual void post(Space& home, SetVarArray& x, IntVarArray&, Reify r) { assert(x.size() == 1); Gecode::dom(home, x[0], srt, -3, r); } }; /// %Test for equality with a domain class DomDom : public SetTest { private: Gecode::SetRelType srt; Gecode::IntSet is; public: /// Create and register test DomDom(Gecode::SetRelType srt0, int n) : SetTest("Dom::Dom::"+str(srt0)+"::"+str(n),n,d1,(n == 1)), srt(srt0), is(srt == Gecode::SRT_CMPL ? d1c: d1) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { for (int i=x.size(); i--; ) { CountableSetRanges xr(x.lub, x[i]); IntSetRanges dr(is); switch (srt) { case SRT_EQ: if (!Iter::Ranges::equal(xr, dr)) return false; break; case SRT_LQ: if (!((!xr()) || in(minSymDiff(x,i,is),dr,true))) return false; break; case SRT_LE: if (!(xr() ? in(minSymDiff(x,i,is),dr) : dr())) return false; break; case SRT_GQ: if (!((!dr()) || in(minSymDiff(x,i,is),xr,true))) return false; break; case SRT_GR: if (!(dr() ? in(minSymDiff(x,i,is),xr) : xr())) return false; break; case SRT_NQ: if (Iter::Ranges::equal(xr, dr)) return false; break; case SRT_SUB: if (!Iter::Ranges::subset(xr, dr)) return false; break; case SRT_SUP: if (!Iter::Ranges::subset(dr, xr)) return false; break; case SRT_DISJ: { Gecode::Iter::Ranges::Inter inter(xr, dr); if (inter()) return false; } break; case SRT_CMPL: { Gecode::Set::RangesCompl drc(dr); if (!Iter::Ranges::equal(xr,drc)) return false; } break; } } return true; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray&) { if (x.size() == 1) Gecode::dom(home, x[0], srt, is); else Gecode::dom(home, x, srt, is); } /// Post reified constraint on \a x for \a b virtual void post(Space& home, SetVarArray& x, IntVarArray&, Reify r) { assert(x.size() == 1); Gecode::dom(home, x[0], srt, is, r); } }; /// %Test for cardinality range class CardRange : public SetTest { public: /// Create and register test CardRange(int n) : SetTest("Dom::CardRange::"+str(n),n,d1,false) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { for (int i=x.size(); i--; ) { CountableSetRanges xr(x.lub, x[i]); unsigned int card = Iter::Ranges::size(xr); if ((card < 2) || (card > 3)) return false; } return true; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray&) { if (x.size() == 1) Gecode::cardinality(home, x[0], 2, 3); else Gecode::cardinality(home, x, 2, 3); } }; DomRange _domrange_eq1(SRT_EQ,1); DomRange _domrange_lq1(SRT_LQ,1); DomRange _domrange_le1(SRT_LE,1); DomRange _domrange_gq1(SRT_GQ,1); DomRange _domrange_gr1(SRT_GR,1); DomRange _domrange_nq1(SRT_NQ,1); DomRange _domrange_sub1(SRT_SUB,1); DomRange _domrange_sup1(SRT_SUP,1); DomRange _domrange_disj1(SRT_DISJ,1); DomRange _domrange_cmpl1(SRT_CMPL,1); DomRange _domrange_eq2(SRT_EQ,2); DomRange _domrange_lq2(SRT_LQ,2); DomRange _domrange_le2(SRT_LE,2); DomRange _domrange_gq2(SRT_GQ,2); DomRange _domrange_gr2(SRT_GR,2); DomRange _domrange_nq2(SRT_NQ,2); DomRange _domrange_sub2(SRT_SUB,2); DomRange _domrange_sup2(SRT_SUP,2); DomRange _domrange_disj2(SRT_DISJ,2); DomRange _domrange_cmpl2(SRT_CMPL,2); DomIntRange _domintrange_eq1(SRT_EQ,1); DomIntRange _domintrange_lq1(SRT_LQ,1); DomIntRange _domintrange_le1(SRT_LE,1); DomIntRange _domintrange_gq1(SRT_GQ,1); DomIntRange _domintrange_gr1(SRT_GR,1); DomIntRange _domintrange_nq1(SRT_NQ,1); DomIntRange _domintrange_sub1(SRT_SUB,1); DomIntRange _domintrange_sup1(SRT_SUP,1); DomIntRange _domintrange_disj1(SRT_DISJ,1); DomIntRange _domintrange_cmpl1(SRT_CMPL,1); DomIntRange _domintrange_eq2(SRT_EQ,2); DomIntRange _domintrange_lq2(SRT_LQ,2); DomIntRange _domintrange_le2(SRT_LE,2); DomIntRange _domintrange_gq2(SRT_GQ,2); DomIntRange _domintrange_gr2(SRT_GR,2); DomIntRange _domintrange_nq2(SRT_NQ,2); DomIntRange _domintrange_sub2(SRT_SUB,2); DomIntRange _domintrange_sup2(SRT_SUP,2); DomIntRange _domintrange_disj2(SRT_DISJ,2); DomIntRange _domintrange_cmpl2(SRT_CMPL,2); DomInt _domint_eq1(SRT_EQ,1); DomInt _domint_lq1(SRT_LQ,1); DomInt _domint_le1(SRT_LE,1); DomInt _domint_gq1(SRT_GQ,1); DomInt _domint_gr1(SRT_GR,1); DomInt _domint_nq1(SRT_NQ,1); DomInt _domint_sub1(SRT_SUB,1); DomInt _domint_sup1(SRT_SUP,1); DomInt _domint_disj1(SRT_DISJ,1); DomInt _domint_cmpl1(SRT_CMPL,1); DomInt _domint_eq2(SRT_EQ,2); DomInt _domint_lq2(SRT_LQ,2); DomInt _domint_le2(SRT_LE,2); DomInt _domint_gq2(SRT_GQ,2); DomInt _domint_gr2(SRT_GR,2); DomInt _domint_nq2(SRT_NQ,2); DomInt _domint_sub2(SRT_SUB,2); DomInt _domint_sup2(SRT_SUP,2); DomInt _domint_disj2(SRT_DISJ,2); DomInt _domint_cmpl2(SRT_CMPL,2); DomDom _domdom_eq1(SRT_EQ,1); DomDom _domdom_lq1(SRT_LQ,1); DomDom _domdom_le1(SRT_LE,1); DomDom _domdom_gq1(SRT_GQ,1); DomDom _domdom_gr1(SRT_GR,1); DomDom _domdom_nq1(SRT_NQ,1); DomDom _domdom_sub1(SRT_SUB,1); DomDom _domdom_sup1(SRT_SUP,1); DomDom _domdom_disj1(SRT_DISJ,1); DomDom _domdom_cmpl1(SRT_CMPL,1); DomDom _domdom_eq2(SRT_EQ,2); DomDom _domdom_lq2(SRT_LQ,2); DomDom _domdom_le2(SRT_LE,2); DomDom _domdom_gq2(SRT_GQ,2); DomDom _domdom_gr2(SRT_GR,2); DomDom _domdom_nq2(SRT_NQ,2); DomDom _domdom_sub2(SRT_SUB,2); DomDom _domdom_sup2(SRT_SUP,2); DomDom _domdom_disj2(SRT_DISJ,2); DomDom _domdom_cmpl2(SRT_CMPL,2); CardRange _cr1(1); CardRange _cr2(2); }}} // STATISTICS: test-set gecode-4.2.1/test/set/element.cpp0000644000175000010010000003166112022411512015765 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * * Copyright: * Guido Tack, 2005 * * Last modified: * $Date: 2012-09-07 17:31:22 +0200 (Fri, 07 Sep 2012) $ by $Author: schulte $ * $Revision: 13068 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include "test/set.hh" using namespace Gecode; namespace Test { namespace Set { /// %Tests for set element constraints namespace Element { /** * \defgroup TaskTestSetElement Element constraints * \ingroup TaskTestSet */ //@{ static IntSet ds_12(-1,2); static IntSet ds_13(-1,3); /// %Test for %ElementUnion constraint class ElementUnion : public SetTest { public: /// Create and register test ElementUnion(const char* t) : SetTest(t,5,ds_12,false) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { int selected = 0; for (CountableSetValues sel2(x.lub, x[3]); sel2(); ++sel2, selected++) {} CountableSetValues x4v(x.lub, x[4]); if (selected==0) return !x4v(); CountableSetRanges* sel = new CountableSetRanges[selected]; CountableSetValues selector(x.lub, x[3]); for (int i=selected; i--;++selector) { if (selector.val()>=3 || selector.val()<0) { delete[] sel; return false; } sel[i].init(x.lub, x[selector.val()]); } FakeSpace* fs = new FakeSpace; bool ret; { Region r(*fs); Iter::Ranges::NaryUnion u(r, sel, selected); CountableSetRanges z(x.lub, x[4]); ret = Iter::Ranges::equal(u, z); } delete[] sel; delete fs; return ret; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray&) { SetVarArgs xs(x.size()-2); for (int i=x.size()-2; i--;) xs[i]=x[i]; Gecode::element(home, SOT_UNION, xs, x[x.size()-2], x[x.size()-1]); } }; ElementUnion _elementunion("Element::Union"); /// %Test for %ElementUnionConst constraint class ElementUnionConst : public SetTest { private: const IntSet i0; const IntSet i1; const IntSet i2; public: /// Create and register test ElementUnionConst(const char* t) : SetTest(t,2,ds_13,false), i0(-3,-3), i1(-1,1), i2(0,2) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { int selected = 0; for (CountableSetValues sel2(x.lub, x[0]); sel2(); ++sel2, selected++) {} CountableSetValues x4v(x.lub, x[1]); if (selected==0) return !x4v(); IntSet iss[] = {i0, i1, i2}; IntSetRanges* sel = new IntSetRanges[selected]; CountableSetValues selector(x.lub, x[0]); for (int i=selected; i--;++selector) { if (selector.val()>=3 || selector.val()<0) { delete[] sel; return false; } sel[i].init(iss[selector.val()]); } FakeSpace* fs = new FakeSpace; bool ret; { Region r(*fs); Iter::Ranges::NaryUnion u(r, sel, selected); CountableSetRanges z(x.lub, x[1]); ret = Iter::Ranges::equal(u, z); } delete[] sel; delete fs; return ret; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray&) { IntSetArgs xs(3); xs[0] = i0; xs[1] = i1; xs[2] = i2; Gecode::element(home, SOT_UNION, xs, x[0], x[1]); } }; ElementUnionConst _elementunionconst("Element::UnionConst"); /// %Test for %ElementInter constraint class ElementInter : public SetTest { public: /// Create and register test ElementInter(const char* t) : SetTest(t,5,ds_12,false) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { int selected = 0; for (CountableSetValues sel2(x.lub, x[3]); sel2(); ++sel2, selected++) {} CountableSetRanges x4r(x.lub, x[4]); if (selected==0) return Iter::Ranges::size(x4r)==Gecode::Set::Limits::card; CountableSetRanges* sel = new CountableSetRanges[selected]; CountableSetValues selector(x.lub, x[3]); for (int i=selected; i--;++selector) { if (selector.val()>=3 || selector.val()<0) { delete[] sel; return false; } sel[i].init(x.lub, x[selector.val()]); } FakeSpace* fs = new FakeSpace; bool ret; { Region r(*fs); Iter::Ranges::NaryInter u(r, sel, selected); CountableSetRanges z(x.lub, x[4]); ret = Iter::Ranges::equal(u, z); } delete fs; delete [] sel; return ret; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray&) { SetVarArgs xs(x.size()-2); for (int i=x.size()-2; i--;) xs[i]=x[i]; Gecode::element(home, SOT_INTER, xs, x[x.size()-2], x[x.size()-1]); } }; ElementInter _elementinter("Element::Inter"); /// %Test for %ElementInter constraint class ElementInterIn : public SetTest { public: /// Create and register test ElementInterIn(const char* t) : SetTest(t,5,ds_12,false) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { int selected = 0; for (CountableSetValues sel2(x.lub, x[3]); sel2(); ++sel2, selected++) {} CountableSetRanges x4r(x.lub, x[4]); if (selected==0) return Iter::Ranges::size(x4r)==4; CountableSetRanges* sel = new CountableSetRanges[selected]; CountableSetValues selector(x.lub, x[3]); for (int i=selected; i--;++selector) { if (selector.val()>=3 || selector.val()<0) { delete[] sel; return false; } sel[i].init(x.lub, x[selector.val()]); } FakeSpace* fs = new FakeSpace; bool ret; { Region r(*fs); Iter::Ranges::NaryInter u(r,sel, selected); CountableSetRanges z(x.lub, x[4]); ret = Iter::Ranges::equal(u, z); } delete fs; delete [] sel; return ret; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray&) { SetVarArgs xs(x.size()-2); for (int i=x.size()-2; i--;) xs[i]=x[i]; Gecode::element(home, SOT_INTER, xs, x[x.size()-2], x[x.size()-1], ds_12); } }; ElementInterIn _elementinterin("Element::InterIn"); /// %Test for %ElementDisjoint constraint class ElementDisjoint : public SetTest { public: /// Create and register test ElementDisjoint(const char* t) : SetTest(t,5,ds_12,false) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { int selected = 0; for (CountableSetValues sel2(x.lub, x[3]); sel2(); ++sel2, selected++) { if (sel2.val() < 0) return false; } CountableSetValues x4v(x.lub, x[4]); if (selected == 0) return !x4v(); CountableSetRanges* sel = new CountableSetRanges[selected]; CountableSetValues selector(x.lub, x[3]); unsigned int cardsum = 0; for (int i=selected; i--;++selector) { if (selector.val()>=3 || selector.val()<0) { delete[] sel; return false; } sel[i].init(x.lub, x[selector.val()]); CountableSetRanges xicard(x.lub, x[selector.val()]); cardsum += Iter::Ranges::size(xicard); } bool ret; FakeSpace* fs = new FakeSpace; { Region r(*fs); Iter::Ranges::NaryUnion u(r, sel, selected); ret = Iter::Ranges::size(u) == cardsum; u.reset(); CountableSetRanges z(x.lub, x[4]); ret &= Iter::Ranges::equal(u, z); } delete fs; delete[] sel; return ret; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray&) { SetVarArgs xs(x.size()-2); for (int i=x.size()-2; i--;) xs[i]=x[i]; Gecode::element(home, SOT_DUNION, xs, x[x.size()-2], x[x.size()-1]); } }; ElementDisjoint _elementdisjoint("Element::Disjoint"); /// %Test for %ElementSet constraint class ElementSet : public SetTest { public: /// Create and register test ElementSet(const char* t) : SetTest(t,4,ds_12,false,true) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { if (x.intval() < 0 || x.intval() > 2) return false; CountableSetRanges z(x.lub, x[3]); CountableSetRanges y(x.lub, x[x.intval()]); return Iter::Ranges::equal(y, z); } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray& y) { SetVarArgs xs(x.size()-1); for (int i=x.size()-1; i--;) xs[i]=x[i]; Gecode::element(home, xs, y[0], x[x.size()-1]); } }; ElementSet _elementset("Element::Set"); /// %Test for %ElementSetConst constraint class ElementSetConst : public SetTest { private: const IntSet i0; const IntSet i1; const IntSet i2; public: /// Create and register test ElementSetConst(const char* t) : SetTest(t,1,ds_13,false,true), i0(-3,-3), i1(-1,1), i2(0,2) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { if (x.intval() < 0 || x.intval() > 2) return false; CountableSetRanges xr(x.lub, x[0]); IntSet iss[] = {i0, i1, i2}; IntSetRanges isr(iss[x.intval()]); return Iter::Ranges::equal(xr, isr); } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray& y) { IntSetArgs xs(3); xs[0] = i0; xs[1] = i1; xs[2] = i2; Gecode::element(home, xs, y[0], x[0]); } }; ElementSetConst _elementsetconst("Element::SetConst"); /// %Test for matrix element with integer set array and set variable class MatrixIntSet : public SetTest { protected: /// Array for test matrix Gecode::IntSetArgs tm; public: /// Create and register test MatrixIntSet(void) : SetTest("Element::Matrix::IntSet",1,IntSet(0,3),false,2), tm(4) { tm[0]=IntSet(0,0); tm[1]=IntSet(1,1); tm[2]=IntSet(2,2); tm[3]=IntSet(3,3); } /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { // Get integer assignment const Int::Assignment& y = x.ints(); // x-coordinate: y[0], y-coordinate: y[1], result: x[0] using namespace Gecode; if ((y[0] > 1) || (y[1] > 1)) return false; Matrix m(tm,2,2); IntSetRanges a(m(y[0],y[1])); CountableSetRanges b(x.lub, x[0]); return Iter::Ranges::equal(a,b); } /// Post constraint on \a x and \a y virtual void post(Gecode::Space& home, Gecode::SetVarArray& x, Gecode::IntVarArray& y) { // x-coordinate: x[0], y-coordinate: x[1], result: x[2] using namespace Gecode; Matrix m(tm,2,2); element(home, m, y[0], y[1], x[0]); } }; MatrixIntSet _emis; //@} }}} // STATISTICS: test-set gecode-4.2.1/test/set/exec.cpp0000644000175000010010000000530711357330563015276 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2009 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ by $Author: schulte $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/set.hh" namespace Test { namespace Set { /// %Tests for synchronized execution namespace Exec { /** * \defgroup TaskTestSetExec Synchronized execution * \ingroup TaskTestSet */ //@{ /// Simple test for wait (set variables) class Wait : public SetTest { public: /// Create and register test Wait(int n) : SetTest("Wait::"+str(n),n,Gecode::IntSet(0,n),false) {} /// Check whether \a x is solution virtual bool solution(const SetAssignment& x) const { (void) x; return true; } /// Post wait on \a x virtual void post(Gecode::Space& home, Gecode::SetVarArray& x, Gecode::IntVarArray&) { if (x.size() > 1) Gecode::wait(home, x, &c); else Gecode::wait(home, x[0], &c); } /// Continuation to be executed static void c(Gecode::Space& _home) { SetTestSpace& home = static_cast(_home); for (int i=0; i * * Copyright: * Guido Tack, 2005 * * Last modified: * $Date: 2012-10-19 05:58:26 +0200 (Fri, 19 Oct 2012) $ by $Author: tack $ * $Revision: 13156 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/set.hh" #include "test/int.hh" #include using namespace Gecode; namespace Test { namespace Set { /// %Tests for combined int/set constraints namespace Int { /** * \defgroup TaskTestSetInt Combined integer/set constraints * \ingroup TaskTestSet */ //@{ static const int d1r[4][2] = { {-4,-3},{-1,-1},{1,1},{3,5} }; static IntSet d1(d1r,4); static IntSet d2(-1,3); static IntSet d3(0,3); static IntSet d4(0,4); static IntSet ds_33(-3,3); /// %Test for cardinality constraint class Card : public SetTest { public: /// Create and register test Card(const char* t) : SetTest(t,1,ds_33,false,1) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { unsigned int s = 0; for (CountableSetRanges xr(x.lub, x[0]);xr();++xr) s+= xr.width(); if (x.intval() < 0) return false; return s==(unsigned int)x.intval(); } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray& y) { Gecode::cardinality(home, x[0], y[0]); } }; Card _card("Int::Card"); /// %Test for minimal element constraint class Min : public SetTest { public: /// Create and register test Min(const char* t) : SetTest(t,1,ds_33,true,1) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { CountableSetRanges xr0(x.lub, x[0]); return xr0() && xr0.min()==x.intval(); } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray& y) { Gecode::min(home, x[0], y[0]); } /// Post reified constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray& y, Reify r) { Gecode::min(home, x[0], y[0], r); } }; Min _min("Int::Min"); /// %Test for negated minimal element constraint class NotMin : public SetTest { public: /// Create and register test NotMin(const char* t) : SetTest(t,1,ds_33,false,1) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { CountableSetRanges xr0(x.lub, x[0]); return !(xr0() && xr0.min()==x.intval()); } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray& y) { Gecode::notMin(home, x[0], y[0]); } }; NotMin _notmin("Int::NotMin"); /// %Test for maximal element constraint class Max : public SetTest { public: /// Create and register test Max(const char* t) : SetTest(t,1,ds_33,true,1) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { CountableSetRanges xr0(x.lub, x[0]); IntSet x0(xr0); return x0.ranges() > 0 && x0.max()==x.intval(); } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray& y) { Gecode::max(home, x[0], y[0]); } /// Post reified constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray& y, Reify r) { Gecode::max(home, x[0], y[0], r); } }; Max _max("Int::Max"); /// %Test for negated maximal element constraint class NotMax : public SetTest { public: /// Create and register test NotMax(const char* t) : SetTest(t,1,ds_33,false,1) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { CountableSetRanges xr0(x.lub, x[0]); IntSet x0(xr0); return !(x0.ranges() > 0 && x0.max()==x.intval()); } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray& y) { Gecode::notMax(home, x[0], y[0]); } }; NotMax _notmax("Int::NotMax"); /// %Test for element constraint class Elem : public SetTest { public: /// Create and register test Elem(const char* t) : SetTest(t,1,ds_33,true,1) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { for (CountableSetValues xr(x.lub, x[0]);xr();++xr) if (xr.val()==x.intval()) return true; return false; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray& y) { Gecode::rel(home, x[0], SRT_SUP, y[0]); } /// Post reified constraint on \a x for \a b virtual void post(Space& home, SetVarArray& x, IntVarArray& y, Reify r) { Gecode::rel(home, x[0], SRT_SUP, y[0], r); } }; Elem _elem("Int::Elem"); /// %Test for negated element constraint class NoElem : public SetTest { public: /// Create and register test NoElem(const char* t) : SetTest(t,1,ds_33,false,1) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { for (CountableSetValues xr(x.lub, x[0]);xr();++xr) if (xr.val()==x.intval()) return false; return true; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray& y) { Gecode::rel(home, x[0], SRT_DISJ, y[0]); } }; NoElem _noelem("Int::NoElem"); /// %Test for relation constraint class Rel : public SetTest { private: Gecode::SetRelType srt; bool inverse; public: /// Create and register test Rel(Gecode::SetRelType srt0, bool inverse0) : SetTest("Int::Rel::"+str(srt0)+(inverse0 ? "::i" : ""), 1,ds_33,true,1) , srt(srt0) , inverse(inverse0) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { CountableSetRanges xr(x.lub, x[0]); IntSet is(x.intval(), x.intval()); IntSetRanges dr(is); Gecode::SetRelType rsrt = srt; if (inverse) { switch (srt) { case SRT_SUB: rsrt = SRT_SUP; break; case SRT_SUP: rsrt = SRT_SUB; break; default: break; } } switch (rsrt) { case SRT_EQ: return Iter::Ranges::equal(xr, dr); case SRT_NQ: return !Iter::Ranges::equal(xr, dr); case SRT_SUB: return Iter::Ranges::subset(xr, dr); case SRT_SUP: return Iter::Ranges::subset(dr, xr); case SRT_DISJ: { Gecode::Iter::Ranges::Inter inter(xr, dr); return !inter(); } case SRT_CMPL: { Gecode::Set::RangesCompl drc(dr); return Iter::Ranges::equal(xr,drc); } } GECODE_NEVER; return false; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray& y) { if (!inverse) Gecode::rel(home, x[0], srt, y[0]); else Gecode::rel(home, y[0], srt, x[0]); } /// Post reified constraint on \a x for \a b virtual void post(Space& home, SetVarArray& x, IntVarArray& y, Reify r) { if (!inverse) Gecode::rel(home, x[0], srt, y[0], r); else Gecode::rel(home, y[0], srt, x[0], r); } }; Rel _rel_eq(Gecode::SRT_EQ,false); Rel _rel_nq(Gecode::SRT_NQ,false); Rel _rel_sub(Gecode::SRT_SUB,false); Rel _rel_sup(Gecode::SRT_SUP,false); Rel _rel_disj(Gecode::SRT_DISJ,false); Rel _rel_cmpl(Gecode::SRT_CMPL,false); Rel _rel_eqi(Gecode::SRT_EQ,true); Rel _rel_nqi(Gecode::SRT_NQ,true); Rel _rel_subi(Gecode::SRT_SUB,true); Rel _rel_supi(Gecode::SRT_SUP,true); Rel _rel_disji(Gecode::SRT_DISJ,true); Rel _rel_cmpli(Gecode::SRT_CMPL,true); /// %Test for integer relation constraint class IntRel : public SetTest { private: Gecode::IntRelType irt; bool inverse; public: /// Create and register test IntRel(Gecode::IntRelType irt0, bool inverse0) : SetTest("Int::IntRel::"+Test::Int::Test::str(irt0)+ (inverse0 ? "::i" : ""),1,ds_33,false,1) , irt(irt0) , inverse(inverse0) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { CountableSetValues xr(x.lub, x[0]); if (!xr()) return false; for (; xr(); ++xr) { switch (irt) { case Gecode::IRT_EQ: if (xr.val() != x.intval()) return false; break; case Gecode::IRT_NQ: if (xr.val() == x.intval()) return false; break; case Gecode::IRT_GR: if (!inverse && xr.val() <= x.intval()) return false; if (inverse && xr.val() >= x.intval()) return false; break; case Gecode::IRT_GQ: if (!inverse && xr.val() < x.intval()) return false; if (inverse && xr.val() > x.intval()) return false; break; case Gecode::IRT_LE: if (!inverse && xr.val() >= x.intval()) return false; if (inverse && xr.val() <= x.intval()) return false; break; case Gecode::IRT_LQ: if (!inverse && xr.val() > x.intval()) return false; if (inverse && xr.val() < x.intval()) return false; break; default: GECODE_NEVER; return false; } } return true; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray& y) { if (!inverse) Gecode::rel(home, x[0], irt, y[0]); else Gecode::rel(home, y[0], irt, x[0]); } }; IntRel _intrel_eq(Gecode::IRT_EQ,false); IntRel _intrel_nq(Gecode::IRT_NQ,false); IntRel _intrel_gr(Gecode::IRT_GR,false); IntRel _intrel_gq(Gecode::IRT_GQ,false); IntRel _intrel_le(Gecode::IRT_LE,false); IntRel _intrel_lq(Gecode::IRT_LQ,false); IntRel _intrel_eqi(Gecode::IRT_EQ,true); IntRel _intrel_nqi(Gecode::IRT_NQ,true); IntRel _intrel_gri(Gecode::IRT_GR,true); IntRel _intrel_gqi(Gecode::IRT_GQ,true); IntRel _intrel_lei(Gecode::IRT_LE,true); IntRel _intrel_lqi(Gecode::IRT_LQ,true); template int weightI(const IntArgs& elements, const IntArgs& weights, I& iter) { int sum = 0; int i = 0; for (Iter::Ranges::ToValues v(iter); v(); ++v) { // Skip all elements below the current while (elements[i]= minWeight && x.intval() <= maxWeight; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray& y) { Gecode::rel(home, minWeight <= y[0]); Gecode::rel(home, maxWeight >= y[0]); Gecode::weights(home, elements, weights, x[0], y[0]); } }; const int el1v[] = {-3,-2,-1,0,1,2,3}; IntArgs el1(7,el1v); const int w1v[] = {1,-2,1,1,1,6,1}; IntArgs w1(7,w1v); Weights _weights1("Int::Weights::1", el1, w1); const int w2v[] = {-1,-1,-1,10,-1,-1,-1}; IntArgs w2(7,w2v); Weights _weights2("Int::Weights::2", el1, w2); Weights _weights3("Int::Weights::3", el1, w2, 3); const int w4v[] = {1,1,0,0,0,0,0}; IntArgs w4(7,w4v); Weights _weights4("Int::Weights::4", el1, w4); }}} // STATISTICS: test-set gecode-4.2.1/test/set/mm-set.cpp0000755000175000010010000044763312040147742015566 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2008 * * Last modified: * $Date: 2012-10-19 05:58:26 +0200 (Fri, 19 Oct 2012) $ by $Author: tack $ * $Revision: 13156 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/int.hh" #include namespace Test { namespace Int { /// %Tests for minimal modelling constraints (%Set) namespace MiniModelSet { /// Set opcode enum SetOpcode { SO_CMPL, ///< Complement SO_UNION, ///< Union SO_DUNION, ///< Disjoint union SO_INTER, ///< Intersection SO_MINUS, ///< Difference SO_HLT ///< Stop execution }; /// Type for representing a set instruction class SetInstr { public: SetOpcode o; ///< Which instruction to execute unsigned char x, y, z; ///< Instruction arguments, \a z is destination (or \a y for complement) }; /// Executes set instruction for evaluation (checking) int eval(const SetInstr* pc, int reg[], bool& failed) { failed = false; while (true) { switch (pc->o) { case SO_CMPL: reg[pc->y] = !reg[pc->x]; break; case SO_INTER: reg[pc->z] = reg[pc->x] & reg[pc->y]; break; case SO_UNION: reg[pc->z] = reg[pc->x] | reg[pc->y]; break; case SO_DUNION: if (reg[pc->x] && reg[pc->y]) failed = true; reg[pc->z] = reg[pc->x] | reg[pc->y]; break; case SO_MINUS: reg[pc->z] = reg[pc->x] & (!reg[pc->y]); break; case SO_HLT: return reg[pc->x]; default: GECODE_NEVER; } pc++; } GECODE_NEVER; } /// Executes set instruction for constructing set expressions Gecode::SetExpr eval(const SetInstr* pc, Gecode::SetExpr reg[]) { using namespace Gecode; while (true) { switch (pc->o) { case SO_CMPL: reg[pc->y] = ((-reg[pc->x]) & singleton(1)); break; case SO_INTER: reg[pc->z] = (reg[pc->x] & reg[pc->y]); break; case SO_UNION: reg[pc->z] = (reg[pc->x] | reg[pc->y]); break; case SO_DUNION: reg[pc->z] = reg[pc->x] + reg[pc->y]; break; case SO_MINUS: reg[pc->z] = reg[pc->x] - reg[pc->y]; break; case SO_HLT: return reg[pc->x]; default: GECODE_NEVER; } pc++; } GECODE_NEVER; } bool simpleReifiedSemantics(const SetInstr* pc) { while (pc->o != SO_HLT) { if (pc->o == SO_DUNION) return false; pc++; } return true; } /** * \defgroup TaskTestSetMiniModelSet Minimal modelling constraints (%Set constraints) * \ingroup TaskTestSet */ //@{ /// %Test set expressions with constant result class SetExprConst : public Test { protected: /// %Set instruction sequence const SetInstr* bis; /// Result of expression int c; /// %Set relation Gecode::SetRelType srt; public: /// Create and register test SetExprConst(const SetInstr* bis0, const std::string& s, Gecode::SetRelType srt0, int c0) : Test("MiniModel::SetExpr::Const::"+s+"::"+str(srt0)+"::"+str(c0), 4,0,1,simpleReifiedSemantics(bis0)), bis(bis0), c(c0), srt(srt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int reg[4] = {(x[0] != x[2]), x[1], (x[2] > 0), x[3]}; bool failed; int ret = eval(bis, reg, failed); if (failed) return false; switch (srt) { case Gecode::SRT_EQ: return ret == c; case Gecode::SRT_NQ: return ret != c; case Gecode::SRT_SUB: return ret <= c; case Gecode::SRT_SUP: return ret >= c; case Gecode::SRT_DISJ: return ret+c != 2; case Gecode::SRT_CMPL: return ret != c; } GECODE_NEVER; return false; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; SetVarArgs s(home,4,IntSet::empty,1,1); Gecode::rel(home, (singleton(1) == s[0]) == (x[0] != x[2])); Gecode::rel(home, (singleton(1) == s[1]) == (x[1] == 1)); Gecode::rel(home, (singleton(1) == s[2]) == (x[2] > 0)); Gecode::rel(home, (singleton(1) == s[3]) == (x[3] == 1)); Gecode::SetExpr reg[4] = {s[0],s[1],s[2],s[3]}; Gecode::SetExpr res = (c==0) ? IntSet::empty : singleton(1); Gecode::SetExpr e = eval(bis,reg); switch (srt) { case Gecode::SRT_EQ: Gecode::rel(home, e == res); break; case Gecode::SRT_NQ: Gecode::rel(home, e != res); break; case Gecode::SRT_SUB: Gecode::rel(home, e <= res); break; case Gecode::SRT_SUP: Gecode::rel(home, e >= res); break; case Gecode::SRT_DISJ: Gecode::rel(home, e || res); break; case Gecode::SRT_CMPL: Gecode::rel(home, e == -res); break; } } /// Post reified constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { using namespace Gecode; SetVarArgs s(home,4,IntSet::empty,1,1); Gecode::rel(home, (singleton(1) == s[0]) == (x[0] != x[2])); Gecode::rel(home, (singleton(1) == s[1]) == (x[1] == 1)); Gecode::rel(home, (singleton(1) == s[2]) == (x[2] > 0)); Gecode::rel(home, (singleton(1) == s[3]) == (x[3] == 1)); Gecode::SetExpr reg[4] = {s[0],s[1],s[2],s[3]}; Gecode::SetExpr res = (c==0) ? IntSet::empty : singleton(1); Gecode::SetExpr e = eval(bis,reg); Gecode::SetRel irel; switch (srt) { case Gecode::SRT_EQ: irel = (e == res); break; case Gecode::SRT_NQ: irel = (e != res); break; case Gecode::SRT_SUB: irel = (e <= res); break; case Gecode::SRT_SUP: irel = (e >= res); break; case Gecode::SRT_DISJ: irel = (e || res); break; case Gecode::SRT_CMPL: irel = (e == -res); break; } switch (r.mode()) { case Gecode::RM_EQV: Gecode::rel(home, r.var()==irel); break; case Gecode::RM_IMP: Gecode::rel(home, r.var() >> irel); break; case Gecode::RM_PMI: Gecode::rel(home, r.var() << irel); break; } } }; /// %Test set expressions with expression result class SetExprExpr : public Test { protected: /// %First set instruction sequence const SetInstr* bis0; /// %Second set instruction sequence const SetInstr* bis1; /// %Set relation Gecode::SetRelType srt; public: /// Create and register test SetExprExpr(const SetInstr* bis00, const SetInstr* bis10, const std::string& s, Gecode::SetRelType srt0) : Test("MiniModel::SetExpr::Expr::"+s+"::"+str(srt0), 8,0,1, simpleReifiedSemantics(bis00) && simpleReifiedSemantics(bis10)), bis0(bis00), bis1(bis10), srt(srt0) {} /// %Test whether \a x is solution virtual bool solution(const Assignment& x) const { int reg0[4] = {(x[0] != x[2]), x[1], (x[2] > 0), x[3]}; bool failed0; int ret0 = eval(bis0, reg0, failed0); if (failed0) return false; int reg1[4] = {(x[4] != x[6]), x[5], (x[6] > 0), x[7]}; bool failed1; int ret1 = eval(bis1, reg1, failed1); if (failed1) return false; switch (srt) { case Gecode::SRT_EQ: return ret0 == ret1; case Gecode::SRT_NQ: return ret0 != ret1; case Gecode::SRT_SUB: return ret0 <= ret1; case Gecode::SRT_SUP: return ret0 >= ret1; case Gecode::SRT_DISJ: return ret0+ret1 != 2; case Gecode::SRT_CMPL: return ret0 != ret1; } GECODE_NEVER; return false; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x) { using namespace Gecode; SetVarArgs s(home,8,IntSet::empty,1,1); Gecode::rel(home, (singleton(1) == s[0]) == (x[0] != x[2])); Gecode::rel(home, (singleton(1) == s[1]) == (x[1] == 1)); Gecode::rel(home, (singleton(1) == s[2]) == (x[2] > 0)); Gecode::rel(home, (singleton(1) == s[3]) == (x[3] == 1)); Gecode::rel(home, (singleton(1) == s[4]) == (x[4] != x[6])); Gecode::rel(home, (singleton(1) == s[5]) == (x[5] == 1)); Gecode::rel(home, (singleton(1) == s[6]) == (x[6] > 0)); Gecode::rel(home, (singleton(1) == s[7]) == (x[7] == 1)); Gecode::SetExpr reg0[4] = {s[0],s[1],s[2],s[3]}; Gecode::SetExpr e0 = eval(bis0,reg0); Gecode::SetExpr reg1[4] = {s[4],s[5],s[6],s[7]}; Gecode::SetExpr e1 = eval(bis1,reg1); switch (srt) { case Gecode::SRT_EQ: Gecode::rel(home, e0 == e1); break; case Gecode::SRT_NQ: Gecode::rel(home, e0 != e1); break; case Gecode::SRT_SUB: Gecode::rel(home, e0 <= e1); break; case Gecode::SRT_SUP: Gecode::rel(home, e0 >= e1); break; case Gecode::SRT_DISJ: Gecode::rel(home, e0 || e1); break; case Gecode::SRT_CMPL: Gecode::rel(home, e0 == -e1); break; } } /// Post reified constraint on \a x virtual void post(Gecode::Space& home, Gecode::IntVarArray& x, Gecode::Reify r) { using namespace Gecode; SetVarArgs s(home,8,IntSet::empty,1,1); Gecode::rel(home, (singleton(1) == s[0]) == (x[0] != x[2])); Gecode::rel(home, (singleton(1) == s[1]) == (x[1] == 1)); Gecode::rel(home, (singleton(1) == s[2]) == (x[2] > 0)); Gecode::rel(home, (singleton(1) == s[3]) == (x[3] == 1)); Gecode::rel(home, (singleton(1) == s[4]) == (x[4] != x[6])); Gecode::rel(home, (singleton(1) == s[5]) == (x[5] == 1)); Gecode::rel(home, (singleton(1) == s[6]) == (x[6] > 0)); Gecode::rel(home, (singleton(1) == s[7]) == (x[7] == 1)); Gecode::SetExpr reg0[4] = {s[0],s[1],s[2],s[3]}; Gecode::SetExpr e0 = eval(bis0,reg0); Gecode::SetExpr reg1[4] = {s[4],s[5],s[6],s[7]}; Gecode::SetExpr e1 = eval(bis1,reg1); Gecode::SetRel srel; switch (srt) { case Gecode::SRT_EQ: srel = (e0 == e1); break; case Gecode::SRT_NQ: srel = (e0 != e1); break; case Gecode::SRT_SUB: srel = (e0 <= e1); break; case Gecode::SRT_SUP: srel = (e0 >= e1); break; case Gecode::SRT_DISJ: srel = (e0 || e1); break; case Gecode::SRT_CMPL: srel = (e0 == -e1); break; } switch (r.mode()) { case Gecode::RM_EQV: Gecode::rel(home, r.var()==srel); break; case Gecode::RM_IMP: Gecode::rel(home, r.var() >> srel); break; case Gecode::RM_PMI: Gecode::rel(home, r.var() << srel); break; } } }; const SetInstr si000[] = { {SO_INTER,0,1,0},{SO_INTER,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si001[] = { {SO_INTER,0,1,0},{SO_INTER,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si002[] = { {SO_INTER,2,3,2},{SO_INTER,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si003[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_INTER,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si004[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_INTER,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si005[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si006[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si007[] = { {SO_INTER,0,1,0},{SO_INTER,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si008[] = { {SO_INTER,0,1,0},{SO_INTER,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si009[] = { {SO_INTER,2,3,2},{SO_INTER,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si010[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_INTER,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si011[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_INTER,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si012[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si013[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si014[] = { {SO_INTER,0,1,0},{SO_INTER,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si015[] = { {SO_INTER,0,1,0},{SO_INTER,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si016[] = { {SO_INTER,2,3,2},{SO_INTER,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si017[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_INTER,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si018[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_INTER,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si019[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si020[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si021[] = { {SO_INTER,0,1,0},{SO_INTER,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si022[] = { {SO_INTER,0,1,0},{SO_INTER,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si023[] = { {SO_INTER,2,3,2},{SO_INTER,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si024[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_INTER,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si025[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_INTER,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si026[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si027[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si028[] = { {SO_INTER,0,1,0},{SO_INTER,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si029[] = { {SO_INTER,0,1,0},{SO_INTER,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si030[] = { {SO_INTER,2,3,2},{SO_INTER,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si031[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_INTER,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si032[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_INTER,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si033[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si034[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si035[] = { {SO_INTER,0,1,0},{SO_UNION ,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si036[] = { {SO_INTER,0,1,0},{SO_UNION ,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si037[] = { {SO_INTER,2,3,2},{SO_UNION ,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si038[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_UNION ,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si039[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_UNION ,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si040[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si041[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si042[] = { {SO_INTER,0,1,0},{SO_UNION ,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si043[] = { {SO_INTER,0,1,0},{SO_UNION ,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si044[] = { {SO_INTER,2,3,2},{SO_UNION ,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si045[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_UNION ,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si046[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_UNION ,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si047[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si048[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si049[] = { {SO_INTER,0,1,0},{SO_UNION ,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si050[] = { {SO_INTER,0,1,0},{SO_UNION ,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si051[] = { {SO_INTER,2,3,2},{SO_UNION ,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si052[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_UNION ,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si053[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_UNION ,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si054[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si055[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si056[] = { {SO_INTER,0,1,0},{SO_UNION ,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si057[] = { {SO_INTER,0,1,0},{SO_UNION ,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si058[] = { {SO_INTER,2,3,2},{SO_UNION ,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si059[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_UNION ,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si060[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_UNION ,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si061[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si062[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si063[] = { {SO_INTER,0,1,0},{SO_UNION ,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si064[] = { {SO_INTER,0,1,0},{SO_UNION ,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si065[] = { {SO_INTER,2,3,2},{SO_UNION ,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si066[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_UNION ,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si067[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_UNION ,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si068[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si069[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si070[] = { {SO_INTER,0,1,0},{SO_UNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si071[] = { {SO_INTER,0,1,0},{SO_UNION,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si072[] = { {SO_INTER,2,3,2},{SO_UNION,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si073[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_UNION,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si074[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_UNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si075[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si076[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si077[] = { {SO_INTER,0,1,0},{SO_UNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si078[] = { {SO_INTER,0,1,0},{SO_UNION,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si079[] = { {SO_INTER,2,3,2},{SO_UNION,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si080[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_UNION,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si081[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_UNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si082[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si083[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si084[] = { {SO_INTER,0,1,0},{SO_UNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si085[] = { {SO_INTER,0,1,0},{SO_UNION,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si086[] = { {SO_INTER,2,3,2},{SO_UNION,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si087[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_UNION,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si088[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_UNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si089[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si090[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si091[] = { {SO_INTER,0,1,0},{SO_UNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si092[] = { {SO_INTER,0,1,0},{SO_UNION,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si093[] = { {SO_INTER,2,3,2},{SO_UNION,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si094[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_UNION,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si095[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_UNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si096[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si097[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si098[] = { {SO_INTER,0,1,0},{SO_UNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si099[] = { {SO_INTER,0,1,0},{SO_UNION,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si100[] = { {SO_INTER,2,3,2},{SO_UNION,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si101[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_UNION,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si102[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_UNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si103[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si104[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si105[] = { {SO_INTER,0,1,0},{SO_DUNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si106[] = { {SO_INTER,0,1,0},{SO_DUNION,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si107[] = { {SO_INTER,2,3,2},{SO_DUNION,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si108[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_DUNION,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si109[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_DUNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si110[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si111[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si112[] = { {SO_INTER,0,1,0},{SO_DUNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si113[] = { {SO_INTER,0,1,0},{SO_DUNION,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si114[] = { {SO_INTER,2,3,2},{SO_DUNION,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si115[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_DUNION,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si116[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_DUNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si117[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si118[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si119[] = { {SO_INTER,0,1,0},{SO_DUNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si120[] = { {SO_INTER,0,1,0},{SO_DUNION,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si121[] = { {SO_INTER,2,3,2},{SO_DUNION,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si122[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_DUNION,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si123[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_DUNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si124[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si125[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si126[] = { {SO_INTER,0,1,0},{SO_DUNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si127[] = { {SO_INTER,0,1,0},{SO_DUNION,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si128[] = { {SO_INTER,2,3,2},{SO_DUNION,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si129[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_DUNION,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si130[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_DUNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si131[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si132[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si133[] = { {SO_INTER,0,1,0},{SO_DUNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si134[] = { {SO_INTER,0,1,0},{SO_DUNION,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si135[] = { {SO_INTER,2,3,2},{SO_DUNION,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si136[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_DUNION,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si137[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_DUNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si138[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si139[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si140[] = { {SO_INTER,0,1,0},{SO_MINUS,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si141[] = { {SO_INTER,0,1,0},{SO_MINUS,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si142[] = { {SO_INTER,2,3,2},{SO_MINUS,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si143[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_MINUS,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si144[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_MINUS,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si145[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si146[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si147[] = { {SO_INTER,0,1,0},{SO_MINUS,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si148[] = { {SO_INTER,0,1,0},{SO_MINUS,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si149[] = { {SO_INTER,2,3,2},{SO_MINUS,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si150[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_MINUS,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si151[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_MINUS,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si152[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si153[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si154[] = { {SO_INTER,0,1,0},{SO_MINUS,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si155[] = { {SO_INTER,0,1,0},{SO_MINUS,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si156[] = { {SO_INTER,2,3,2},{SO_MINUS,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si157[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_MINUS,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si158[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_MINUS,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si159[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si160[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si161[] = { {SO_INTER,0,1,0},{SO_MINUS,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si162[] = { {SO_INTER,0,1,0},{SO_MINUS,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si163[] = { {SO_INTER,2,3,2},{SO_MINUS,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si164[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_MINUS,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si165[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_MINUS,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si166[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si167[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si168[] = { {SO_INTER,0,1,0},{SO_MINUS,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si169[] = { {SO_INTER,0,1,0},{SO_MINUS,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si170[] = { {SO_INTER,2,3,2},{SO_MINUS,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si171[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_INTER,0,1,0},{SO_MINUS,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si172[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_INTER,0,1,0}, {SO_MINUS,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si173[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si174[] = { {SO_INTER,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si175[] = { {SO_UNION ,0,1,0},{SO_INTER,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si176[] = { {SO_UNION ,0,1,0},{SO_INTER,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si177[] = { {SO_UNION ,2,3,2},{SO_INTER,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si178[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_INTER,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si179[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_INTER,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si180[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si181[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si182[] = { {SO_UNION ,0,1,0},{SO_INTER,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si183[] = { {SO_UNION ,0,1,0},{SO_INTER,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si184[] = { {SO_UNION ,2,3,2},{SO_INTER,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si185[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_INTER,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si186[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_INTER,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si187[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si188[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si189[] = { {SO_UNION ,0,1,0},{SO_INTER,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si190[] = { {SO_UNION ,0,1,0},{SO_INTER,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si191[] = { {SO_UNION ,2,3,2},{SO_INTER,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si192[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_INTER,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si193[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_INTER,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si194[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si195[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si196[] = { {SO_UNION ,0,1,0},{SO_INTER,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si197[] = { {SO_UNION ,0,1,0},{SO_INTER,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si198[] = { {SO_UNION ,2,3,2},{SO_INTER,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si199[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_INTER,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si200[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_INTER,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si201[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si202[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si203[] = { {SO_UNION ,0,1,0},{SO_INTER,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si204[] = { {SO_UNION ,0,1,0},{SO_INTER,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si205[] = { {SO_UNION ,2,3,2},{SO_INTER,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si206[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_INTER,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si207[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_INTER,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si208[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si209[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si210[] = { {SO_UNION ,0,1,0},{SO_UNION ,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si211[] = { {SO_UNION ,0,1,0},{SO_UNION ,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si212[] = { {SO_UNION ,2,3,2},{SO_UNION ,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si213[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_UNION ,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si214[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_UNION ,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si215[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si216[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si217[] = { {SO_UNION ,0,1,0},{SO_UNION ,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si218[] = { {SO_UNION ,0,1,0},{SO_UNION ,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si219[] = { {SO_UNION ,2,3,2},{SO_UNION ,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si220[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_UNION ,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si221[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_UNION ,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si222[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si223[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si224[] = { {SO_UNION ,0,1,0},{SO_UNION ,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si225[] = { {SO_UNION ,0,1,0},{SO_UNION ,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si226[] = { {SO_UNION ,2,3,2},{SO_UNION ,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si227[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_UNION ,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si228[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_UNION ,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si229[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si230[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si231[] = { {SO_UNION ,0,1,0},{SO_UNION ,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si232[] = { {SO_UNION ,0,1,0},{SO_UNION ,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si233[] = { {SO_UNION ,2,3,2},{SO_UNION ,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si234[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_UNION ,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si235[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_UNION ,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si236[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si237[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si238[] = { {SO_UNION ,0,1,0},{SO_UNION ,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si239[] = { {SO_UNION ,0,1,0},{SO_UNION ,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si240[] = { {SO_UNION ,2,3,2},{SO_UNION ,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si241[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_UNION ,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si242[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_UNION ,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si243[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si244[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si245[] = { {SO_UNION ,0,1,0},{SO_UNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si246[] = { {SO_UNION ,0,1,0},{SO_UNION,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si247[] = { {SO_UNION ,2,3,2},{SO_UNION,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si248[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_UNION,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si249[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_UNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si250[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si251[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si252[] = { {SO_UNION ,0,1,0},{SO_UNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si253[] = { {SO_UNION ,0,1,0},{SO_UNION,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si254[] = { {SO_UNION ,2,3,2},{SO_UNION,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si255[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_UNION,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si256[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_UNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si257[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si258[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si259[] = { {SO_UNION ,0,1,0},{SO_UNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si260[] = { {SO_UNION ,0,1,0},{SO_UNION,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si261[] = { {SO_UNION ,2,3,2},{SO_UNION,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si262[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_UNION,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si263[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_UNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si264[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si265[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si266[] = { {SO_UNION ,0,1,0},{SO_UNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si267[] = { {SO_UNION ,0,1,0},{SO_UNION,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si268[] = { {SO_UNION ,2,3,2},{SO_UNION,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si269[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_UNION,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si270[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_UNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si271[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si272[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si273[] = { {SO_UNION ,0,1,0},{SO_UNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si274[] = { {SO_UNION ,0,1,0},{SO_UNION,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si275[] = { {SO_UNION ,2,3,2},{SO_UNION,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si276[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_UNION,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si277[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_UNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si278[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si279[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si280[] = { {SO_UNION ,0,1,0},{SO_DUNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si281[] = { {SO_UNION ,0,1,0},{SO_DUNION,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si282[] = { {SO_UNION ,2,3,2},{SO_DUNION,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si283[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_DUNION,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si284[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_DUNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si285[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si286[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si287[] = { {SO_UNION ,0,1,0},{SO_DUNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si288[] = { {SO_UNION ,0,1,0},{SO_DUNION,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si289[] = { {SO_UNION ,2,3,2},{SO_DUNION,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si290[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_DUNION,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si291[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_DUNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si292[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si293[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si294[] = { {SO_UNION ,0,1,0},{SO_DUNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si295[] = { {SO_UNION ,0,1,0},{SO_DUNION,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si296[] = { {SO_UNION ,2,3,2},{SO_DUNION,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si297[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_DUNION,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si298[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_DUNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si299[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si300[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si301[] = { {SO_UNION ,0,1,0},{SO_DUNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si302[] = { {SO_UNION ,0,1,0},{SO_DUNION,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si303[] = { {SO_UNION ,2,3,2},{SO_DUNION,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si304[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_DUNION,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si305[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_DUNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si306[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si307[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si308[] = { {SO_UNION ,0,1,0},{SO_DUNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si309[] = { {SO_UNION ,0,1,0},{SO_DUNION,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si310[] = { {SO_UNION ,2,3,2},{SO_DUNION,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si311[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_DUNION,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si312[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_DUNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si313[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si314[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si315[] = { {SO_UNION ,0,1,0},{SO_MINUS,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si316[] = { {SO_UNION ,0,1,0},{SO_MINUS,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si317[] = { {SO_UNION ,2,3,2},{SO_MINUS,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si318[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_MINUS,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si319[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_MINUS,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si320[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si321[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si322[] = { {SO_UNION ,0,1,0},{SO_MINUS,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si323[] = { {SO_UNION ,0,1,0},{SO_MINUS,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si324[] = { {SO_UNION ,2,3,2},{SO_MINUS,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si325[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_MINUS,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si326[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_MINUS,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si327[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si328[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si329[] = { {SO_UNION ,0,1,0},{SO_MINUS,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si330[] = { {SO_UNION ,0,1,0},{SO_MINUS,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si331[] = { {SO_UNION ,2,3,2},{SO_MINUS,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si332[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_MINUS,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si333[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_MINUS,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si334[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si335[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si336[] = { {SO_UNION ,0,1,0},{SO_MINUS,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si337[] = { {SO_UNION ,0,1,0},{SO_MINUS,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si338[] = { {SO_UNION ,2,3,2},{SO_MINUS,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si339[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_MINUS,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si340[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_MINUS,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si341[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si342[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si343[] = { {SO_UNION ,0,1,0},{SO_MINUS,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si344[] = { {SO_UNION ,0,1,0},{SO_MINUS,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si345[] = { {SO_UNION ,2,3,2},{SO_MINUS,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si346[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION ,0,1,0},{SO_MINUS,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si347[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION ,0,1,0}, {SO_MINUS,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si348[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si349[] = { {SO_UNION ,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si350[] = { {SO_UNION,0,1,0},{SO_INTER,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si351[] = { {SO_UNION,0,1,0},{SO_INTER,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si352[] = { {SO_UNION,2,3,2},{SO_INTER,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si353[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_INTER,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si354[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_INTER,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si355[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si356[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si357[] = { {SO_UNION,0,1,0},{SO_INTER,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si358[] = { {SO_UNION,0,1,0},{SO_INTER,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si359[] = { {SO_UNION,2,3,2},{SO_INTER,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si360[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_INTER,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si361[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_INTER,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si362[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si363[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si364[] = { {SO_UNION,0,1,0},{SO_INTER,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si365[] = { {SO_UNION,0,1,0},{SO_INTER,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si366[] = { {SO_UNION,2,3,2},{SO_INTER,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si367[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_INTER,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si368[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_INTER,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si369[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si370[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si371[] = { {SO_UNION,0,1,0},{SO_INTER,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si372[] = { {SO_UNION,0,1,0},{SO_INTER,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si373[] = { {SO_UNION,2,3,2},{SO_INTER,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si374[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_INTER,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si375[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_INTER,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si376[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si377[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si378[] = { {SO_UNION,0,1,0},{SO_INTER,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si379[] = { {SO_UNION,0,1,0},{SO_INTER,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si380[] = { {SO_UNION,2,3,2},{SO_INTER,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si381[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_INTER,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si382[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_INTER,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si383[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si384[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si385[] = { {SO_UNION,0,1,0},{SO_UNION ,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si386[] = { {SO_UNION,0,1,0},{SO_UNION ,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si387[] = { {SO_UNION,2,3,2},{SO_UNION ,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si388[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_UNION ,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si389[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_UNION ,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si390[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si391[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si392[] = { {SO_UNION,0,1,0},{SO_UNION ,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si393[] = { {SO_UNION,0,1,0},{SO_UNION ,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si394[] = { {SO_UNION,2,3,2},{SO_UNION ,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si395[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_UNION ,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si396[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_UNION ,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si397[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si398[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si399[] = { {SO_UNION,0,1,0},{SO_UNION ,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si400[] = { {SO_UNION,0,1,0},{SO_UNION ,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si401[] = { {SO_UNION,2,3,2},{SO_UNION ,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si402[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_UNION ,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si403[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_UNION ,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si404[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si405[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si406[] = { {SO_UNION,0,1,0},{SO_UNION ,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si407[] = { {SO_UNION,0,1,0},{SO_UNION ,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si408[] = { {SO_UNION,2,3,2},{SO_UNION ,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si409[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_UNION ,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si410[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_UNION ,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si411[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si412[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si413[] = { {SO_UNION,0,1,0},{SO_UNION ,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si414[] = { {SO_UNION,0,1,0},{SO_UNION ,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si415[] = { {SO_UNION,2,3,2},{SO_UNION ,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si416[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_UNION ,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si417[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_UNION ,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si418[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si419[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si420[] = { {SO_UNION,0,1,0},{SO_UNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si421[] = { {SO_UNION,0,1,0},{SO_UNION,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si422[] = { {SO_UNION,2,3,2},{SO_UNION,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si423[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_UNION,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si424[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_UNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si425[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si426[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si427[] = { {SO_UNION,0,1,0},{SO_UNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si428[] = { {SO_UNION,0,1,0},{SO_UNION,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si429[] = { {SO_UNION,2,3,2},{SO_UNION,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si430[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_UNION,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si431[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_UNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si432[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si433[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si434[] = { {SO_UNION,0,1,0},{SO_UNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si435[] = { {SO_UNION,0,1,0},{SO_UNION,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si436[] = { {SO_UNION,2,3,2},{SO_UNION,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si437[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_UNION,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si438[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_UNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si439[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si440[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si441[] = { {SO_UNION,0,1,0},{SO_UNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si442[] = { {SO_UNION,0,1,0},{SO_UNION,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si443[] = { {SO_UNION,2,3,2},{SO_UNION,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si444[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_UNION,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si445[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_UNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si446[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si447[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si448[] = { {SO_UNION,0,1,0},{SO_UNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si449[] = { {SO_UNION,0,1,0},{SO_UNION,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si450[] = { {SO_UNION,2,3,2},{SO_UNION,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si451[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_UNION,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si452[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_UNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si453[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si454[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si455[] = { {SO_UNION,0,1,0},{SO_DUNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si456[] = { {SO_UNION,0,1,0},{SO_DUNION,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si457[] = { {SO_UNION,2,3,2},{SO_DUNION,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si458[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_DUNION,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si459[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_DUNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si460[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si461[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si462[] = { {SO_UNION,0,1,0},{SO_DUNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si463[] = { {SO_UNION,0,1,0},{SO_DUNION,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si464[] = { {SO_UNION,2,3,2},{SO_DUNION,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si465[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_DUNION,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si466[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_DUNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si467[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si468[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si469[] = { {SO_UNION,0,1,0},{SO_DUNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si470[] = { {SO_UNION,0,1,0},{SO_DUNION,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si471[] = { {SO_UNION,2,3,2},{SO_DUNION,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si472[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_DUNION,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si473[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_DUNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si474[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si475[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si476[] = { {SO_UNION,0,1,0},{SO_DUNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si477[] = { {SO_UNION,0,1,0},{SO_DUNION,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si478[] = { {SO_UNION,2,3,2},{SO_DUNION,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si479[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_DUNION,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si480[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_DUNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si481[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si482[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si483[] = { {SO_UNION,0,1,0},{SO_DUNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si484[] = { {SO_UNION,0,1,0},{SO_DUNION,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si485[] = { {SO_UNION,2,3,2},{SO_DUNION,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si486[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_DUNION,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si487[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_DUNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si488[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si489[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si490[] = { {SO_UNION,0,1,0},{SO_MINUS,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si491[] = { {SO_UNION,0,1,0},{SO_MINUS,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si492[] = { {SO_UNION,2,3,2},{SO_MINUS,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si493[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_MINUS,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si494[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_MINUS,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si495[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si496[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si497[] = { {SO_UNION,0,1,0},{SO_MINUS,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si498[] = { {SO_UNION,0,1,0},{SO_MINUS,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si499[] = { {SO_UNION,2,3,2},{SO_MINUS,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si500[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_MINUS,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si501[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_MINUS,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si502[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si503[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si504[] = { {SO_UNION,0,1,0},{SO_MINUS,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si505[] = { {SO_UNION,0,1,0},{SO_MINUS,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si506[] = { {SO_UNION,2,3,2},{SO_MINUS,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si507[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_MINUS,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si508[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_MINUS,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si509[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si510[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si511[] = { {SO_UNION,0,1,0},{SO_MINUS,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si512[] = { {SO_UNION,0,1,0},{SO_MINUS,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si513[] = { {SO_UNION,2,3,2},{SO_MINUS,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si514[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_MINUS,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si515[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_MINUS,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si516[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si517[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si518[] = { {SO_UNION,0,1,0},{SO_MINUS,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si519[] = { {SO_UNION,0,1,0},{SO_MINUS,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si520[] = { {SO_UNION,2,3,2},{SO_MINUS,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si521[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_UNION,0,1,0},{SO_MINUS,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si522[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_UNION,0,1,0}, {SO_MINUS,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si523[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si524[] = { {SO_UNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si525[] = { {SO_DUNION,0,1,0},{SO_INTER,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si526[] = { {SO_DUNION,0,1,0},{SO_INTER,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si527[] = { {SO_DUNION,2,3,2},{SO_INTER,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si528[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_INTER,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si529[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_INTER,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si530[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si531[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si532[] = { {SO_DUNION,0,1,0},{SO_INTER,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si533[] = { {SO_DUNION,0,1,0},{SO_INTER,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si534[] = { {SO_DUNION,2,3,2},{SO_INTER,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si535[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_INTER,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si536[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_INTER,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si537[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si538[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si539[] = { {SO_DUNION,0,1,0},{SO_INTER,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si540[] = { {SO_DUNION,0,1,0},{SO_INTER,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si541[] = { {SO_DUNION,2,3,2},{SO_INTER,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si542[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_INTER,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si543[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_INTER,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si544[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si545[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si546[] = { {SO_DUNION,0,1,0},{SO_INTER,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si547[] = { {SO_DUNION,0,1,0},{SO_INTER,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si548[] = { {SO_DUNION,2,3,2},{SO_INTER,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si549[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_INTER,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si550[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_INTER,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si551[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si552[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si553[] = { {SO_DUNION,0,1,0},{SO_INTER,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si554[] = { {SO_DUNION,0,1,0},{SO_INTER,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si555[] = { {SO_DUNION,2,3,2},{SO_INTER,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si556[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_INTER,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si557[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_INTER,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si558[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si559[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si560[] = { {SO_DUNION,0,1,0},{SO_UNION ,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si561[] = { {SO_DUNION,0,1,0},{SO_UNION ,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si562[] = { {SO_DUNION,2,3,2},{SO_UNION ,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si563[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_UNION ,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si564[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_UNION ,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si565[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si566[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si567[] = { {SO_DUNION,0,1,0},{SO_UNION ,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si568[] = { {SO_DUNION,0,1,0},{SO_UNION ,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si569[] = { {SO_DUNION,2,3,2},{SO_UNION ,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si570[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_UNION ,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si571[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_UNION ,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si572[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si573[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si574[] = { {SO_DUNION,0,1,0},{SO_UNION ,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si575[] = { {SO_DUNION,0,1,0},{SO_UNION ,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si576[] = { {SO_DUNION,2,3,2},{SO_UNION ,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si577[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_UNION ,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si578[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_UNION ,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si579[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si580[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si581[] = { {SO_DUNION,0,1,0},{SO_UNION ,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si582[] = { {SO_DUNION,0,1,0},{SO_UNION ,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si583[] = { {SO_DUNION,2,3,2},{SO_UNION ,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si584[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_UNION ,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si585[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_UNION ,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si586[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si587[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si588[] = { {SO_DUNION,0,1,0},{SO_UNION ,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si589[] = { {SO_DUNION,0,1,0},{SO_UNION ,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si590[] = { {SO_DUNION,2,3,2},{SO_UNION ,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si591[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_UNION ,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si592[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_UNION ,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si593[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si594[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si595[] = { {SO_DUNION,0,1,0},{SO_UNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si596[] = { {SO_DUNION,0,1,0},{SO_UNION,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si597[] = { {SO_DUNION,2,3,2},{SO_UNION,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si598[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_UNION,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si599[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_UNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si600[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si601[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si602[] = { {SO_DUNION,0,1,0},{SO_UNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si603[] = { {SO_DUNION,0,1,0},{SO_UNION,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si604[] = { {SO_DUNION,2,3,2},{SO_UNION,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si605[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_UNION,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si606[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_UNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si607[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si608[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si609[] = { {SO_DUNION,0,1,0},{SO_UNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si610[] = { {SO_DUNION,0,1,0},{SO_UNION,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si611[] = { {SO_DUNION,2,3,2},{SO_UNION,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si612[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_UNION,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si613[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_UNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si614[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si615[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si616[] = { {SO_DUNION,0,1,0},{SO_UNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si617[] = { {SO_DUNION,0,1,0},{SO_UNION,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si618[] = { {SO_DUNION,2,3,2},{SO_UNION,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si619[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_UNION,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si620[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_UNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si621[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si622[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si623[] = { {SO_DUNION,0,1,0},{SO_UNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si624[] = { {SO_DUNION,0,1,0},{SO_UNION,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si625[] = { {SO_DUNION,2,3,2},{SO_UNION,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si626[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_UNION,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si627[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_UNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si628[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si629[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si630[] = { {SO_DUNION,0,1,0},{SO_DUNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si631[] = { {SO_DUNION,0,1,0},{SO_DUNION,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si632[] = { {SO_DUNION,2,3,2},{SO_DUNION,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si633[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_DUNION,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si634[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_DUNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si635[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si636[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si637[] = { {SO_DUNION,0,1,0},{SO_DUNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si638[] = { {SO_DUNION,0,1,0},{SO_DUNION,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si639[] = { {SO_DUNION,2,3,2},{SO_DUNION,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si640[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_DUNION,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si641[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_DUNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si642[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si643[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si644[] = { {SO_DUNION,0,1,0},{SO_DUNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si645[] = { {SO_DUNION,0,1,0},{SO_DUNION,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si646[] = { {SO_DUNION,2,3,2},{SO_DUNION,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si647[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_DUNION,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si648[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_DUNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si649[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si650[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si651[] = { {SO_DUNION,0,1,0},{SO_DUNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si652[] = { {SO_DUNION,0,1,0},{SO_DUNION,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si653[] = { {SO_DUNION,2,3,2},{SO_DUNION,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si654[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_DUNION,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si655[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_DUNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si656[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si657[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si658[] = { {SO_DUNION,0,1,0},{SO_DUNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si659[] = { {SO_DUNION,0,1,0},{SO_DUNION,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si660[] = { {SO_DUNION,2,3,2},{SO_DUNION,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si661[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_DUNION,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si662[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_DUNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si663[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si664[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si665[] = { {SO_DUNION,0,1,0},{SO_MINUS,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si666[] = { {SO_DUNION,0,1,0},{SO_MINUS,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si667[] = { {SO_DUNION,2,3,2},{SO_MINUS,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si668[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_MINUS,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si669[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_MINUS,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si670[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si671[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si672[] = { {SO_DUNION,0,1,0},{SO_MINUS,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si673[] = { {SO_DUNION,0,1,0},{SO_MINUS,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si674[] = { {SO_DUNION,2,3,2},{SO_MINUS,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si675[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_MINUS,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si676[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_MINUS,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si677[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si678[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si679[] = { {SO_DUNION,0,1,0},{SO_MINUS,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si680[] = { {SO_DUNION,0,1,0},{SO_MINUS,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si681[] = { {SO_DUNION,2,3,2},{SO_MINUS,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si682[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_MINUS,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si683[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_MINUS,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si684[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si685[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si686[] = { {SO_DUNION,0,1,0},{SO_MINUS,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si687[] = { {SO_DUNION,0,1,0},{SO_MINUS,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si688[] = { {SO_DUNION,2,3,2},{SO_MINUS,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si689[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_MINUS,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si690[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_MINUS,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si691[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si692[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si693[] = { {SO_DUNION,0,1,0},{SO_MINUS,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si694[] = { {SO_DUNION,0,1,0},{SO_MINUS,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si695[] = { {SO_DUNION,2,3,2},{SO_MINUS,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si696[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_DUNION,0,1,0},{SO_MINUS,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si697[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_DUNION,0,1,0}, {SO_MINUS,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si698[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si699[] = { {SO_DUNION,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si700[] = { {SO_MINUS,0,1,0},{SO_INTER,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si701[] = { {SO_MINUS,0,1,0},{SO_INTER,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si702[] = { {SO_MINUS,2,3,2},{SO_INTER,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si703[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_INTER,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si704[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_INTER,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si705[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si706[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si707[] = { {SO_MINUS,0,1,0},{SO_INTER,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si708[] = { {SO_MINUS,0,1,0},{SO_INTER,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si709[] = { {SO_MINUS,2,3,2},{SO_INTER,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si710[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_INTER,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si711[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_INTER,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si712[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si713[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si714[] = { {SO_MINUS,0,1,0},{SO_INTER,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si715[] = { {SO_MINUS,0,1,0},{SO_INTER,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si716[] = { {SO_MINUS,2,3,2},{SO_INTER,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si717[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_INTER,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si718[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_INTER,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si719[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si720[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si721[] = { {SO_MINUS,0,1,0},{SO_INTER,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si722[] = { {SO_MINUS,0,1,0},{SO_INTER,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si723[] = { {SO_MINUS,2,3,2},{SO_INTER,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si724[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_INTER,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si725[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_INTER,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si726[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si727[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si728[] = { {SO_MINUS,0,1,0},{SO_INTER,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si729[] = { {SO_MINUS,0,1,0},{SO_INTER,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si730[] = { {SO_MINUS,2,3,2},{SO_INTER,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si731[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_INTER,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si732[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_INTER,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si733[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si734[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_INTER,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si735[] = { {SO_MINUS,0,1,0},{SO_UNION ,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si736[] = { {SO_MINUS,0,1,0},{SO_UNION ,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si737[] = { {SO_MINUS,2,3,2},{SO_UNION ,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si738[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_UNION ,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si739[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_UNION ,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si740[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si741[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si742[] = { {SO_MINUS,0,1,0},{SO_UNION ,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si743[] = { {SO_MINUS,0,1,0},{SO_UNION ,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si744[] = { {SO_MINUS,2,3,2},{SO_UNION ,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si745[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_UNION ,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si746[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_UNION ,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si747[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si748[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si749[] = { {SO_MINUS,0,1,0},{SO_UNION ,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si750[] = { {SO_MINUS,0,1,0},{SO_UNION ,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si751[] = { {SO_MINUS,2,3,2},{SO_UNION ,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si752[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_UNION ,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si753[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_UNION ,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si754[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si755[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si756[] = { {SO_MINUS,0,1,0},{SO_UNION ,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si757[] = { {SO_MINUS,0,1,0},{SO_UNION ,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si758[] = { {SO_MINUS,2,3,2},{SO_UNION ,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si759[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_UNION ,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si760[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_UNION ,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si761[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si762[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si763[] = { {SO_MINUS,0,1,0},{SO_UNION ,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si764[] = { {SO_MINUS,0,1,0},{SO_UNION ,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si765[] = { {SO_MINUS,2,3,2},{SO_UNION ,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si766[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_UNION ,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si767[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_UNION ,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si768[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si769[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION ,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si770[] = { {SO_MINUS,0,1,0},{SO_UNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si771[] = { {SO_MINUS,0,1,0},{SO_UNION,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si772[] = { {SO_MINUS,2,3,2},{SO_UNION,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si773[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_UNION,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si774[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_UNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si775[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si776[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si777[] = { {SO_MINUS,0,1,0},{SO_UNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si778[] = { {SO_MINUS,0,1,0},{SO_UNION,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si779[] = { {SO_MINUS,2,3,2},{SO_UNION,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si780[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_UNION,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si781[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_UNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si782[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si783[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si784[] = { {SO_MINUS,0,1,0},{SO_UNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si785[] = { {SO_MINUS,0,1,0},{SO_UNION,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si786[] = { {SO_MINUS,2,3,2},{SO_UNION,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si787[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_UNION,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si788[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_UNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si789[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si790[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si791[] = { {SO_MINUS,0,1,0},{SO_UNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si792[] = { {SO_MINUS,0,1,0},{SO_UNION,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si793[] = { {SO_MINUS,2,3,2},{SO_UNION,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si794[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_UNION,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si795[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_UNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si796[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si797[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si798[] = { {SO_MINUS,0,1,0},{SO_UNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si799[] = { {SO_MINUS,0,1,0},{SO_UNION,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si800[] = { {SO_MINUS,2,3,2},{SO_UNION,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si801[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_UNION,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si802[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_UNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si803[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si804[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_UNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si805[] = { {SO_MINUS,0,1,0},{SO_DUNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si806[] = { {SO_MINUS,0,1,0},{SO_DUNION,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si807[] = { {SO_MINUS,2,3,2},{SO_DUNION,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si808[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_DUNION,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si809[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_DUNION,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si810[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si811[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si812[] = { {SO_MINUS,0,1,0},{SO_DUNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si813[] = { {SO_MINUS,0,1,0},{SO_DUNION,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si814[] = { {SO_MINUS,2,3,2},{SO_DUNION,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si815[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_DUNION,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si816[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_DUNION,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si817[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si818[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si819[] = { {SO_MINUS,0,1,0},{SO_DUNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si820[] = { {SO_MINUS,0,1,0},{SO_DUNION,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si821[] = { {SO_MINUS,2,3,2},{SO_DUNION,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si822[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_DUNION,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si823[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_DUNION,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si824[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si825[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si826[] = { {SO_MINUS,0,1,0},{SO_DUNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si827[] = { {SO_MINUS,0,1,0},{SO_DUNION,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si828[] = { {SO_MINUS,2,3,2},{SO_DUNION,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si829[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_DUNION,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si830[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_DUNION,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si831[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si832[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si833[] = { {SO_MINUS,0,1,0},{SO_DUNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si834[] = { {SO_MINUS,0,1,0},{SO_DUNION,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si835[] = { {SO_MINUS,2,3,2},{SO_DUNION,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si836[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_DUNION,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si837[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_DUNION,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si838[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si839[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_DUNION,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si840[] = { {SO_MINUS,0,1,0},{SO_MINUS,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si841[] = { {SO_MINUS,0,1,0},{SO_MINUS,0,2,0},{SO_INTER,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si842[] = { {SO_MINUS,2,3,2},{SO_MINUS,1,2,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si843[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_MINUS,2,3,1}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si844[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_MINUS,2,3,1},{SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si845[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si846[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_INTER,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si847[] = { {SO_MINUS,0,1,0},{SO_MINUS,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si848[] = { {SO_MINUS,0,1,0},{SO_MINUS,0,2,0},{SO_UNION ,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si849[] = { {SO_MINUS,2,3,2},{SO_MINUS,1,2,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si850[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_MINUS,2,3,1}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si851[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_MINUS,2,3,1},{SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si852[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si853[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION ,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si854[] = { {SO_MINUS,0,1,0},{SO_MINUS,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si855[] = { {SO_MINUS,0,1,0},{SO_MINUS,0,2,0},{SO_UNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si856[] = { {SO_MINUS,2,3,2},{SO_MINUS,1,2,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si857[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_MINUS,2,3,1}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si858[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_MINUS,2,3,1},{SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si859[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si860[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_UNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si861[] = { {SO_MINUS,0,1,0},{SO_MINUS,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si862[] = { {SO_MINUS,0,1,0},{SO_MINUS,0,2,0},{SO_DUNION,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si863[] = { {SO_MINUS,2,3,2},{SO_MINUS,1,2,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si864[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_MINUS,2,3,1}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si865[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_MINUS,2,3,1},{SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si866[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si867[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_DUNION,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si868[] = { {SO_MINUS,0,1,0},{SO_MINUS,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si869[] = { {SO_MINUS,0,1,0},{SO_MINUS,0,2,0},{SO_MINUS,0,3,0}, {SO_HLT,0,0,0} }; const SetInstr si870[] = { {SO_MINUS,2,3,2},{SO_MINUS,1,2,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si871[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_MINUS,0,1,0},{SO_MINUS,2,3,1}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si872[] = { {SO_CMPL,0,0,0},{SO_CMPL,2,2,0},{SO_CMPL,0,0,0},{SO_MINUS,0,1,0}, {SO_MINUS,2,3,1},{SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si873[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si874[] = { {SO_MINUS,0,1,0},{SO_CMPL,0,0,0},{SO_MINUS,2,3,1},{SO_CMPL,1,1,0}, {SO_MINUS,0,1,0},{SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si875[] = { {SO_CMPL,0,0,0}, {SO_HLT,0,0,0} }; const SetInstr si876[] = { {SO_INTER,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si877[] = { {SO_UNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si878[] = { {SO_DUNION,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr si879[] = { {SO_MINUS,0,1,0}, {SO_HLT,0,0,0} }; const SetInstr* si[] = { &si000[0],&si001[0],&si002[0],&si003[0],&si004[0],&si005[0], &si006[0],&si007[0],&si008[0],&si009[0],&si010[0],&si011[0], &si012[0],&si013[0],&si014[0],&si015[0],&si016[0],&si017[0], &si018[0],&si019[0],&si020[0],&si021[0],&si022[0],&si023[0], &si024[0],&si025[0],&si026[0],&si027[0],&si028[0],&si029[0], &si030[0],&si031[0],&si032[0],&si033[0],&si034[0],&si035[0], &si036[0],&si037[0],&si038[0],&si039[0],&si040[0],&si041[0], &si042[0],&si043[0],&si044[0],&si045[0],&si046[0],&si047[0], &si048[0],&si049[0],&si050[0],&si051[0],&si052[0],&si053[0], &si054[0],&si055[0],&si056[0],&si057[0],&si058[0],&si059[0], &si060[0],&si061[0],&si062[0],&si063[0],&si064[0],&si065[0], &si066[0],&si067[0],&si068[0],&si069[0],&si070[0],&si071[0], &si072[0],&si073[0],&si074[0],&si075[0],&si076[0],&si077[0], &si078[0],&si079[0],&si080[0],&si081[0],&si082[0],&si083[0], &si084[0],&si085[0],&si086[0],&si087[0],&si088[0],&si089[0], &si090[0],&si091[0],&si092[0],&si093[0],&si094[0],&si095[0], &si096[0],&si097[0],&si098[0],&si099[0],&si100[0],&si101[0], &si102[0],&si103[0],&si104[0],&si105[0],&si106[0],&si107[0], &si108[0],&si109[0],&si110[0],&si111[0],&si112[0],&si113[0], &si114[0],&si115[0],&si116[0],&si117[0],&si118[0],&si119[0], &si120[0],&si121[0],&si122[0],&si123[0],&si124[0],&si125[0], &si126[0],&si127[0],&si128[0],&si129[0],&si130[0],&si131[0], &si132[0],&si133[0],&si134[0],&si135[0],&si136[0],&si137[0], &si138[0],&si139[0],&si140[0],&si141[0],&si142[0],&si143[0], &si144[0],&si145[0],&si146[0],&si147[0],&si148[0],&si149[0], &si150[0],&si151[0],&si152[0],&si153[0],&si154[0],&si155[0], &si156[0],&si157[0],&si158[0],&si159[0],&si160[0],&si161[0], &si162[0],&si163[0],&si164[0],&si165[0],&si166[0],&si167[0], &si168[0],&si169[0],&si170[0],&si171[0],&si172[0],&si173[0], &si174[0],&si175[0],&si176[0],&si177[0],&si178[0],&si179[0], &si180[0],&si181[0],&si182[0],&si183[0],&si184[0],&si185[0], &si186[0],&si187[0],&si188[0],&si189[0],&si190[0],&si191[0], &si192[0],&si193[0],&si194[0],&si195[0],&si196[0],&si197[0], &si198[0],&si199[0],&si200[0],&si201[0],&si202[0],&si203[0], &si204[0],&si205[0],&si206[0],&si207[0],&si208[0],&si209[0], &si210[0],&si211[0],&si212[0],&si213[0],&si214[0],&si215[0], &si216[0],&si217[0],&si218[0],&si219[0],&si220[0],&si221[0], &si222[0],&si223[0],&si224[0],&si225[0],&si226[0],&si227[0], &si228[0],&si229[0],&si230[0],&si231[0],&si232[0],&si233[0], &si234[0],&si235[0],&si236[0],&si237[0],&si238[0],&si239[0], &si240[0],&si241[0],&si242[0],&si243[0],&si244[0],&si245[0], &si246[0],&si247[0],&si248[0],&si249[0],&si250[0],&si251[0], &si252[0],&si253[0],&si254[0],&si255[0],&si256[0],&si257[0], &si258[0],&si259[0],&si260[0],&si261[0],&si262[0],&si263[0], &si264[0],&si265[0],&si266[0],&si267[0],&si268[0],&si269[0], &si270[0],&si271[0],&si272[0],&si273[0],&si274[0],&si275[0], &si276[0],&si277[0],&si278[0],&si279[0],&si280[0],&si281[0], &si282[0],&si283[0],&si284[0],&si285[0],&si286[0],&si287[0], &si288[0],&si289[0],&si290[0],&si291[0],&si292[0],&si293[0], &si294[0],&si295[0],&si296[0],&si297[0],&si298[0],&si299[0], &si300[0],&si301[0],&si302[0],&si303[0],&si304[0],&si305[0], &si306[0],&si307[0],&si308[0],&si309[0],&si310[0],&si311[0], &si312[0],&si313[0],&si314[0],&si315[0],&si316[0],&si317[0], &si318[0],&si319[0],&si320[0],&si321[0],&si322[0],&si323[0], &si324[0],&si325[0],&si326[0],&si327[0],&si328[0],&si329[0], &si330[0],&si331[0],&si332[0],&si333[0],&si334[0],&si335[0], &si336[0],&si337[0],&si338[0],&si339[0],&si340[0],&si341[0], &si342[0],&si343[0],&si344[0],&si345[0],&si346[0],&si347[0], &si348[0],&si349[0],&si350[0],&si351[0],&si352[0],&si353[0], &si354[0],&si355[0],&si356[0],&si357[0],&si358[0],&si359[0], &si360[0],&si361[0],&si362[0],&si363[0],&si364[0],&si365[0], &si366[0],&si367[0],&si368[0],&si369[0],&si370[0],&si371[0], &si372[0],&si373[0],&si374[0],&si375[0],&si376[0],&si377[0], &si378[0],&si379[0],&si380[0],&si381[0],&si382[0],&si383[0], &si384[0],&si385[0],&si386[0],&si387[0],&si388[0],&si389[0], &si390[0],&si391[0],&si392[0],&si393[0],&si394[0],&si395[0], &si396[0],&si397[0],&si398[0],&si399[0],&si400[0],&si401[0], &si402[0],&si403[0],&si404[0],&si405[0],&si406[0],&si407[0], &si408[0],&si409[0],&si410[0],&si411[0],&si412[0],&si413[0], &si414[0],&si415[0],&si416[0],&si417[0],&si418[0],&si419[0], &si420[0],&si421[0],&si422[0],&si423[0],&si424[0],&si425[0], &si426[0],&si427[0],&si428[0],&si429[0],&si430[0],&si431[0], &si432[0],&si433[0],&si434[0],&si435[0],&si436[0],&si437[0], &si438[0],&si439[0],&si440[0],&si441[0],&si442[0],&si443[0], &si444[0],&si445[0],&si446[0],&si447[0],&si448[0],&si449[0], &si450[0],&si451[0],&si452[0],&si453[0],&si454[0],&si455[0], &si456[0],&si457[0],&si458[0],&si459[0],&si460[0],&si461[0], &si462[0],&si463[0],&si464[0],&si465[0],&si466[0],&si467[0], &si468[0],&si469[0],&si470[0],&si471[0],&si472[0],&si473[0], &si474[0],&si475[0],&si476[0],&si477[0],&si478[0],&si479[0], &si480[0],&si481[0],&si482[0],&si483[0],&si484[0],&si485[0], &si486[0],&si487[0],&si488[0],&si489[0],&si490[0],&si491[0], &si492[0],&si493[0],&si494[0],&si495[0],&si496[0],&si497[0], &si498[0],&si499[0],&si500[0],&si501[0],&si502[0],&si503[0], &si504[0],&si505[0],&si506[0],&si507[0],&si508[0],&si509[0], &si510[0],&si511[0],&si512[0],&si513[0],&si514[0],&si515[0], &si516[0],&si517[0],&si518[0],&si519[0],&si520[0],&si521[0], &si522[0],&si523[0],&si524[0],&si525[0],&si526[0],&si527[0], &si528[0],&si529[0],&si530[0],&si531[0],&si532[0],&si533[0], &si534[0],&si535[0],&si536[0],&si537[0],&si538[0],&si539[0], &si540[0],&si541[0],&si542[0],&si543[0],&si544[0],&si545[0], &si546[0],&si547[0],&si548[0],&si549[0],&si550[0],&si551[0], &si552[0],&si553[0],&si554[0],&si555[0],&si556[0],&si557[0], &si558[0],&si559[0],&si560[0],&si561[0],&si562[0],&si563[0], &si564[0],&si565[0],&si566[0],&si567[0],&si568[0],&si569[0], &si570[0],&si571[0],&si572[0],&si573[0],&si574[0],&si575[0], &si576[0],&si577[0],&si578[0],&si579[0],&si580[0],&si581[0], &si582[0],&si583[0],&si584[0],&si585[0],&si586[0],&si587[0], &si588[0],&si589[0],&si590[0],&si591[0],&si592[0],&si593[0], &si594[0],&si595[0],&si596[0],&si597[0],&si598[0],&si599[0], &si600[0],&si601[0],&si602[0],&si603[0],&si604[0],&si605[0], &si606[0],&si607[0],&si608[0],&si609[0],&si610[0],&si611[0], &si612[0],&si613[0],&si614[0],&si615[0],&si616[0],&si617[0], &si618[0],&si619[0],&si620[0],&si621[0],&si622[0],&si623[0], &si624[0],&si625[0],&si626[0],&si627[0],&si628[0],&si629[0], &si630[0],&si631[0],&si632[0],&si633[0],&si634[0],&si635[0], &si636[0],&si637[0],&si638[0],&si639[0],&si640[0],&si641[0], &si642[0],&si643[0],&si644[0],&si645[0],&si646[0],&si647[0], &si648[0],&si649[0],&si650[0],&si651[0],&si652[0],&si653[0], &si654[0],&si655[0],&si656[0],&si657[0],&si658[0],&si659[0], &si660[0],&si661[0],&si662[0],&si663[0],&si664[0],&si665[0], &si666[0],&si667[0],&si668[0],&si669[0],&si670[0],&si671[0], &si672[0],&si673[0],&si674[0],&si675[0],&si676[0],&si677[0], &si678[0],&si679[0],&si680[0],&si681[0],&si682[0],&si683[0], &si684[0],&si685[0],&si686[0],&si687[0],&si688[0],&si689[0], &si690[0],&si691[0],&si692[0],&si693[0],&si694[0],&si695[0], &si696[0],&si697[0],&si698[0],&si699[0],&si700[0],&si701[0], &si702[0],&si703[0],&si704[0],&si705[0],&si706[0],&si707[0], &si708[0],&si709[0],&si710[0],&si711[0],&si712[0],&si713[0], &si714[0],&si715[0],&si716[0],&si717[0],&si718[0],&si719[0], &si720[0],&si721[0],&si722[0],&si723[0],&si724[0],&si725[0], &si726[0],&si727[0],&si728[0],&si729[0],&si730[0],&si731[0], &si732[0],&si733[0],&si734[0],&si735[0],&si736[0],&si737[0], &si738[0],&si739[0],&si740[0],&si741[0],&si742[0],&si743[0], &si744[0],&si745[0],&si746[0],&si747[0],&si748[0],&si749[0], &si750[0],&si751[0],&si752[0],&si753[0],&si754[0],&si755[0], &si756[0],&si757[0],&si758[0],&si759[0],&si760[0],&si761[0], &si762[0],&si763[0],&si764[0],&si765[0],&si766[0],&si767[0], &si768[0],&si769[0],&si770[0],&si771[0],&si772[0],&si773[0], &si774[0],&si775[0],&si776[0],&si777[0],&si778[0],&si779[0], &si780[0],&si781[0],&si782[0],&si783[0],&si784[0],&si785[0], &si786[0],&si787[0],&si788[0],&si789[0],&si790[0],&si791[0], &si792[0],&si793[0],&si794[0],&si795[0],&si796[0],&si797[0], &si798[0],&si799[0],&si800[0],&si801[0],&si802[0],&si803[0], &si804[0],&si805[0],&si806[0],&si807[0],&si808[0],&si809[0], &si810[0],&si811[0],&si812[0],&si813[0],&si814[0],&si815[0], &si816[0],&si817[0],&si818[0],&si819[0],&si820[0],&si821[0], &si822[0],&si823[0],&si824[0],&si825[0],&si826[0],&si827[0], &si828[0],&si829[0],&si830[0],&si831[0],&si832[0],&si833[0], &si834[0],&si835[0],&si836[0],&si837[0],&si838[0],&si839[0], &si840[0],&si841[0],&si842[0],&si843[0],&si844[0],&si845[0], &si846[0],&si847[0],&si848[0],&si849[0],&si850[0],&si851[0], &si852[0],&si853[0],&si854[0],&si855[0],&si856[0],&si857[0], &si858[0],&si859[0],&si860[0],&si861[0],&si862[0],&si863[0], &si864[0],&si865[0],&si866[0],&si867[0],&si868[0],&si869[0], &si870[0],&si871[0],&si872[0],&si873[0],&si874[0],&si875[0], &si876[0],&si877[0],&si878[0],&si879[0] }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { int n = sizeof(si)/sizeof(SetInstr*); for (int i=0; i * * Contributing authors: * Christian Schulte * Guido Tack * * Copyright: * Christopher Mears, 2011 * Christian Schulte, 2011 * Guido Tack, 2011 * * Last modified: * $Date: 2011-07-12 12:49:06 +0200 (Tue, 12 Jul 2011) $ by $Author: tack $ * $Revision: 12172 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/set.hh" using namespace Gecode; namespace Test { namespace Set { /// %Tests for value precedence constraints namespace Precede { static IntSet ds(-1,3); /// %Test for single value precedence constraint class Single : public SetTest { private: /// The values for precedence int s, t; /// Check if \a i is a member of set \a x bool in(int i, int x) const { CountableSetRanges xr(ds,x); Iter::Ranges::Singleton ir(i,i); return Iter::Ranges::subset(ir,xr); } public: /// Create and register test Single(int s0, int t0) : SetTest("Precede::Single::"+str(s0)+"<"+str(t0),4,ds,false), s(s0), t(t0) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { int n = x.size(); for (int i = 0 ; i < n ; i++) { if (!in(s,x[i]) && in(t,x[i])) return false; if (in(s,x[i]) && !in(t,x[i])) return true; } return true; } /// Post constraint on \a x virtual void post(Gecode::Space& home, Gecode::SetVarArray& x, Gecode::IntVarArray&) { Gecode::precede(home, x, s, t); } }; /// %Test for multiple value precedence constraint class Multi : public SetTest { private: /// The values for precedence Gecode::IntArgs c; /// Check if \a i is a member of set \a x bool in(int i, int x) const { CountableSetRanges xr(ds,x); Iter::Ranges::Singleton ir(i,i); return Iter::Ranges::subset(ir,xr); } public: /// Create and register test Multi(const Gecode::IntArgs& c0) : SetTest("Precede::Multi::"+str(c0),4,ds,false), c(c0) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { for (int j=0; j * * Copyright: * Guido Tack, 2005 * * Last modified: * $Date: 2010-07-28 18:45:22 +0200 (Wed, 28 Jul 2010) $ by $Author: schulte $ * $Revision: 11297 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/set.hh" using namespace Gecode; namespace Test { namespace Set { /// %Tests for relation/operation constraints with constants namespace RelOpConst { /** * \defgroup TaskTestSetRelOpConst Relation/operation constraints with constants * \ingroup TaskTestSet */ //@{ static IntSet ds_33(-3,3); static IntSet ds_22(-2,2); static IntSet ds_12(-1,2); static IntSet iss[] = {IntSet(-1,1), IntSet(-4,-4), IntSet(0,2)}; /// %Test for set relation constraint with constants class RelSIS : public SetTest { private: IntSet is; Gecode::SetOpType sot; Gecode::SetRelType srt; bool inverse; template bool sol(I& i, J& j) const { switch (srt) { case SRT_EQ: return Iter::Ranges::equal(i,j); case SRT_NQ: return !Iter::Ranges::equal(i,j); case SRT_SUB: return Iter::Ranges::subset(i,j); case SRT_SUP: return Iter::Ranges::subset(j,i); case SRT_DISJ: { Gecode::Iter::Ranges::Inter inter(i,j); return !inter(); } case SRT_CMPL: { Gecode::Set::RangesCompl jc(j); return Iter::Ranges::equal(i,jc); } } GECODE_NEVER; return false; } public: /// Create and register test RelSIS(Gecode::SetOpType sot0, Gecode::SetRelType srt0, int intSet, bool inverse0) : SetTest("RelOp::ConstSIS::"+str(sot0)+"::"+str(srt0)+"::"+ str(intSet)+(inverse0 ? "i" :""),2,ds_22,false) , is(iss[intSet]), sot(sot0), srt(srt0), inverse(inverse0) {} /// %Test whether \a x is solution bool solution(const SetAssignment& x) const { IntSetRanges isr(is); CountableSetRanges xr0(x.lub, x[0]); CountableSetRanges xr1(x.lub, x[1]); switch (sot) { case SOT_UNION: { Iter::Ranges::Union u(isr, xr0); return sol(u,xr1); } break; case SOT_DUNION: { Iter::Ranges::Inter inter(isr, xr0); if (inter()) return false; Iter::Ranges::Union u(isr,xr0); return sol(u,xr1); } break; case SOT_INTER: { Iter::Ranges::Inter u(isr,xr0); return sol(u,xr1); } break; case SOT_MINUS: { if (!inverse) { Iter::Ranges::Diff u(isr,xr0); return sol(u,xr1); } else { Iter::Ranges::Diff u(xr0,isr); return sol(u,xr1); } } break; } GECODE_NEVER; return false; } /// Post constraint on \a x void post(Space& home, SetVarArray& x, IntVarArray&) { if (!inverse) Gecode::rel(home, is, sot, x[0], srt, x[1]); else Gecode::rel(home, x[0], sot, is, srt, x[1]); } }; /// %Test for set relation constraint with constants class RelSSI : public SetTest { private: IntSet is; Gecode::SetOpType sot; Gecode::SetRelType srt; template bool sol(I& i, J& j) const { switch (srt) { case SRT_EQ: return Iter::Ranges::equal(i,j); case SRT_NQ: return !Iter::Ranges::equal(i,j); case SRT_SUB: return Iter::Ranges::subset(i,j); case SRT_SUP: return Iter::Ranges::subset(j,i); case SRT_DISJ: { Gecode::Iter::Ranges::Inter inter(i,j); return !inter(); } case SRT_CMPL: { Gecode::Set::RangesCompl jc(j); return Iter::Ranges::equal(i,jc); } } GECODE_NEVER; return false; } public: /// Create and register test RelSSI(Gecode::SetOpType sot0, Gecode::SetRelType srt0, int intSet) : SetTest("RelOp::ConstSSI::"+str(sot0)+"::"+str(srt0)+"::"+ str(intSet),2,ds_22,false) , is(iss[intSet]), sot(sot0), srt(srt0) {} /// %Test whether \a x is solution bool solution(const SetAssignment& x) const { CountableSetRanges xr0(x.lub, x[0]); CountableSetRanges xr1(x.lub, x[1]); IntSetRanges isr(is); switch (sot) { case SOT_UNION: { Iter::Ranges::Union u(xr0, xr1); return sol(u,isr); } break; case SOT_DUNION: { Iter::Ranges::Inter inter(xr0, xr1); if (inter()) return false; Iter::Ranges::Union u(xr0, xr1); return sol(u,isr); } break; case SOT_INTER: { Iter::Ranges::Inter u(xr0,xr1); return sol(u,isr); } break; case SOT_MINUS: { Iter::Ranges::Diff u(xr0,xr1); return sol(u,isr); } break; } GECODE_NEVER; return false; } /// Post constraint on \a x void post(Space& home, SetVarArray& x, IntVarArray&) { Gecode::rel(home, x[0], sot, x[1], srt, is); } }; /// %Test for set relation constraint with constants class RelISI : public SetTest { private: IntSet is0; IntSet is1; Gecode::SetOpType sot; Gecode::SetRelType srt; bool inverse; template bool sol(I& i, J& j) const { switch (srt) { case SRT_EQ: return Iter::Ranges::equal(i,j); case SRT_NQ: return !Iter::Ranges::equal(i,j); case SRT_SUB: return Iter::Ranges::subset(i,j); case SRT_SUP: return Iter::Ranges::subset(j,i); case SRT_DISJ: { Gecode::Iter::Ranges::Inter inter(i,j); return !inter(); } case SRT_CMPL: { Gecode::Set::RangesCompl jc(j); return Iter::Ranges::equal(i,jc); } } GECODE_NEVER; return false; } public: /// Create and register test RelISI(Gecode::SetOpType sot0, Gecode::SetRelType srt0, int intSet0, int intSet1, bool inverse0) : SetTest("RelOp::ConstISI::"+str(sot0)+"::"+str(srt0)+"::"+ str(intSet0)+"::"+str(intSet1)+ (inverse0 ? "i" : ""),1,ds_33,false) , is0(iss[intSet0]), is1(iss[intSet1]), sot(sot0), srt(srt0) , inverse(inverse0) {} /// %Test whether \a x is solution bool solution(const SetAssignment& x) const { CountableSetRanges xr0(x.lub, x[0]); IntSetRanges isr0(is0); IntSetRanges isr1(is1); switch (sot) { case SOT_UNION: { Iter::Ranges::Union u(isr0, xr0); return sol(u,isr1); } break; case SOT_DUNION: { Iter::Ranges::Inter inter(isr0, xr0); if (inter()) return false; Iter::Ranges::Union u(isr0, xr0); return sol(u,isr1); } break; case SOT_INTER: { Iter::Ranges::Inter u(isr0,xr0); return sol(u,isr1); } break; case SOT_MINUS: { if (!inverse) { Iter::Ranges::Diff u(isr0,xr0); return sol(u,isr1); } else { Iter::Ranges::Diff u(xr0,isr0); return sol(u,isr1); } } break; } GECODE_NEVER; return false; } /// Post constraint on \a x void post(Space& home, SetVarArray& x, IntVarArray&) { if (!inverse) Gecode::rel(home, is0, sot, x[0], srt, is1); else Gecode::rel(home, x[0], sot, is0, srt, is1); } }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { using namespace Gecode; for (SetRelTypes srts; srts(); ++srts) { for (SetOpTypes sots; sots(); ++sots) { for (int i=0; i<=2; i++) { (void) new RelSIS(sots.sot(),srts.srt(),i,false); (void) new RelSIS(sots.sot(),srts.srt(),i,true); (void) new RelSSI(sots.sot(),srts.srt(),i); (void) new RelISI(sots.sot(),srts.srt(),i,0,false); (void) new RelISI(sots.sot(),srts.srt(),i,1,false); (void) new RelISI(sots.sot(),srts.srt(),i,2,false); (void) new RelISI(sots.sot(),srts.srt(),i,0,true); (void) new RelISI(sots.sot(),srts.srt(),i,1,true); (void) new RelISI(sots.sot(),srts.srt(),i,2,true); } } } } }; Create c; //@} }}} // STATISTICS: test-set gecode-4.2.1/test/set/rel-op.cpp0000644000175000010010000003630412022411512015531 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * * Copyright: * Guido Tack, 2005 * * Last modified: * $Date: 2012-09-07 17:31:22 +0200 (Fri, 07 Sep 2012) $ by $Author: schulte $ * $Revision: 13068 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/set.hh" using namespace Gecode; namespace Test { namespace Set { /// %Tests for relation/operation constraints namespace RelOp { /** * \defgroup TaskTestSetRelOp Relation/operation constraints * \ingroup TaskTestSet */ //@{ static IntSet ds_22(-2,2); static IntSet ds_12(-1,2); /// %Test for ternary relation constraint class Rel : public SetTest { private: Gecode::SetOpType sot; Gecode::SetRelType srt; int share; template bool sol(I& i, J& j) const { switch (srt) { case SRT_EQ: return Iter::Ranges::equal(i,j); case SRT_NQ: return !Iter::Ranges::equal(i,j); case SRT_SUB: return Iter::Ranges::subset(i,j); case SRT_SUP: return Iter::Ranges::subset(j,i); case SRT_DISJ: { Gecode::Iter::Ranges::Inter inter(i,j); return !inter(); } case SRT_CMPL: { Gecode::Set::RangesCompl jc(j); return Iter::Ranges::equal(i,jc); } } GECODE_NEVER; return false; } public: /// Create and register test Rel(Gecode::SetOpType sot0, Gecode::SetRelType srt0, int share0=0) : SetTest("RelOp::"+str(sot0)+"::"+str(srt0)+"::S"+str(share0), share0 == 0 ? 3 : 2,ds_22,false) , sot(sot0), srt(srt0), share(share0) {} /// %Test whether \a x is solution bool solution(const SetAssignment& x) const { int a=0, b=0, c=0; switch (share) { case 0: a=x[0]; b=x[1]; c=x[2]; break; case 1: a=x[0]; b=x[0]; c=x[0]; break; case 2: a=x[0]; b=x[0]; c=x[1]; break; case 3: a=x[0]; b=x[1]; c=x[0]; break; case 4: a=x[0]; b=x[1]; c=x[1]; break; } CountableSetRanges xr0(x.lub, a); CountableSetRanges xr1(x.lub, b); CountableSetRanges xr2(x.lub, c); switch (sot) { case SOT_UNION: { Iter::Ranges::Union u(xr0,xr1); return sol(u,xr2); } break; case SOT_DUNION: { Iter::Ranges::Inter inter(xr0,xr1); if (inter()) return false; Iter::Ranges::Union u(xr0,xr1); return sol(u,xr2); } break; case SOT_INTER: { Iter::Ranges::Inter u(xr0,xr1); return sol(u,xr2); } break; case SOT_MINUS: { Iter::Ranges::Diff u(xr0,xr1); return sol(u,xr2); } break; } GECODE_NEVER; return false; } /// Post constraint on \a x void post(Space& home, SetVarArray& x, IntVarArray&) { SetVar a,b,c; switch (share) { case 0: a=x[0]; b=x[1]; c=x[2]; break; case 1: a=x[0]; b=x[0]; c=x[0]; break; case 2: a=x[0]; b=x[0]; c=x[1]; break; case 3: a=x[0]; b=x[1]; c=x[0]; break; case 4: a=x[0]; b=x[1]; c=x[1]; break; } Gecode::rel(home, a, sot, b, srt, c); } }; /// Help class to create and register tests class Create { public: /// Perform creation and registration Create(void) { using namespace Gecode; for (SetRelTypes srts; srts(); ++srts) { for (SetOpTypes sots; sots(); ++sots) { for (int i=0; i<=4; i++) { (void) new Rel(sots.sot(),srts.srt(),i); } } } } }; Create c; /// %Test for n-ary partition constraint class RelN : public SetTest { private: Gecode::SetOpType sot; int n; int shared; bool withConst; IntSet is; public: /// Create and register test RelN(Gecode::SetOpType sot0, int n0, int shared0, bool withConst0) : SetTest("RelOp::N::"+str(sot0)+"::"+str(n0)+"::S"+str(shared0)+ "::C"+str(withConst0 ? 1 : 0), shared0 == 0 ? n0+1 : (shared0 <= 2 ? 3 : 2),ds_12,false) , sot(sot0), n(n0), shared(shared0), withConst(withConst0) , is(0,1) {} /// %Test whether \a x is solution bool solution(const SetAssignment& x) const { int realN = shared == 0 ? n : 3; CountableSetRanges* isrs = new CountableSetRanges[realN]; switch (shared) { case 0: for (int i=realN; i--; ) isrs[i].init(x.lub, x[i]); break; case 1: isrs[0].init(x.lub, x[0]); isrs[1].init(x.lub, x[0]); isrs[2].init(x.lub, x[1]); break; case 2: isrs[0].init(x.lub, x[0]); isrs[1].init(x.lub, x[1]); isrs[2].init(x.lub, x[2]); break; case 3: isrs[0].init(x.lub, x[0]); isrs[1].init(x.lub, x[1]); isrs[2].init(x.lub, x[0]); break; default: GECODE_NEVER; } int result = shared == 0 ? x.size() - 1 : (shared <= 2 ? 2 : 0); CountableSetRanges xnr(x.lub, x[result]); switch (sot) { case SOT_DUNION: { if (shared == 1 && (isrs[0]() || isrs[1]())) { delete[] isrs; return false; } if (shared == 3 && (isrs[0]() || isrs[2]())) { delete[] isrs; return false; } unsigned int cardSum = 0; if (shared == 1 || shared == 3) { CountableSetRanges x1r(x.lub, x[1]); cardSum = Iter::Ranges::size(x1r); } else { for (int i=0; i uu(isr, u); eq = Iter::Ranges::equal(uu, xnr); } else { Region r(*fs); Iter::Ranges::NaryUnion u(r, isrs, realN); eq = Iter::Ranges::equal(u, xnr); } delete [] isrs; delete fs; return eq; } case SOT_INTER: { if (withConst) { FakeSpace* fs = new FakeSpace; bool eq; { Region r(*fs); Iter::Ranges::NaryInter u(r, isrs, realN); IntSetRanges isr(is); Iter::Ranges::Inter uu(isr, u); eq = (realN == 0 ? Iter::Ranges::equal(isr, xnr) : Iter::Ranges::equal(uu, xnr)); delete [] isrs; } delete fs; return eq; } else { if (realN == 0) { bool ret = Iter::Ranges::size(xnr) == Gecode::Set::Limits::card; delete [] isrs; return ret; } else { FakeSpace* fs = new FakeSpace; bool eq; { Region r(*fs); Iter::Ranges::NaryInter u(r,isrs, realN); eq = Iter::Ranges::equal(u, xnr); } delete [] isrs; delete fs; return eq; } } } default: GECODE_NEVER; } GECODE_NEVER; return false; } /// Post constraint on \a x void post(Space& home, SetVarArray& x, IntVarArray&) { int size = shared == 0 ? x.size()-1 : 3; SetVarArgs xs(size); SetVar xn; switch (shared) { case 0: for (int i=x.size()-1; i--;) xs[i]=x[i]; xn = x[x.size()-1]; break; case 1: xs[0] = x[0]; xs[1] = x[0]; xs[2] = x[1]; xn = x[2]; break; case 2: xs[0] = x[0]; xs[1] = x[1]; xs[2] = x[2]; xn = x[2]; break; case 3: xs[0] = x[0]; xs[1] = x[1]; xs[2] = x[0]; xn = x[0]; break; default: GECODE_NEVER; break; } if (!withConst) Gecode::rel(home, sot, xs, xn); else Gecode::rel(home, sot, xs, is, xn); } }; /// Help class to create and register tests class CreateN { public: /// Perform creation and registration CreateN(void) { for (int wc=0; wc<=1; wc++) { for (int i=0; i<=3; i++) { (void) new RelN(Gecode::SOT_UNION, i, 0, wc); (void) new RelN(Gecode::SOT_DUNION, i, 0, wc); (void) new RelN(Gecode::SOT_INTER, i, 0, wc); if (i>0) { (void) new RelN(Gecode::SOT_UNION, 0, i, wc); (void) new RelN(Gecode::SOT_DUNION, 0, i, wc); (void) new RelN(Gecode::SOT_INTER, 0, i, wc); } } } } }; CreateN cn; /// %Test for n-ary partition constraint class RelIntN : public SetTest { private: Gecode::SetOpType sot; int n; bool withConst; IntSet is; public: /// Create and register test RelIntN(Gecode::SetOpType sot0, int n0, bool withConst0) : SetTest("RelOp::IntN::"+str(sot0)+"::"+str(n0)+ "::C"+str(withConst0 ? 1 : 0), 1,ds_12,false,n0) , sot(sot0), n(n0), withConst(withConst0) , is(0,1) {} /// %Test whether \a x is solution bool solution(const SetAssignment& x) const { int* isrs = new int[n]; for (int i=0; i(n)) { delete[] isrs; return false; } if (withConst) { IntSetRanges isr(is); cardSum += Iter::Ranges::size(isr); } CountableSetRanges xnr2(x.lub, x[0]); if (cardSum != Iter::Ranges::size(xnr2)) { delete[] isrs; return false; } } // fall through to union case case SOT_UNION: { if (withConst) { IntSetRanges issr(iss); IntSetRanges isr(is); Iter::Ranges::Union uu(isr, issr); delete[] isrs; return Iter::Ranges::equal(uu, xnr); } else { IntSetRanges issr(iss); delete[] isrs; return Iter::Ranges::equal(issr, xnr); } } case SOT_INTER: { bool allEqual = true; for (int i=1; i uu(isr, s); delete[] isrs; return Iter::Ranges::equal(uu, xnr); } } else { delete[] isrs; return Iter::Ranges::size(xnr) == 0; } } else { if (allEqual) { if (n == 0) { delete[] isrs; return Iter::Ranges::size(xnr) == Gecode::Set::Limits::card; } else { Iter::Ranges::Singleton s(isrs[0],isrs[0]); delete[] isrs; return Iter::Ranges::equal(s, xnr); } } else { delete[] isrs; return Iter::Ranges::size(xnr) == 0; } } } default: GECODE_NEVER; } GECODE_NEVER; return false; } /// Post constraint on \a x void post(Space& home, SetVarArray& x, IntVarArray& y) { if (!withConst) Gecode::rel(home, sot, y, x[0]); else Gecode::rel(home, sot, y, is, x[0]); } }; /// Help class to create and register tests class CreateIntN { public: /// Perform creation and registration CreateIntN(void) { for (int wc=0; wc<=1; wc++) { for (int i=0; i<=3; i++) { (void) new RelIntN(Gecode::SOT_UNION, i, wc); (void) new RelIntN(Gecode::SOT_DUNION, i, wc); (void) new RelIntN(Gecode::SOT_INTER, i, wc); } } } }; CreateIntN intcn; //@} }}} // STATISTICS: test-set gecode-4.2.1/test/set/rel.cpp0000644000175000010010000001305312040147742015124 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * * Copyright: * Guido Tack, 2005 * * Last modified: * $Date: 2012-10-19 05:58:26 +0200 (Fri, 19 Oct 2012) $ by $Author: tack $ * $Revision: 13156 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/set.hh" using namespace Gecode; namespace Test { namespace Set { /// %Tests for relation constraints namespace Rel { /** * \defgroup TaskTestSetRel Relation constraints * \ingroup TaskTestSet */ //@{ static IntSet ds_33(-3,3); /// %Test for binary set relation constraint class RelBin : public SetTest { private: Gecode::SetRelType srt; bool shared; public: /// Create and register test RelBin(Gecode::SetRelType srt0, bool shared0) : SetTest("Rel::Bin::"+str(srt0)+"::S"+(shared0 ? "1":"0"), shared ? 1 : 2,ds_33,true) , srt(srt0), shared(shared0){} int minSymDiff(const SetAssignment& x) const { int x1 = shared ? x[0] : x[1]; typedef Iter::Ranges::Diff Diff; CountableSetRanges xr00(x.lub, x[0]); CountableSetRanges xr10(x.lub, x1); Diff a(xr00,xr10); CountableSetRanges xr01(x.lub, x[0]); CountableSetRanges xr11(x.lub, x1); Diff b(xr11,xr01); Iter::Ranges::Union u(a,b); return u() ? u.min() : Gecode::Set::Limits::max+1; } bool in(int i, CountableSetRanges& c, bool eq=false) const { if (eq && i==Gecode::Set::Limits::max+1) return true; Iter::Ranges::Singleton s(i,i); return Iter::Ranges::subset(s,c); } /// %Test whether \a x is solution bool solution(const SetAssignment& x) const { int x1 = shared ? x[0] : x[1]; CountableSetRanges xr0(x.lub, x[0]); CountableSetRanges xr1(x.lub, x1); switch (srt) { case SRT_EQ: return Iter::Ranges::equal(xr0, xr1); case SRT_NQ: return !Iter::Ranges::equal(xr0, xr1); case SRT_LQ: return (!xr0()) || in(minSymDiff(x),xr1,true); case SRT_LE: return xr0() ? in(minSymDiff(x),xr1) : xr1(); case SRT_GQ: return (!xr1()) || in(minSymDiff(x),xr0,true); case SRT_GR: return xr1() ? in(minSymDiff(x),xr0) : xr0(); case SRT_SUB: return Iter::Ranges::subset(xr0, xr1); case SRT_SUP: return Iter::Ranges::subset(xr1, xr0); case SRT_DISJ: { Iter::Ranges::Inter inter(xr0,xr1); return !inter(); } case SRT_CMPL: { Gecode::Set::RangesCompl rc(xr0); return Iter::Ranges::equal(rc,xr1); } default: GECODE_NEVER; } GECODE_NEVER; return false; } /// Post constraint on \a x void post(Space& home, SetVarArray& x, IntVarArray&) { if (!shared) Gecode::rel(home, x[0], srt, x[1]); else Gecode::rel(home, x[0], srt, x[0]); } /// Post reified constraint on \a x for \a b void post(Space& home, SetVarArray& x, IntVarArray&, Reify r) { if (!shared) Gecode::rel(home, x[0], srt, x[1], r); else Gecode::rel(home, x[0], srt, x[0], r); } }; RelBin _relbin_eq(Gecode::SRT_EQ,false); RelBin _relbin_lq(Gecode::SRT_LQ,false); RelBin _relbin_le(Gecode::SRT_LE,false); RelBin _relbin_gq(Gecode::SRT_GQ,false); RelBin _relbin_gr(Gecode::SRT_GR,false); RelBin _relbin_nq(Gecode::SRT_NQ,false); RelBin _relbin_sub(Gecode::SRT_SUB,false); RelBin _relbin_sup(Gecode::SRT_SUP,false); RelBin _relbin_disj(Gecode::SRT_DISJ,false); RelBin _relbin_cmpl(Gecode::SRT_CMPL,false); RelBin _relbin_shared_eq(Gecode::SRT_EQ,true); RelBin _relbin_shared_lq(Gecode::SRT_LQ,true); RelBin _relbin_shared_le(Gecode::SRT_LE,true); RelBin _relbin_shared_gq(Gecode::SRT_GQ,true); RelBin _relbin_shared_gr(Gecode::SRT_GR,true); RelBin _relbin_shared_nq(Gecode::SRT_NQ,true); RelBin _relbin_shared_sub(Gecode::SRT_SUB,true); RelBin _relbin_shared_sup(Gecode::SRT_SUP,true); RelBin _relbin_shared_disj(Gecode::SRT_DISJ,true); RelBin _relbin_shared_cmpl(Gecode::SRT_CMPL,true); //@} }}} // STATISTICS: test-set gecode-4.2.1/test/set/sequence.cpp0000644000175000010010000001004212022411512016132 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * * Copyright: * Guido Tack, 2005 * * Last modified: * $Date: 2012-09-07 17:31:22 +0200 (Fri, 07 Sep 2012) $ by $Author: schulte $ * $Revision: 13068 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/set.hh" using namespace Gecode; namespace Test { namespace Set { /// %Tests for sequence constraints namespace Sequence { /** * \defgroup TaskTestSetSequence Sequence constraints * \ingroup TaskTestSet */ //@{ static IntSet ds_33(-1,2); /// %Test for sequence constraint class Sequence : public SetTest { public: /// Create and register test Sequence(const char* t) : SetTest(t,4,ds_33,false) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { int max = Gecode::Set::Limits::min - 1; for (int i=0; i<4; i++) { CountableSetRanges xir(x.lub, x[i]); IntSet xi(xir); if (xi.ranges() > 0) { int oldMax = max; max = xi.max(); if (xi.min() <= oldMax) return false; } } return true; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray&) { Gecode::sequence(home, x); } }; Sequence _sequence("Sequence::Sequence"); /// %Test for sequential-union constraint class SeqU : public SetTest { private: int n; public: /// Create and register test SeqU(int n0) : SetTest("Sequence::SeqU"+str(n0),n0+1,ds_33,false), n(n0) {} /// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { int max = Gecode::Set::Limits::min - 1; for (int i=0; i 0) { int oldMax = max; max = xi.max(); if (xi.min() <= oldMax) return false; } } CountableSetRanges* isrs = new CountableSetRanges[n]; for (int i=n; i--; ) isrs[i].init(x.lub, x[i]); FakeSpace* fs = new FakeSpace; bool ret; { Region r(*fs); Iter::Ranges::NaryUnion u(r, isrs, n); CountableSetRanges xnr(x.lub, x[n]); ret = Iter::Ranges::equal(u, xnr); } delete[] isrs; delete fs; return ret; } /// Post constraint on \a x virtual void post(Space& home, SetVarArray& x, IntVarArray&) { SetVarArgs xs(x.size()-1); for (int i=x.size()-1; i--;) xs[i]=x[i]; Gecode::sequence(home, xs, x[x.size()-1]); } }; SeqU _sequ0(0); SeqU _sequ1(1); SeqU _sequ3(3); }}} // STATISTICS: test-set gecode-4.2.1/test/set.cpp0000644000175000010010000007025112115372736014353 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * Christian Schulte * Mikael Lagerkvist * * Copyright: * Guido Tack, 2005 * Christian Schulte, 2005 * Mikael Lagerkvist, 2005 * * Last modified: * $Date: 2013-03-05 14:40:46 +0100 (Tue, 05 Mar 2013) $ by $Author: schulte $ * $Revision: 13435 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/set.hh" #include namespace Test { namespace Set { CountableSet::CountableSet(const Gecode::IntSet& d0) : d(d0), cur(0) { Gecode::IntSetRanges isr(d); lubmax = static_cast(pow(static_cast(2.0), static_cast(Gecode::Iter::Ranges::size(isr)))); } void CountableSet::operator++(void) { cur++; } void CountableSet::init(const Gecode::IntSet& d0) { d = d0; cur = 0; Gecode::IntSetRanges isr(d); lubmax = static_cast(pow(static_cast(2.0), static_cast(Gecode::Iter::Ranges::size(isr)))); } int CountableSet::val(void) const { return cur; } SetAssignment::SetAssignment(int n0, const Gecode::IntSet& d0, int _withInt) : n(n0), dsv(new CountableSet[n]), ir(_withInt, d0), done(false), lub(d0), withInt(_withInt) { for (int i=n; i--; ) dsv[i].init(lub); } void SetAssignment::operator++(void) { int i = n-1; while (true) { ++dsv[i]; if (dsv[i]()) return; dsv[i].init(lub); --i; if (i<0) { if (withInt==0) { done = true; return; } ++ir; if (ir()) { i = n-1; for (int j=n; j--; ) dsv[j].init(lub); } else { done = true; return; } } } } }} std::ostream& operator<<(std::ostream& os, const Test::Set::SetAssignment& a) { int n = a.size(); os << "{"; for (int i=0; i 0) os << a.ints(); return os; } namespace Test { namespace Set { SetTestSpace::SetTestSpace(int n, Gecode::IntSet& d0, int i, SetTest* t, bool log) : d(d0), y(*this, i, d), withInt(i), r(Gecode::BoolVar(*this, 0, 1),Gecode::RM_EQV), reified(false), test(t) { using namespace Gecode; IntSet u(Gecode::Set::Limits::min,Gecode::Set::Limits::max); x = SetVarArray(*this, n, Gecode::IntSet::empty, u); SetVarArgs _x(*this, n, Gecode::IntSet::empty, d); if (x.size() == 1) dom(*this,x[0],_x[0]); else dom(*this,x,_x); if (opt.log && log) { olog << ind(2) << "Initial: x[]=" << x; olog << " y[]=" << y; olog << std::endl; } } SetTestSpace::SetTestSpace(int n, Gecode::IntSet& d0, int i, SetTest* t, Gecode::ReifyMode rm, bool log) : d(d0), x(*this, n, Gecode::IntSet::empty, d), y(*this, i, d), withInt(i), r(Gecode::BoolVar(*this, 0, 1),rm), reified(true), test(t) { if (opt.log && log) { olog << ind(2) << "Initial: x[]=" << x; olog << " y[]=" << y; olog << " b=" << r.var(); olog << std::endl; } } SetTestSpace::SetTestSpace(bool share, SetTestSpace& s) : Gecode::Space(share,s), d(s.d), withInt(s.withInt), reified(s.reified), test(s.test) { x.update(*this, share, s.x); y.update(*this, share, s.y); Gecode::BoolVar b; Gecode::BoolVar sr(s.r.var()); b.update(*this, share, sr); r.var(b); r.mode(s.r.mode()); } Gecode::Space* SetTestSpace::copy(bool share) { return new SetTestSpace(share,*this); } void SetTestSpace::post(void) { if (reified){ test->post(*this,x,y,r); if (opt.log) olog << ind(3) << "Posting reified propagator" << std::endl; } else { test->post(*this,x,y); if (opt.log) olog << ind(3) << "Posting propagator" << std::endl; } } bool SetTestSpace::failed(void) { if (opt.log) { olog << ind(3) << "Fixpoint: x[]=" << x << " y[]=" << y << std::endl; bool f=(status() == Gecode::SS_FAILED); olog << ind(3) << " --> x[]=" << x << " y[]=" << y << std::endl; return f; } else { return status() == Gecode::SS_FAILED; } } void SetTestSpace::rel(int i, Gecode::SetRelType srt, const Gecode::IntSet& is) { if (opt.log) { olog << ind(4) << "x[" << i << "] "; switch (srt) { case Gecode::SRT_EQ: olog << "="; break; case Gecode::SRT_LQ: olog << "<="; break; case Gecode::SRT_LE: olog << "<"; break; case Gecode::SRT_GQ: olog << ">="; break; case Gecode::SRT_GR: olog << ">"; break; case Gecode::SRT_NQ: olog << "!="; break; case Gecode::SRT_SUB: olog << "sub"; break; case Gecode::SRT_SUP: olog << "sup"; break; case Gecode::SRT_DISJ: olog << "||"; break; case Gecode::SRT_CMPL: olog << "^-1 = "; break; } olog << is << std::endl; } Gecode::dom(*this, x[i], srt, is); } void SetTestSpace::cardinality(int i, int cmin, int cmax) { if (opt.log) { olog << ind(4) << cmin << " <= #(x[" << i << "]) <= " << cmax << std::endl; } Gecode::cardinality(*this, x[i], cmin, cmax); } void SetTestSpace::rel(int i, Gecode::IntRelType irt, int n) { if (opt.log) { olog << ind(4) << "y[" << i << "] "; switch (irt) { case Gecode::IRT_EQ: olog << "="; break; case Gecode::IRT_NQ: olog << "!="; break; case Gecode::IRT_LQ: olog << "<="; break; case Gecode::IRT_LE: olog << "<"; break; case Gecode::IRT_GQ: olog << ">="; break; case Gecode::IRT_GR: olog << ">"; break; } olog << " " << n << std::endl; } Gecode::rel(*this, y[i], irt, n); } void SetTestSpace::rel(bool sol) { int n = sol ? 1 : 0; assert(reified); if (opt.log) olog << ind(4) << "b = " << n << std::endl; Gecode::rel(*this, r.var(), Gecode::IRT_EQ, n); } void SetTestSpace::assign(const SetAssignment& a) { for (int i=a.size(); i--; ) { CountableSetRanges csv(a.lub, a[i]); Gecode::IntSet ai(csv); rel(i, Gecode::SRT_EQ, ai); if (Base::fixpoint() && failed()) return; } for (int i=withInt; i--; ) { rel(i, Gecode::IRT_EQ, a.ints()[i]); if (Base::fixpoint() && failed()) return; } } bool SetTestSpace::assigned(void) const { for (int i=x.size(); i--; ) if (!x[i].assigned()) return false; for (int i=y.size(); i--; ) if (!y[i].assigned()) return false; return true; } void SetTestSpace::removeFromLub(int v, int i, const SetAssignment& a) { using namespace Gecode; SetVarUnknownRanges ur(x[i]); CountableSetRanges air(a.lub, a[i]); Gecode::Iter::Ranges::Diff diff(ur, air); Gecode::Iter::Ranges::ToValues > diffV(diff); for (int j=0; j inter(ur, air); Gecode::Iter::Ranges::ToValues > interV(inter); for (int j=0; j(clone()); if (opt.log) olog << ind(3) << "Testing fixpoint on copy" << std::endl; c->post(); if (c->failed()) { delete c; return false; } for (int i=x.size(); i--; ) if (x[i].glbSize() != c->x[i].glbSize() || x[i].lubSize() != c->x[i].lubSize() || x[i].cardMin() != c->x[i].cardMin() || x[i].cardMax() != c->x[i].cardMax()) { delete c; return false; } for (int i=y.size(); i--; ) if (y[i].size() != c->y[i].size()) { delete c; return false; } if (reified && (r.var().size() != c->r.var().size())) { delete c; return false; } if (opt.log) olog << ind(3) << "Finished testing fixpoint on copy" << std::endl; delete c; return true; } bool SetTestSpace::prune(const SetAssignment& a) { using namespace Gecode; bool setsAssigned = true; for (int j=x.size(); j--; ) if (!x[j].assigned()) { setsAssigned = false; break; } bool intsAssigned = true; for (int j=y.size(); j--; ) if (!y[j].assigned()) { intsAssigned = false; break; } // Select variable to be pruned int i; if (intsAssigned) { i = Base::rand(x.size()); } else if (setsAssigned) { i = Base::rand(y.size()); } else { i = Base::rand(x.size()+y.size()); } if (setsAssigned || i>=x.size()) { if (i>=x.size()) i = i-x.size(); while (y[i].assigned()) { i = (i+1) % y.size(); } // Prune int var // Select mode for pruning switch (Base::rand(3)) { case 0: if (a.ints()[i] < y[i].max()) { int v=a.ints()[i]+1+ Base::rand(static_cast(y[i].max()-a.ints()[i])); assert((v > a.ints()[i]) && (v <= y[i].max())); rel(i, Gecode::IRT_LE, v); } break; case 1: if (a.ints()[i] > y[i].min()) { int v=y[i].min()+ Base::rand(static_cast(a.ints()[i]-y[i].min())); assert((v < a.ints()[i]) && (v >= y[i].min())); rel(i, Gecode::IRT_GR, v); } break; default: int v; Gecode::Int::ViewRanges it(y[i]); unsigned int skip = Base::rand(y[i].size()-1); while (true) { if (it.width() > skip) { v = it.min() + skip; if (v == a.ints()[i]) { if (it.width() == 1) { ++it; v = it.min(); } else if (v < it.max()) { ++v; } else { --v; } } break; } skip -= it.width(); ++it; } rel(i, Gecode::IRT_NQ, v); } return (!Base::fixpoint() || fixprob()); } while (x[i].assigned()) { i = (i+1) % x.size(); } Gecode::SetVarUnknownRanges ur1(x[i]); CountableSetRanges air1(a.lub, a[i]); Gecode::Iter::Ranges::Diff diff(ur1, air1); Gecode::SetVarUnknownRanges ur2(x[i]); CountableSetRanges air2(a.lub, a[i]); Gecode::Iter::Ranges::Inter inter(ur2, air2); CountableSetRanges aisizer(a.lub, a[i]); unsigned int aisize = Gecode::Iter::Ranges::size(aisizer); // Select mode for pruning switch (Base::rand(5)) { case 0: if (inter()) { int v = Base::rand(Gecode::Iter::Ranges::size(inter)); addToGlb(v, i, a); } break; case 1: if (diff()) { int v = Base::rand(Gecode::Iter::Ranges::size(diff)); removeFromLub(v, i, a); } break; case 2: if (x[i].cardMin() < aisize) { unsigned int newc = x[i].cardMin() + 1 + Base::rand(aisize - x[i].cardMin()); assert( newc > x[i].cardMin() ); assert( newc <= aisize ); cardinality(i, newc, Gecode::Set::Limits::card); } break; case 3: if (x[i].cardMax() > aisize) { unsigned int newc = x[i].cardMax() - 1 - Base::rand(x[i].cardMax() - aisize); assert( newc < x[i].cardMax() ); assert( newc >= aisize ); cardinality(i, 0, newc); } break; default: if (inter()) { int v = Base::rand(Gecode::Iter::Ranges::size(inter)); addToGlb(v, i, a); } else { int v = Base::rand(Gecode::Iter::Ranges::size(diff)); removeFromLub(v, i, a); } } return (!Base::fixpoint() || fixprob()); } /// Check the test result and handle failed test #define CHECK_TEST(T,M) \ if (opt.log) \ olog << ind(3) << "Check: " << (M) << std::endl; \ if (!(T)) { \ problem = (M); delete s; goto failed; \ } /// Start new test #define START_TEST(T) \ if (opt.log) { \ olog.str(""); \ olog << ind(2) << "Testing: " << (T) << std::endl; \ } \ test = (T); bool SetTest::run(void) { using namespace Gecode; const char* test = "NONE"; const char* problem = "NONE"; SetAssignment* ap = new SetAssignment(arity,lub,withInt); SetAssignment& a = *ap; while (a()) { bool is_sol = solution(a); if (opt.log) olog << ind(1) << "Assignment: " << a << (is_sol ? " (solution)" : " (no solution)") << std::endl; START_TEST("Assignment (after posting)"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this); SetTestSpace* sc = NULL; s->post(); switch (Base::rand(3)) { case 0: if (opt.log) olog << ind(3) << "No copy" << std::endl; sc = s; s = NULL; break; case 1: if (opt.log) olog << ind(3) << "Unshared copy" << std::endl; if (s->status() != Gecode::SS_FAILED) { sc = static_cast(s->clone(true)); } else { sc = s; s = NULL; } break; case 2: if (opt.log) olog << ind(3) << "Unshared copy" << std::endl; if (s->status() != Gecode::SS_FAILED) { sc = static_cast(s->clone(false)); } else { sc = s; s = NULL; } break; default: assert(false); } sc->assign(a); if (is_sol) { CHECK_TEST(!sc->failed(), "Failed on solution"); CHECK_TEST(sc->propagators()==0, "No subsumption"); } else { CHECK_TEST(sc->failed(), "Solved on non-solution"); } delete s; delete sc; } START_TEST("Assignment (before posting)"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this); s->assign(a); s->post(); if (is_sol) { CHECK_TEST(!s->failed(), "Failed on solution"); CHECK_TEST(s->propagators()==0, "No subsumption"); } else { CHECK_TEST(s->failed(), "Solved on non-solution"); } delete s; } START_TEST("Prune"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this); s->post(); while (!s->failed() && !s->assigned()) if (!s->prune(a)) { problem = "No fixpoint"; delete s; goto failed; } s->assign(a); if (is_sol) { CHECK_TEST(!s->failed(), "Failed on solution"); CHECK_TEST(s->propagators()==0, "No subsumption"); } else { CHECK_TEST(s->failed(), "Solved on non-solution"); } delete s; } if (reified) { START_TEST("Assignment reified (rewrite after post, <=>)"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_EQV); s->post(); s->rel(is_sol); s->assign(a); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); delete s; } START_TEST("Assignment reified (rewrite after post, =>)"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_IMP); s->post(); s->rel(is_sol); s->assign(a); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); delete s; } START_TEST("Assignment reified (rewrite after post, <=)"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_PMI); s->post(); s->rel(is_sol); s->assign(a); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); delete s; } { START_TEST("Assignment reified (rewrite failure, <=>)"); SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_EQV); s->post(); s->rel(!is_sol); s->assign(a); CHECK_TEST(s->failed(), "Not failed"); delete s; } { START_TEST("Assignment reified (rewrite failure, =>)"); SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_IMP); s->post(); s->rel(!is_sol); s->assign(a); if (is_sol) { CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); } else { CHECK_TEST(s->failed(), "Not failed"); } delete s; } { START_TEST("Assignment reified (rewrite failure, <=)"); SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_PMI); s->post(); s->rel(!is_sol); s->assign(a); if (is_sol) { CHECK_TEST(s->failed(), "Not failed"); } else { CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); } delete s; } START_TEST("Assignment reified (immediate rewrite, <=>)"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_EQV); s->rel(is_sol); s->post(); s->assign(a); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); delete s; } START_TEST("Assignment reified (immediate rewrite, =>)"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_IMP); s->rel(is_sol); s->post(); s->assign(a); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); delete s; } START_TEST("Assignment reified (immediate rewrite, <=)"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_PMI); s->rel(is_sol); s->post(); s->assign(a); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); delete s; } START_TEST("Assignment reified (immediate failure, <=>)"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_EQV); s->rel(!is_sol); s->post(); s->assign(a); CHECK_TEST(s->failed(), "Not failed"); delete s; } START_TEST("Assignment reified (immediate failure, =>)"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_IMP); s->rel(!is_sol); s->post(); s->assign(a); if (is_sol) { CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); } else { CHECK_TEST(s->failed(), "Not failed"); } delete s; } START_TEST("Assignment reified (immediate failure, <=)"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_PMI); s->rel(!is_sol); s->post(); s->assign(a); if (is_sol) { CHECK_TEST(s->failed(), "Not failed"); } else { CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); } delete s; } START_TEST("Assignment reified (before posting, <=>)"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_EQV); s->assign(a); s->post(); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); CHECK_TEST(s->r.var().assigned(), "Control variable unassigned"); if (is_sol) { CHECK_TEST(s->r.var().val()==1, "Zero on solution"); } else { CHECK_TEST(s->r.var().val()==0, "One on non-solution"); } delete s; } START_TEST("Assignment reified (before posting, =>)"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_IMP); s->assign(a); s->post(); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); if (is_sol) { CHECK_TEST(!s->r.var().assigned(), "Control variable assigned"); } else { CHECK_TEST(s->r.var().assigned(), "Control variable unassigned"); CHECK_TEST(s->r.var().val()==0, "One on non-solution"); } delete s; } START_TEST("Assignment reified (before posting, <=)"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_PMI); s->assign(a); s->post(); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); if (is_sol) { CHECK_TEST(s->r.var().assigned(), "Control variable unassigned"); CHECK_TEST(s->r.var().val()==1, "Zero on solution"); } else { CHECK_TEST(!s->r.var().assigned(), "Control variable assigned"); } delete s; } START_TEST("Assignment reified (after posting, <=>)"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_EQV); s->post(); s->assign(a); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); CHECK_TEST(s->r.var().assigned(), "Control variable unassigned"); if (is_sol) { CHECK_TEST(s->r.var().val()==1, "Zero on solution"); } else { CHECK_TEST(s->r.var().val()==0, "One on non-solution"); } delete s; } START_TEST("Assignment reified (after posting, =>)"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_IMP); s->post(); s->assign(a); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); if (is_sol) { CHECK_TEST(!s->r.var().assigned(), "Control variable assigned"); } else { CHECK_TEST(s->r.var().assigned(), "Control variable unassigned"); CHECK_TEST(s->r.var().val()==0, "One on non-solution"); } delete s; } START_TEST("Assignment reified (after posting, <=)"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_PMI); s->post(); s->assign(a); CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); if (is_sol) { CHECK_TEST(s->r.var().assigned(), "Control variable unassigned"); CHECK_TEST(s->r.var().val()==1, "Zero on solution"); } else { CHECK_TEST(!s->r.var().assigned(), "Control variable assigned"); } delete s; } START_TEST("Prune reified, <=>"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_EQV); s->post(); while (!s->failed() && (!s->assigned() || !s->r.var().assigned())) if (!s->prune(a)) { problem = "No fixpoint"; delete s; goto failed; } CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); CHECK_TEST(s->r.var().assigned(), "Control variable unassigned"); if (is_sol) { CHECK_TEST(s->r.var().val()==1, "Zero on solution"); } else { CHECK_TEST(s->r.var().val()==0, "One on non-solution"); } delete s; } START_TEST("Prune reified, =>"); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_IMP); s->post(); while (!s->failed() && (!s->assigned() || (!is_sol && !s->r.var().assigned()))) if (!s->prune(a)) { problem = "No fixpoint"; delete s; goto failed; } CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); if (is_sol) { CHECK_TEST(!s->r.var().assigned(), "Control variable assigned"); } else { CHECK_TEST(s->r.var().assigned(), "Control variable unassigned"); CHECK_TEST(s->r.var().val()==0, "One on non-solution"); } delete s; } START_TEST("Prune reified, <="); { SetTestSpace* s = new SetTestSpace(arity,lub,withInt,this,RM_PMI); s->post(); while (!s->failed() && (!s->assigned() || (is_sol && !s->r.var().assigned()))) if (!s->prune(a)) { problem = "No fixpoint"; delete s; goto failed; } CHECK_TEST(!s->failed(), "Failed"); CHECK_TEST(s->propagators()==0, "No subsumption"); if (is_sol) { CHECK_TEST(s->r.var().assigned(), "Control variable unassigned"); CHECK_TEST(s->r.var().val()==1, "Zero on solution"); } else { CHECK_TEST(!s->r.var().assigned(), "Control variable assigned"); } delete s; } } ++a; } delete ap; return true; failed: if (opt.log) olog << "FAILURE" << std::endl << ind(1) << "Test: " << test << std::endl << ind(1) << "Problem: " << problem << std::endl; if (a() && opt.log) olog << ind(1) << "Assignment: " << a << std::endl; delete ap; return false; } const Gecode::SetRelType SetRelTypes::srts[] = {Gecode::SRT_EQ,Gecode::SRT_NQ,Gecode::SRT_SUB, Gecode::SRT_SUP,Gecode::SRT_DISJ,Gecode::SRT_CMPL}; const Gecode::SetOpType SetOpTypes::sots[] = {Gecode::SOT_UNION, Gecode::SOT_DUNION, Gecode::SOT_INTER, Gecode::SOT_MINUS}; }} #undef START_TEST #undef CHECK_TEST // STATISTICS: test-set gecode-4.2.1/test/set.hh0000644000175000010010000002756312040147742014172 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * Christian Schulte * * Copyright: * Guido Tack, 2005 * Christian Schulte, 2005 * * Last modified: * $Date: 2012-10-19 05:58:26 +0200 (Fri, 19 Oct 2012) $ by $Author: tack $ * $Revision: 13156 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef __GECODE_TEST_SET_HH__ #define __GECODE_TEST_SET_HH__ #include #include "test/test.hh" #include "test/int.hh" namespace Test { /// Testing finite sets namespace Set { /** * \defgroup TaskTestSet Testing finite sets * \ingroup TaskTest */ /// Fake space for creation of regions class FakeSpace : public Gecode::Space { public: /// Faked constructor FakeSpace(void) {} /// Faked copy function virtual Gecode::Space* copy(bool share) { (void) share; return NULL; } }; /** * \defgroup TaskTestSetSupport General set test support * \ingroup TaskTestSet */ //@{ /// Value iterator producing subsets of an IntSet class CountableSetValues { private: Gecode::IntSetValues dv; int cur; int i; public: /// Default constructor CountableSetValues(void) {} /// Initialize with set \a d0 and bit-pattern \a cur0 CountableSetValues(const Gecode::IntSet& d0, int cur0) : dv(d0), cur(cur0), i(1) { if (! (i & cur)) operator++(); } /// Initialize with set \a d0 and bit-pattern \a cur0 void init(const Gecode::IntSet& d0, int cur0) { dv = d0; cur = cur0; i = 1; if (! (i & cur)) operator++(); } /// Test if finished bool operator()(void) const { return i<=cur; } /// Move to next value void operator++(void) { do { ++dv; i = i<<1; } while (! (i & cur) && i { private: /// The corresponding value iterator CountableSetValues v; public: /// Default constructor CountableSetRanges(void) {} /// Initialize with set \a d0 and bit-pattern \a cur0 CountableSetRanges(const Gecode::IntSet& d, int cur) : v(d, cur) { Gecode::Iter::Values::ToRanges::init(v); } /// Initialize with set \a d0 and bit-pattern \a cur0 void init(const Gecode::IntSet& d, int cur) { v.init(d, cur); Gecode::Iter::Values::ToRanges::init(v); } }; /// Iterate all subsets of a given set class CountableSet { private: /// The superset Gecode::IntSet d; /// Integer representing the current subset to iterate unsigned int cur; /// Endpoint of iteration unsigned int lubmax; public: /// Initialize with set \a s CountableSet(const Gecode::IntSet& s); /// Default constructor CountableSet(void) {} /// Initialize with set \a s void init(const Gecode::IntSet& s); /// Check if still subsets left bool operator()(void) const { return cur=0) && (i * * Copyright: * Guido Tack, 2005 * * Last modified: * $Date: 2011-08-24 16:34:16 +0200 (Wed, 24 Aug 2011) $ by $Author: tack $ * $Revision: 12346 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ namespace Test { namespace Set { inline std::string SetTest::str(int i) { std::stringstream s; s << i; return s.str(); } inline std::string SetTest::str(Gecode::SetRelType srt) { switch (srt) { case Gecode::SRT_EQ: return "Eq"; case Gecode::SRT_LQ: return "Lq"; case Gecode::SRT_LE: return "Le"; case Gecode::SRT_GQ: return "Gq"; case Gecode::SRT_GR: return "Gr"; case Gecode::SRT_NQ: return "Nq"; case Gecode::SRT_SUB: return "Sub"; case Gecode::SRT_SUP: return "Sup"; case Gecode::SRT_DISJ: return "Disj"; case Gecode::SRT_CMPL: return "Cmpl"; } return ""; } inline std::string SetTest::str(Gecode::SetOpType sot) { switch (sot) { case Gecode::SOT_UNION: return "Union"; case Gecode::SOT_DUNION: return "DUnion"; case Gecode::SOT_INTER: return "Inter"; case Gecode::SOT_MINUS: return "Minus"; } return ""; } inline std::string SetTest::str(const Gecode::IntArgs& x) { std::string s = ""; for (int i=0; i=0; } inline void SetRelTypes::operator++(void) { i--; } inline Gecode::SetRelType SetRelTypes::srt(void) const { return srts[i]; } inline SetOpTypes::SetOpTypes(void) : i(sizeof(sots)/sizeof(Gecode::SetOpType)-1) {} inline bool SetOpTypes::operator()(void) const { return i>=0; } inline void SetOpTypes::operator++(void) { i--; } inline Gecode::SetOpType SetOpTypes::sot(void) const { return sots[i]; } }} // STATISTICS: test-set gecode-4.2.1/test/test.cpp0000755000175000010010000002101011142304506014514 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * Mikael Lagerkvist * * Copyright: * Christian Schulte, 2004 * Mikael Lagerkvist, 2005 * * Last modified: * $Date: 2009-02-04 13:25:42 +0100 (Wed, 04 Feb 2009) $ by $Author: schulte $ * $Revision: 8138 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "test/test.hh" #ifdef GECODE_HAS_MTRACE #include #endif #include #include #include #include #include #include namespace Test { // Log stream std::ostringstream olog; /* * Base class for tests * */ Base::Base(const std::string& s) : _name(s), _next(_tests) { _tests = this; _n_tests++; } Base* Base::_tests = NULL; unsigned int Base::_n_tests = 0; /// Sort tests by name class SortByName { public: forceinline bool operator()(Base* x, Base* y) { return x->name() > y->name(); } }; void Base::sort(void) { Base** b = Gecode::heap.alloc(_n_tests); unsigned int i=0; for (Base* t = _tests; t != NULL; t = t->next()) b[i++] = t; SortByName sbn; Gecode::Support::quicksort(b,_n_tests,sbn); i=0; _tests = NULL; for ( ; i < _n_tests; i++) { b[i]->next(_tests); _tests = b[i]; } Gecode::heap.free(b,_n_tests); } Base::~Base(void) {} Gecode::Support::RandomGenerator Base::rand = Gecode::Support::RandomGenerator(); Options opt; void report_error(std::string name) { std::cout << "Options: -seed " << opt.seed; if (opt.fixprob != opt.deffixprob) std::cout << " -fixprob " << opt.fixprob; std::cout << " -test " << name << std::endl; if (opt.log) std::cout << olog.str(); } std::vector > testpat; const char* startFrom = NULL; bool list = false; void Options::parse(int argc, char* argv[]) { int i = 1; while (i < argc) { if (!strcmp(argv[i],"-help") || !strcmp(argv[i],"--help")) { std::cerr << "Options for testing:" << std::endl << "\t-seed (unsigned int or \"time\") default: " << seed << std::endl << "\t\tseed for random number generator (unsigned int)," << std::endl << "\t\tor \"time\" for a random seed based on " << "current time" << std::endl << "\t-fixprob (unsigned int) default: " << fixprob << std::endl << "\t\t1/fixprob is the probability of computing a fixpoint" << std::endl << "\t-iter (unsigned int) default: " <(time(NULL)); } else { seed = static_cast(atoi(argv[i])); } } else if (!strcmp(argv[i],"-iter")) { if (++i == argc) goto missing; iter = static_cast(atoi(argv[i])); } else if (!strcmp(argv[i],"-fixprob")) { if (++i == argc) goto missing; fixprob = static_cast(atoi(argv[i])); } else if (!strcmp(argv[i],"-test")) { if (++i == argc) goto missing; if (argv[i][0] == '-') testpat.push_back(std::make_pair(true, argv[i] + 1)); else testpat.push_back(std::make_pair(false, argv[i])); } else if (!strcmp(argv[i],"-start")) { if (++i == argc) goto missing; startFrom = argv[i]; } else if (!strcmp(argv[i],"-log")) { log = true; } else if (!strcmp(argv[i],"-stop")) { if (++i == argc) goto missing; if(argv[i][0] == 't') { stop = true; } else if (argv[i][0] == 'f') { stop = false; } } else if (!strcmp(argv[i],"-list")) { list = true; } i++; } return; missing: std::cerr << "Erroneous argument (" << argv[i-1] << ")" << std::endl << " missing parameter" << std::endl; exit(EXIT_FAILURE); } } int main(int argc, char* argv[]) { using namespace Test; #ifdef GECODE_HAS_MTRACE mtrace(); #endif opt.parse(argc, argv); Base::sort(); if (list) { for (Base* t = Base::tests() ; t != NULL; t = t->next() ) { std::cout << t->name() << std::endl; } exit(EXIT_SUCCESS); } Base::rand.seed(opt.seed); bool started = startFrom == NULL ? true : false; for (Base* t = Base::tests() ; t != NULL; t = t->next() ) { try { if (!started) { if (t->name().find(startFrom) != std::string::npos) started = true; else goto next; } if (testpat.size() != 0) { bool match_found = false; bool some_positive = false; for (unsigned int i = 0; i < testpat.size(); ++i) { if (testpat[i].first) { // Negative pattern if (t->name().find(testpat[i].second) != std::string::npos) goto next; } else { // Positive pattern some_positive = true; if (t->name().find(testpat[i].second) != std::string::npos) match_found = true; } } if (some_positive && !match_found) goto next; } std::cout << t->name() << " "; std::cout.flush(); for (unsigned int i = opt.iter; i--; ) { opt.seed = Base::rand.seed(); if (t->run()) { std::cout << '+'; std::cout.flush(); } else { std::cout << "-" << std::endl; report_error(t->name()); if (opt.stop) return 1; } } std::cout << std::endl; } catch (Gecode::Exception e) { std::cout << "Exception in \"Gecode::" << e.what() << "." << std::endl << "Stopping..." << std::endl; report_error(t->name()); if (opt.stop) return 1; } next:; } return 0; } std::ostream& operator<<(std::ostream& os, const Test::ind& i) { for (int j=i.l; j--; ) os << " "; return os; } // STATISTICS: test-core gecode-4.2.1/test/test.hh0000755000175000010010000001007611357330563014355 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Contributing authors: * Mikael Lagerkvist * * Copyright: * Christian Schulte, 2005 * Mikael Lagerkvist, 2005 * * Last modified: * $Date: 2010-04-08 12:35:31 +0200 (Thu, 08 Apr 2010) $ by $Author: schulte $ * $Revision: 10684 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef __GECODE_TEST_TEST_HH__ #define __GECODE_TEST_TEST_HH__ #include #include #include #include #include /// General test support namespace Test { /** * \defgroup TaskTestTest General test support * * \ingroup TaskTest */ //@{ /** * \brief Stream used for logging * * The olog is buffered and printed only if an error has * occured. */ extern std::ostringstream olog; /// Simple class for describing identation class ind { public: /// Which indentation level int l; /// Indent by level \a i ind(int i) : l(i) {} }; /// Commandline options class Options { public: /// The random seed to be used unsigned int seed; /// Number of iterations for each test unsigned int iter; /// Default number of iterations static const int defiter = 5; /// The probability for computing a fixpoint unsigned int fixprob; /// Default fixpoint probaibility static const unsigned int deffixprob = 10; /// Whether to stop on an error bool stop; /// Whether to log the tests bool log; /// Initialize options with defaults Options(void); /// Parse commandline arguments void parse(int argc, char* argv[]); }; /// The options extern Options opt; /// %Base class for all tests to be run class Base { private: /// Name of the test std::string _name; /// Next test Base* _next; /// All tests static Base* _tests; /// How many tests static unsigned int _n_tests; public: /// Create and register test with name \a s Base(const std::string& s); /// Sort tests alphabetically static void sort(void); /// Return name of test const std::string& name(void) const; /// Return all tests static Base* tests(void); /// Return next test Base* next(void) const; /// Set next test void next(Base* n); /// Run test virtual bool run(void) = 0; /// Throw a coin whether to compute a fixpoint static bool fixpoint(void); /// Destructor virtual ~Base(void); /// Random number generator static Gecode::Support::RandomGenerator rand; }; //@} } /** * \brief Main function * \relates Test::Base */ int main(int argc, char* argv[]); /** * \brief Print indentation * \relates Test::ind */ std::ostream& operator<<(std::ostream& os, const Test::ind& i); #include "test/test.hpp" #endif // STATISTICS: test-core gecode-4.2.1/test/test.hpp0000755000175000010010000000407511142304506014535 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2007 * * Last modified: * $Date: 2009-02-04 13:25:42 +0100 (Wed, 04 Feb 2009) $ by $Author: schulte $ * $Revision: 8138 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ namespace Test { /* * Commandline options * */ inline Options::Options(void) : seed(0), iter(defiter), fixprob(deffixprob), stop(true), log(false) {} /* * Base class for tests * */ inline const std::string& Base::name(void) const { return _name; } inline Base* Base::tests(void) { return _tests; } inline Base* Base::next(void) const { return _next; } inline void Base::next(Base* n) { _next=n; } inline bool Base::fixpoint(void) { return rand(opt.fixprob) == 0; } } // STATISTICS: test-core gecode-4.2.1/tools/0000755000175000010010000000000012236131711013216 5ustar schulteNonegecode-4.2.1/tools/flatzinc/0000755000175000010010000000000012236131711015030 5ustar schulteNonegecode-4.2.1/tools/flatzinc/fzn-gecode.cpp0000644000175000010010000000542112116254732017565 0ustar schulteNone/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: * Guido Tack * * Copyright: * Guido Tack, 2007 * * Last modified: * $Date: 2013-03-08 04:24:10 +0100 (Fri, 08 Mar 2013) $ by $Author: tack $ * $Revision: 13479 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include using namespace std; using namespace Gecode; int main(int argc, char** argv) { Support::Timer t_total; t_total.start(); FlatZinc::FlatZincOptions opt("Gecode/FlatZinc"); opt.parse(argc, argv); if (argc!=2) { cerr << "Usage: " << argv[0] << " [options] " << endl; cerr << " " << argv[0] << " -help for more information" << endl; exit(EXIT_FAILURE); } const char* filename = argv[1]; opt.name(filename); FlatZinc::Printer p; FlatZinc::FlatZincSpace* fg = NULL; if (!strcmp(filename, "-")) { fg = FlatZinc::parse(cin, p); } else { fg = FlatZinc::parse(filename, p); } if (fg) { fg->createBranchers(fg->solveAnnotations(), opt.seed(), opt.decay(), false, std::cerr); fg->shrinkArrays(p); if (opt.output()) { std::ofstream os(opt.output()); if (!os.good()) { std::cerr << "Could not open file " << opt.output() << " for output." << std::endl; exit(EXIT_FAILURE); } fg->run(os, p, opt, t_total); os.close(); } else { fg->run(std::cout, p, opt, t_total); } } else { exit(EXIT_FAILURE); } delete fg; return 0; } // STATISTICS: flatzinc-any gecode-4.2.1/tools/flatzinc/mzn-gecode.bat.in0000644000175000010010000000303412116254732020163 0ustar schulteNone@echo off rem rem Main authors: rem Guido Tack rem rem Copyright: rem Guido Tack, 2012 rem rem Last modified: rem $Date: 2013-03-08 04:24:10 +0100 (Fri, 08 Mar 2013) $ by $Author: tack $ rem $Revision: 13479 $ rem rem This file is part of Gecode, the generic constraint rem development environment: rem http://www.gecode.org rem rem Permission is hereby granted, free of charge, to any person obtaining rem a copy of this software and associated documentation files (the rem "Software"), to deal in the Software without restriction, including rem without limitation the rights to use, copy, modify, merge, publish, rem distribute, sublicense, and/or sell copies of the Software, and to rem permit persons to whom the Software is furnished to do so, subject to rem the following conditions: rem rem The above copyright notice and this permission notice shall be rem included in all copies or substantial portions of the Software. rem rem THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, rem EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF rem MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND rem NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE rem LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION rem OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION rem WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rem rem setlocal set FLATZINC_CMD=fzn-gecode minizinc -I "%GECODEDIR%\mznlib" %* gecode-4.2.1/tools/flatzinc/mzn-gecode.in0000755000175000010010000000277012116254732017427 0ustar schulteNone#!/bin/sh # # Main authors: # Guido Tack # # Copyright: # Guido Tack, 2012 # # Last modified: # $Date: 2013-03-08 04:24:10 +0100 (Fri, 08 Mar 2013) $ by $Author: tack $ # $Revision: 13479 $ # # This file is part of Gecode, the generic constraint # development environment: # http://www.gecode.org # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # prefix=@prefix@ datarootdir=@datarootdir@ FLATZINC_CMD=fzn-gecode minizinc -I @datadir@/gecode/mznlib "$@"